From f753e951784b1dbac33087e8d1510565c6588aa6 Mon Sep 17 00:00:00 2001 From: jendave Date: Sun, 7 Aug 2011 06:51:32 +0000 Subject: [PATCH] upload --- .classpath | 24 +- .gitattributes | 8640 +-------------- .project | 40 +- .settings/org.eclipse.jdt.core.prefs | 9 +- CHANGES.txt | 515 +- README.txt | 14 +- build.xml | 71 - build/forge.jardesc | 16 - build/forge.xml | 23 - build/manifest.forge | 3 - pom.xml | 708 +- res/PerSetTracking.py | 19 +- res/blockdata/blocks.txt | 2 +- res/blockdata/setdata.txt | 8 +- res/cardsfolder/abandoned_outpost.txt | 15 - res/cardsfolder/abbey_gargoyles.txt | 12 - res/cardsfolder/abbey_matron.txt | 11 - res/cardsfolder/abduction.txt | 15 - res/cardsfolder/abjure.txt | 10 - res/cardsfolder/abolish.txt | 10 - res/cardsfolder/abomination.txt | 16 - res/cardsfolder/aboshan_cephalid_emperor.txt | 11 - res/cardsfolder/aboshans_desire.txt | 11 - res/cardsfolder/about_face.txt | 10 - res/cardsfolder/absolute_grace.txt | 10 - res/cardsfolder/absolute_law.txt | 10 - res/cardsfolder/absorb.txt | 10 - res/cardsfolder/absorb_vis.txt | 11 - res/cardsfolder/abuna_acolyte.txt | 11 - res/cardsfolder/abyssal_gatekeeper.txt | 11 - res/cardsfolder/abyssal_horror.txt | 14 - res/cardsfolder/abyssal_hunter.txt | 13 - res/cardsfolder/abyssal_nightstalker.txt | 11 - res/cardsfolder/abyssal_nocturnus.txt | 11 - res/cardsfolder/abyssal_persecutor.txt | 14 - res/cardsfolder/abyssal_specter.txt | 16 - res/cardsfolder/academy_rector.txt | 10 - res/cardsfolder/academy_ruins.txt | 10 - res/cardsfolder/accelerate.txt | 10 - res/cardsfolder/accelerated_mutation.txt | 10 - res/cardsfolder/acceptable_losses.txt | 9 - res/cardsfolder/accorder_paladin.txt | 11 - res/cardsfolder/accorders_shield.txt | 9 - res/cardsfolder/accumulated_knowledge.txt | 11 - res/cardsfolder/accursed_centaur.txt | 12 - res/cardsfolder/acid_rain.txt | 10 - res/cardsfolder/acid_web_spider.txt | 12 - res/cardsfolder/acidic_slime.txt | 13 - res/cardsfolder/acidic_sliver.txt | 12 - res/cardsfolder/acidic_soil.txt | 13 - res/cardsfolder/acolyte_of_xathrid.txt | 10 - res/cardsfolder/acorn_harvest.txt | 10 - res/cardsfolder/acquire.txt | 9 - res/cardsfolder/acridian.txt | 10 - res/cardsfolder/act_of_aggression.txt | 9 - res/cardsfolder/act_of_treason.txt | 10 - res/cardsfolder/active_volcano.txt | 12 - res/cardsfolder/adamaro_first_to_desire.txt | 10 - res/cardsfolder/adarkar_sentinel.txt | 10 - res/cardsfolder/adarkar_valkyrie.txt | 11 - res/cardsfolder/adarkar_wastes.txt | 18 - res/cardsfolder/adarkar_windform.txt | 12 - res/cardsfolder/adder_staff_boggart.txt | 12 - res/cardsfolder/admonition_angel.txt | 17 - res/cardsfolder/adun_oakenshield.txt | 10 - res/cardsfolder/advance_scout.txt | 11 - res/cardsfolder/advanced_hoverguard.txt | 11 - res/cardsfolder/adventuring_gear.txt | 12 - res/cardsfolder/aegis_of_the_meek.txt | 9 - res/cardsfolder/aeolipile.txt | 9 - res/cardsfolder/aerathi_berserker.txt | 10 - res/cardsfolder/aerie_mystics.txt | 11 - res/cardsfolder/aerie_ouphes.txt | 12 - res/cardsfolder/aesthir_glider.txt | 11 - res/cardsfolder/aether_adept.txt | 11 - res/cardsfolder/aether_burst.txt | 10 - res/cardsfolder/aether_charge.txt | 11 - res/cardsfolder/aether_figment.txt | 12 - res/cardsfolder/aether_flash.txt | 12 - res/cardsfolder/aether_membrane.txt | 14 - res/cardsfolder/aether_mutation.txt | 12 - res/cardsfolder/aether_shockwave.txt | 11 - res/cardsfolder/aether_spellbomb.txt | 10 - res/cardsfolder/aether_sting.txt | 10 - res/cardsfolder/aether_tradewinds.txt | 11 - res/cardsfolder/aether_vial.txt | 12 - res/cardsfolder/aether_web.txt | 11 - res/cardsfolder/aetherflame_wall.txt | 12 - res/cardsfolder/aethermages_touch.txt | 10 - res/cardsfolder/aethersnipe.txt | 14 - res/cardsfolder/affa_guard_hound.txt | 13 - res/cardsfolder/afflict.txt | 11 - res/cardsfolder/afterlife.txt | 11 - res/cardsfolder/aftershock.txt | 10 - res/cardsfolder/agadeem_occultist.txt | 13 - res/cardsfolder/ageless_entity.txt | 12 - res/cardsfolder/agent_of_masks.txt | 12 - res/cardsfolder/agent_of_shauku.txt | 11 - res/cardsfolder/agent_of_stromgald.txt | 11 - res/cardsfolder/aggressive_urge.txt | 11 - res/cardsfolder/agility.txt | 10 - res/cardsfolder/agonizing_demise.txt | 12 - res/cardsfolder/agony_warp.txt | 10 - res/cardsfolder/agrus_kos_wojek_veteran.txt | 12 - res/cardsfolder/air_bladder.txt | 10 - res/cardsfolder/air_elemental.txt | 23 - res/cardsfolder/air_servant.txt | 11 - res/cardsfolder/airborne_aid.txt | 11 - res/cardsfolder/airdrop_condor.txt | 13 - res/cardsfolder/ajani_goldmane.txt | 11 - res/cardsfolder/ajani_vengeant.txt | 13 - res/cardsfolder/ajanis_mantra.txt | 10 - res/cardsfolder/ajanis_pridemate.txt | 11 - res/cardsfolder/akki_avalanchers.txt | 11 - res/cardsfolder/akki_blizzard_herder.txt | 11 - res/cardsfolder/akki_coalflinger.txt | 11 - res/cardsfolder/akki_drillmaster.txt | 10 - res/cardsfolder/akki_raider.txt | 11 - res/cardsfolder/akki_rockspeaker.txt | 11 - res/cardsfolder/akki_underling.txt | 10 - res/cardsfolder/akki_underminer.txt | 11 - res/cardsfolder/akoum_battlesinger.txt | 15 - res/cardsfolder/akoum_boulderfoot.txt | 11 - res/cardsfolder/akoum_refuge.txt | 13 - res/cardsfolder/akrasan_squire.txt | 10 - res/cardsfolder/akroma_angel_of_fury.txt | 16 - res/cardsfolder/akroma_angel_of_wrath.txt | 17 - res/cardsfolder/akromas_devoted.txt | 10 - res/cardsfolder/akromas_memorial.txt | 10 - res/cardsfolder/akromas_vengeance.txt | 10 - res/cardsfolder/aku_djinn.txt | 12 - res/cardsfolder/akuta_born_of_ash.txt | 13 - res/cardsfolder/alabaster_dragon.txt | 12 - res/cardsfolder/alabaster_leech.txt | 10 - res/cardsfolder/alabaster_wall.txt | 11 - res/cardsfolder/alaborn_cavalier.txt | 11 - res/cardsfolder/alaborn_grenadier.txt | 10 - res/cardsfolder/alaborn_musketeer.txt | 10 - res/cardsfolder/alaborn_trooper.txt | 9 - res/cardsfolder/alaborn_veteran.txt | 10 - res/cardsfolder/alaborn_zealot.txt | 12 - res/cardsfolder/aladdin.txt | 10 - res/cardsfolder/aladdins_ring.txt | 16 - res/cardsfolder/alarum.txt | 10 - res/cardsfolder/albino_troll.txt | 11 - res/cardsfolder/alert_shu_infantry.txt | 10 - res/cardsfolder/alexi_zephyr_mage.txt | 14 - res/cardsfolder/alexis_cloak.txt | 11 - res/cardsfolder/algae_gharial.txt | 12 - res/cardsfolder/ali_baba.txt | 11 - res/cardsfolder/ali_from_cairo.txt | 10 - res/cardsfolder/alibans_tower.txt | 9 - res/cardsfolder/all_hallows_eve.txt | 15 - res/cardsfolder/all_is_dust.txt | 8 - res/cardsfolder/all_suns_dawn.txt | 15 - res/cardsfolder/allay.txt | 10 - res/cardsfolder/alley_grifters.txt | 11 - res/cardsfolder/allied_strategies.txt | 11 - res/cardsfolder/allosaurus_rider.txt | 11 - res/cardsfolder/alloy_myr.txt | 14 - res/cardsfolder/alluring_scent.txt | 12 - res/cardsfolder/alluring_siren.txt | 12 - res/cardsfolder/alpha_kavu.txt | 11 - res/cardsfolder/alpha_myr.txt | 9 - res/cardsfolder/alpha_tyrranax.txt | 9 - res/cardsfolder/altar_golem.txt | 15 - res/cardsfolder/altar_of_bone.txt | 10 - res/cardsfolder/altar_of_dementia.txt | 10 - res/cardsfolder/altar_of_shadows.txt | 14 - res/cardsfolder/altars_light.txt | 9 - res/cardsfolder/aluren.txt | 9 - res/cardsfolder/ambassador_laquatus.txt | 11 - res/cardsfolder/ambassador_oak.txt | 11 - res/cardsfolder/ambitions_cost.txt | 10 - res/cardsfolder/ambush.txt | 11 - res/cardsfolder/ambush_commander.txt | 11 - res/cardsfolder/ambush_party.txt | 12 - res/cardsfolder/amnesia.txt | 9 - res/cardsfolder/amok.txt | 10 - res/cardsfolder/amphibious_kavu.txt | 12 - res/cardsfolder/amrou_kithkin.txt | 11 - res/cardsfolder/amrou_scout.txt | 11 - res/cardsfolder/amrou_seekers.txt | 10 - res/cardsfolder/amugaba.txt | 11 - res/cardsfolder/amulet_of_kroog.txt | 11 - res/cardsfolder/amulet_of_unmaking.txt | 9 - res/cardsfolder/amulet_of_vigor.txt | 10 - res/cardsfolder/an_havva_constable.txt | 11 - res/cardsfolder/an_havva_inn.txt | 10 - res/cardsfolder/an_havva_township.txt | 13 - res/cardsfolder/an_zerrin_ruins.txt | 8 - res/cardsfolder/ana_disciple.txt | 11 - res/cardsfolder/anaba_ancestor.txt | 11 - res/cardsfolder/anaba_bodyguard.txt | 12 - res/cardsfolder/anaba_shaman.txt | 13 - res/cardsfolder/anaba_spirit_crafter.txt | 10 - res/cardsfolder/anaconda.txt | 13 - res/cardsfolder/anarchist.txt | 13 - res/cardsfolder/anarchy.txt | 10 - res/cardsfolder/ancestors_chosen.txt | 14 - res/cardsfolder/ancestors_prophet.txt | 11 - res/cardsfolder/ancestral_mask.txt | 14 - res/cardsfolder/ancestral_memories.txt | 13 - res/cardsfolder/ancestral_recall.txt | 11 - res/cardsfolder/ancestral_tribute.txt | 11 - res/cardsfolder/ancestral_vision.txt | 12 - res/cardsfolder/ancient_amphitheater.txt | 10 - res/cardsfolder/ancient_craving.txt | 10 - res/cardsfolder/ancient_den.txt | 9 - res/cardsfolder/ancient_grudge.txt | 10 - res/cardsfolder/ancient_hellkite.txt | 10 - res/cardsfolder/ancient_hydra.txt | 11 - res/cardsfolder/ancient_runes.txt | 15 - res/cardsfolder/ancient_silverback.txt | 12 - res/cardsfolder/ancient_spider.txt | 11 - res/cardsfolder/ancient_spring.txt | 12 - res/cardsfolder/ancient_stirrings.txt | 10 - res/cardsfolder/ancient_tomb.txt | 11 - res/cardsfolder/andradite_leech.txt | 11 - res/cardsfolder/angel_of_despair.txt | 12 - res/cardsfolder/angel_of_fury.txt | 11 - res/cardsfolder/angel_of_light.txt | 11 - res/cardsfolder/angel_of_mercy.txt | 17 - res/cardsfolder/angel_of_retribution.txt | 11 - res/cardsfolder/angelfire_crusader.txt | 10 - res/cardsfolder/angelheart_vial.txt | 13 - res/cardsfolder/angelic_benediction.txt | 11 - res/cardsfolder/angelic_blessing.txt | 14 - res/cardsfolder/angelic_chorus.txt | 12 - res/cardsfolder/angelic_curator.txt | 11 - res/cardsfolder/angelic_favor.txt | 11 - res/cardsfolder/angelic_page.txt | 13 - res/cardsfolder/angelic_protector.txt | 12 - res/cardsfolder/angelic_renewal.txt | 11 - res/cardsfolder/angelic_shield.txt | 10 - res/cardsfolder/angelic_voices.txt | 10 - res/cardsfolder/angelic_wall.txt | 13 - res/cardsfolder/angels_feather.txt | 15 - res/cardsfolder/angels_grace.txt | 14 - res/cardsfolder/angels_mercy.txt | 9 - res/cardsfolder/angelsong.txt | 10 - res/cardsfolder/anger.txt | 10 - res/cardsfolder/angry_mob.txt | 15 - res/cardsfolder/angus_mackenzie.txt | 10 - res/cardsfolder/animal_boneyard.txt | 12 - res/cardsfolder/animate_artifact.txt | 14 - res/cardsfolder/animate_dead.txt | 14 - res/cardsfolder/animate_land.txt | 10 - res/cardsfolder/animate_wall.txt | 17 - res/cardsfolder/ankh_of_mishra.txt | 17 - res/cardsfolder/annihilate.txt | 10 - res/cardsfolder/annul.txt | 10 - res/cardsfolder/anodet_lurker.txt | 11 - res/cardsfolder/anoint.txt | 10 - res/cardsfolder/anowon_the_ruin_sage.txt | 12 - res/cardsfolder/ant_queen.txt | 10 - res/cardsfolder/anthroplasm.txt | 15 - res/cardsfolder/antler_skulkin.txt | 10 - res/cardsfolder/anurid_barkripper.txt | 10 - res/cardsfolder/anurid_brushhopper.txt | 10 - res/cardsfolder/anurid_murkdiver.txt | 10 - res/cardsfolder/anvil_of_bogardan.txt | 13 - res/cardsfolder/apes_of_rath.txt | 11 - res/cardsfolder/apex_hawks.txt | 11 - res/cardsfolder/aphetto_alchemist.txt | 12 - res/cardsfolder/aphetto_exterminator.txt | 12 - res/cardsfolder/aphetto_grifter.txt | 11 - res/cardsfolder/aphetto_runecaster.txt | 11 - res/cardsfolder/aphetto_vulture.txt | 12 - res/cardsfolder/aphotic_wisps.txt | 11 - res/cardsfolder/apocalypse.txt | 11 - res/cardsfolder/apocalypse_hydra.txt | 12 - res/cardsfolder/apostles_blessing.txt | 15 - res/cardsfolder/apothecary_initiate.txt | 11 - res/cardsfolder/apprentice_necromancer.txt | 12 - res/cardsfolder/apprentice_sorcerer.txt | 10 - res/cardsfolder/apprentice_wizard.txt | 12 - res/cardsfolder/aquamoeba.txt | 11 - res/cardsfolder/aquitects_will.txt | 14 - res/cardsfolder/araba_mothrider.txt | 11 - res/cardsfolder/arachnoid.txt | 10 - res/cardsfolder/arashi_the_sky_asunder.txt | 13 - res/cardsfolder/arbiter_of_knollridge.txt | 13 - res/cardsfolder/arbor_elf.txt | 11 - res/cardsfolder/arc_blade.txt | 12 - res/cardsfolder/arc_lightning.txt | 11 - res/cardsfolder/arc_mage.txt | 11 - res/cardsfolder/arc_runner.txt | 11 - res/cardsfolder/arc_slogger.txt | 10 - res/cardsfolder/arc_trail.txt | 10 - res/cardsfolder/arcades_sabboth.txt | 13 - res/cardsfolder/arcane_sanctum.txt | 12 - res/cardsfolder/arcane_spyglass.txt | 12 - res/cardsfolder/arcane_teachings.txt | 12 - res/cardsfolder/arcanis_the_omnipotent.txt | 12 - res/cardsfolder/arcbound_bruiser.txt | 10 - res/cardsfolder/arcbound_crusher.txt | 14 - res/cardsfolder/arcbound_hybrid.txt | 11 - res/cardsfolder/arcbound_lancer.txt | 11 - res/cardsfolder/arcbound_overseer.txt | 12 - res/cardsfolder/arcbound_ravager.txt | 11 - res/cardsfolder/arcbound_reclaimer.txt | 12 - res/cardsfolder/arcbound_slith.txt | 12 - res/cardsfolder/arcbound_stinger.txt | 11 - res/cardsfolder/arcbound_wanderer.txt | 12 - res/cardsfolder/arcbound_worker.txt | 10 - res/cardsfolder/archaeological_dig.txt | 14 - res/cardsfolder/archangel.txt | 15 - res/cardsfolder/archdemon_of_unx.txt | 15 - res/cardsfolder/architects_of_will.txt | 13 - res/cardsfolder/archivist.txt | 12 - res/cardsfolder/archon_of_justice.txt | 12 - res/cardsfolder/archon_of_redemption.txt | 13 - res/cardsfolder/arctic_flats.txt | 11 - res/cardsfolder/arctic_foxes.txt | 10 - res/cardsfolder/arctic_nishoba.txt | 11 - res/cardsfolder/arctic_wolves.txt | 12 - res/cardsfolder/arcums_sleigh.txt | 11 - res/cardsfolder/ardent_militia.txt | 15 - res/cardsfolder/ardent_plea.txt | 10 - res/cardsfolder/ardent_recruit.txt | 11 - res/cardsfolder/ardent_soldier.txt | 12 - res/cardsfolder/arena_of_the_ancients.txt | 12 - res/cardsfolder/arensons_aura.txt | 12 - res/cardsfolder/argent_mutation.txt | 11 - res/cardsfolder/argentum_armor.txt | 11 - res/cardsfolder/argivian_archaeologist.txt | 10 - res/cardsfolder/argivian_blacksmith.txt | 10 - res/cardsfolder/argivian_find.txt | 9 - res/cardsfolder/argivian_restoration.txt | 9 - res/cardsfolder/argothian_elder.txt | 11 - res/cardsfolder/argothian_enchantress.txt | 12 - res/cardsfolder/argothian_pixies.txt | 11 - res/cardsfolder/argothian_swine.txt | 10 - res/cardsfolder/argothian_treefolk.txt | 10 - res/cardsfolder/arid_mesa.txt | 9 - res/cardsfolder/ark_of_blight.txt | 9 - res/cardsfolder/armadillo_cloak.txt | 13 - res/cardsfolder/armageddon.txt | 18 - res/cardsfolder/armageddon_clock.txt | 16 - res/cardsfolder/armament_master.txt | 12 - res/cardsfolder/armed_response.txt | 11 - res/cardsfolder/armillary_sphere.txt | 9 - res/cardsfolder/armistice.txt | 10 - res/cardsfolder/armor_of_faith.txt | 12 - res/cardsfolder/armor_sliver.txt | 13 - res/cardsfolder/armor_thrull.txt | 11 - res/cardsfolder/armored_ascension.txt | 15 - res/cardsfolder/armored_cancrix.txt | 9 - res/cardsfolder/armored_galleon.txt | 10 - res/cardsfolder/armored_griffin.txt | 11 - res/cardsfolder/armored_guardian.txt | 15 - res/cardsfolder/armored_pegasus.txt | 11 - res/cardsfolder/armorer_guildmage.txt | 11 - res/cardsfolder/arms_dealer.txt | 10 - res/cardsfolder/army_ants.txt | 10 - res/cardsfolder/army_of_allah.txt | 9 - res/cardsfolder/arnjlots_ascent.txt | 11 - res/cardsfolder/arrest.txt | 12 - res/cardsfolder/arrogant_bloodlord.txt | 13 - res/cardsfolder/arrogant_vampire.txt | 10 - res/cardsfolder/arrogant_wurm.txt | 11 - res/cardsfolder/arrow_volley_trap.txt | 15 - res/cardsfolder/artifact_blast.txt | 9 - res/cardsfolder/artifact_mutation.txt | 12 - res/cardsfolder/artifact_ward.txt | 10 - res/cardsfolder/artificers_intuition.txt | 10 - res/cardsfolder/artillerize.txt | 10 - res/cardsfolder/artisan_of_kozilek.txt | 12 - res/cardsfolder/ascendant_evincar.txt | 14 - res/cardsfolder/ascending_aven.txt | 12 - res/cardsfolder/asceticism.txt | 10 - res/cardsfolder/ashas_favor.txt | 10 - res/cardsfolder/ashcoat_bear.txt | 10 - res/cardsfolder/ashen_firebeast.txt | 10 - res/cardsfolder/ashen_monstrosity.txt | 11 - res/cardsfolder/ashen_powder.txt | 10 - res/cardsfolder/ashen_skin_zubera.txt | 12 - res/cardsfolder/ashenmoor_cohort.txt | 11 - res/cardsfolder/ashenmoor_gouger.txt | 10 - res/cardsfolder/ashenmoor_liege.txt | 14 - res/cardsfolder/ashes_to_ashes.txt | 13 - res/cardsfolder/ashnods_altar.txt | 12 - res/cardsfolder/ashnods_transmogrant.txt | 11 - res/cardsfolder/asmira_holy_avenger.txt | 13 - res/cardsfolder/aspect_of_mongoose.txt | 12 - res/cardsfolder/aspect_of_wolf.txt | 17 - res/cardsfolder/assassinate.txt | 12 - res/cardsfolder/assassins_blade.txt | 9 - res/cardsfolder/assault_griffin.txt | 10 - res/cardsfolder/assault_strobe.txt | 9 - res/cardsfolder/assault_zeppelid.txt | 11 - res/cardsfolder/assembly_worker.txt | 10 - res/cardsfolder/assert_authority.txt | 10 - res/cardsfolder/astral_slide.txt | 13 - res/cardsfolder/astral_steel.txt | 10 - res/cardsfolder/astrolabe.txt | 15 - res/cardsfolder/atog.txt | 13 - res/cardsfolder/atogatog.txt | 11 - res/cardsfolder/attrition.txt | 9 - res/cardsfolder/attunement.txt | 11 - res/cardsfolder/augur_il_vec.txt | 11 - res/cardsfolder/augur_of_skulls.txt | 11 - res/cardsfolder/augury_adept.txt | 9 - res/cardsfolder/augury_owl.txt | 12 - res/cardsfolder/aunties_hovel.txt | 10 - res/cardsfolder/aura_blast.txt | 10 - res/cardsfolder/aura_extraction.txt | 10 - res/cardsfolder/aura_flux.txt | 10 - res/cardsfolder/aura_fracture.txt | 9 - res/cardsfolder/aura_gnarlid.txt | 13 - res/cardsfolder/aura_mutation.txt | 12 - res/cardsfolder/aura_of_dominion.txt | 11 - res/cardsfolder/aura_of_silence.txt | 11 - res/cardsfolder/aura_shards.txt | 11 - res/cardsfolder/auramancer.txt | 11 - res/cardsfolder/auratog.txt | 11 - res/cardsfolder/auriok_bladewarden.txt | 11 - res/cardsfolder/auriok_champion.txt | 13 - res/cardsfolder/auriok_edgewright.txt | 11 - res/cardsfolder/auriok_glaivemaster.txt | 11 - res/cardsfolder/auriok_salvagers.txt | 10 - res/cardsfolder/auriok_sunchaser.txt | 11 - res/cardsfolder/auriok_transfixer.txt | 11 - res/cardsfolder/aurochs.txt | 14 - res/cardsfolder/aurochs_herd.txt | 15 - res/cardsfolder/aurora_eidolon.txt | 13 - res/cardsfolder/aurora_griffin.txt | 12 - res/cardsfolder/auspicious_ancestor.txt | 13 - res/cardsfolder/austere_command.txt | 9 - res/cardsfolder/avalanche.txt | 14 - res/cardsfolder/avalanche_riders.txt | 14 - res/cardsfolder/avarax.txt | 13 - res/cardsfolder/avatar_of_fury.txt | 11 - res/cardsfolder/avatar_of_might.txt | 11 - res/cardsfolder/avatar_of_will.txt | 10 - res/cardsfolder/avatar_of_woe.txt | 12 - res/cardsfolder/aven_archer.txt | 11 - res/cardsfolder/aven_augur.txt | 11 - res/cardsfolder/aven_brigadier.txt | 13 - res/cardsfolder/aven_cloudchaser.txt | 15 - res/cardsfolder/aven_envoy.txt | 10 - res/cardsfolder/aven_farseer.txt | 12 - res/cardsfolder/aven_fateshaper.txt | 13 - res/cardsfolder/aven_fisher.txt | 16 - res/cardsfolder/aven_flock.txt | 13 - res/cardsfolder/aven_fogbringer.txt | 12 - res/cardsfolder/aven_redeemer.txt | 11 - res/cardsfolder/aven_riftwatcher.txt | 14 - res/cardsfolder/aven_smokeweaver.txt | 11 - res/cardsfolder/aven_squire.txt | 11 - res/cardsfolder/aven_trailblazer.txt | 13 - res/cardsfolder/aven_trooper.txt | 11 - res/cardsfolder/avenger_en_dal.txt | 13 - res/cardsfolder/avenger_of_zendikar.txt | 15 - res/cardsfolder/avenging_angel.txt | 12 - res/cardsfolder/avian_changeling.txt | 11 - res/cardsfolder/avoid_fate.txt | 10 - res/cardsfolder/awakener_druid.txt | 10 - res/cardsfolder/awakening.txt | 11 - res/cardsfolder/awakening_zone.txt | 11 - res/cardsfolder/axegrinder_giant.txt | 9 - res/cardsfolder/axelrod_gunnarson.txt | 13 - res/cardsfolder/aysen_abbey.txt | 13 - res/cardsfolder/aysen_bureaucrats.txt | 11 - res/cardsfolder/aysen_crusader.txt | 10 - res/cardsfolder/aysen_highway.txt | 10 - res/cardsfolder/ayumi_the_last_visitor.txt | 10 - res/cardsfolder/azami_lady_of_scrolls.txt | 11 - res/cardsfolder/azimaet_drake.txt | 11 - res/cardsfolder/azorius_aethermage.txt | 13 - res/cardsfolder/azorius_chancery.txt | 13 - res/cardsfolder/azorius_first_wing.txt | 11 - res/cardsfolder/azorius_guildmage.txt | 11 - res/cardsfolder/azorius_ploy.txt | 11 - res/cardsfolder/azorius_signet.txt | 10 - res/cardsfolder/azure_drake.txt | 13 - res/cardsfolder/azusa_lost_but_seeking.txt | 9 - res/cardsfolder/back_to_basics.txt | 10 - res/cardsfolder/back_to_nature.txt | 9 - res/cardsfolder/backfire.txt | 10 - res/cardsfolder/backlash.txt | 11 - res/cardsfolder/bad_moon.txt | 16 - res/cardsfolder/bad_river.txt | 10 - res/cardsfolder/badlands.txt | 11 - res/cardsfolder/baku_altar.txt | 12 - res/cardsfolder/bala_ged_scorpion.txt | 11 - res/cardsfolder/balance.txt | 12 - res/cardsfolder/balduvian_barbarians.txt | 13 - res/cardsfolder/balduvian_bears.txt | 9 - res/cardsfolder/balduvian_conjurer.txt | 12 - res/cardsfolder/balduvian_dead.txt | 10 - res/cardsfolder/balduvian_frostwaker.txt | 11 - res/cardsfolder/balduvian_horde.txt | 10 - res/cardsfolder/balduvian_rage.txt | 12 - res/cardsfolder/balduvian_trading_post.txt | 11 - res/cardsfolder/balduvian_war_makers.txt | 11 - res/cardsfolder/balefire_liege.txt | 17 - res/cardsfolder/baleful_stare.txt | 15 - res/cardsfolder/ball_lightning.txt | 16 - res/cardsfolder/ballista_squad.txt | 14 - res/cardsfolder/balloon_peddler.txt | 10 - res/cardsfolder/ballynock_cohort.txt | 12 - res/cardsfolder/ballynock_trapper.txt | 12 - res/cardsfolder/ballyrush_banneret.txt | 10 - res/cardsfolder/baloth_woodcrasher.txt | 12 - res/cardsfolder/balshan_collaborator.txt | 11 - res/cardsfolder/balshan_griffin.txt | 12 - res/cardsfolder/balthor_the_defiled.txt | 12 - res/cardsfolder/balthor_the_stout.txt | 11 - res/cardsfolder/bandage.txt | 11 - res/cardsfolder/bane_of_the_living.txt | 14 - res/cardsfolder/baneslayer_angel.txt | 15 - res/cardsfolder/banishing_knack.txt | 9 - res/cardsfolder/banishment_decree.txt | 9 - res/cardsfolder/banshee.txt | 10 - res/cardsfolder/banshees_blade.txt | 13 - res/cardsfolder/bant_battlemage.txt | 11 - res/cardsfolder/bant_charm.txt | 12 - res/cardsfolder/bant_panorama.txt | 10 - res/cardsfolder/bant_sojourners.txt | 13 - res/cardsfolder/bant_sureblade.txt | 11 - res/cardsfolder/barbarian_general.txt | 10 - res/cardsfolder/barbarian_horde.txt | 9 - res/cardsfolder/barbarian_lunatic.txt | 10 - res/cardsfolder/barbarian_outcast.txt | 12 - res/cardsfolder/barbarian_riftcutter.txt | 10 - res/cardsfolder/barbarian_ring.txt | 12 - res/cardsfolder/barbary_apes.txt | 9 - res/cardsfolder/barbed_battlegear.txt | 9 - res/cardsfolder/barbed_field.txt | 11 - res/cardsfolder/barbed_lightning.txt | 13 - res/cardsfolder/barbed_sextant.txt | 16 - res/cardsfolder/barbed_sliver.txt | 13 - res/cardsfolder/barbtooth_wurm.txt | 10 - res/cardsfolder/bargain.txt | 11 - res/cardsfolder/bargaining_table.txt | 11 - res/cardsfolder/barishi.txt | 12 - res/cardsfolder/barkhide_mauler.txt | 10 - res/cardsfolder/barktooth_warbeard.txt | 9 - res/cardsfolder/barls_cage.txt | 9 - res/cardsfolder/baron_sengir.txt | 12 - res/cardsfolder/barony_vampire.txt | 9 - res/cardsfolder/barrage_ogre.txt | 11 - res/cardsfolder/barren_glory.txt | 9 - res/cardsfolder/barren_moor.txt | 12 - res/cardsfolder/barrenton_cragtreads.txt | 10 - res/cardsfolder/barrenton_medic.txt | 12 - res/cardsfolder/barrin_master_wizard.txt | 11 - res/cardsfolder/barrins_codex.txt | 12 - res/cardsfolder/bartel_runeaxe.txt | 11 - res/cardsfolder/barter_in_blood.txt | 10 - res/cardsfolder/baru_fist_of_krosa.txt | 14 - res/cardsfolder/basal_sliver.txt | 12 - res/cardsfolder/basal_thrull.txt | 11 - res/cardsfolder/basalt_gargoyle.txt | 12 - res/cardsfolder/basalt_monolith.txt | 15 - res/cardsfolder/bash_to_bits.txt | 10 - res/cardsfolder/basilisk_collar.txt | 9 - res/cardsfolder/basking_rootwalla.txt | 11 - res/cardsfolder/baton_of_courage.txt | 12 - res/cardsfolder/battered_golem.txt | 12 - res/cardsfolder/battering_craghorn.txt | 11 - res/cardsfolder/battering_sliver.txt | 11 - res/cardsfolder/battering_wurm.txt | 11 - res/cardsfolder/batterskull.txt | 11 - res/cardsfolder/battle_frenzy.txt | 10 - res/cardsfolder/battle_hurda.txt | 10 - res/cardsfolder/battle_mad_ronin.txt | 11 - res/cardsfolder/battle_mastery.txt | 10 - res/cardsfolder/battle_of_wits.txt | 10 - res/cardsfolder/battle_rampart.txt | 12 - res/cardsfolder/battle_rattle_shaman.txt | 11 - res/cardsfolder/battle_screech.txt | 10 - res/cardsfolder/battle_squadron.txt | 12 - res/cardsfolder/battle_strain.txt | 11 - res/cardsfolder/battlefield_forge.txt | 15 - res/cardsfolder/battlefield_medic.txt | 11 - res/cardsfolder/battlefield_percher.txt | 12 - res/cardsfolder/battlegate_mimic.txt | 12 - res/cardsfolder/battlegrace_angel.txt | 13 - res/cardsfolder/battlegrowth.txt | 9 - res/cardsfolder/battlewand_oak.txt | 13 - res/cardsfolder/battlewise_aven.txt | 11 - res/cardsfolder/bay_falcon.txt | 11 - res/cardsfolder/bayou.txt | 11 - res/cardsfolder/bayou_dragonfly.txt | 11 - res/cardsfolder/bazaar_of_baghdad.txt | 10 - res/cardsfolder/bazaar_of_wonders.txt | 9 - res/cardsfolder/beacon_behemoth.txt | 11 - res/cardsfolder/beacon_hawk.txt | 13 - res/cardsfolder/beacon_of_creation.txt | 11 - res/cardsfolder/beacon_of_destruction.txt | 11 - res/cardsfolder/beacon_of_immortality.txt | 12 - res/cardsfolder/beacon_of_tomorrows.txt | 10 - res/cardsfolder/beacon_of_unrest.txt | 11 - res/cardsfolder/bear_cub.txt | 9 - res/cardsfolder/bear_umbra.txt | 13 - res/cardsfolder/bearscape.txt | 9 - res/cardsfolder/beast_attack.txt | 10 - res/cardsfolder/beast_hunt.txt | 9 - res/cardsfolder/beast_of_burden.txt | 14 - res/cardsfolder/beast_within.txt | 11 - res/cardsfolder/beastbreaker_of_bala_ged.txt | 13 - res/cardsfolder/beastmaster_ascension.txt | 12 - res/cardsfolder/beastmasters_magemark.txt | 14 - res/cardsfolder/beasts_of_bogardan.txt | 11 - res/cardsfolder/beckon_apparition.txt | 10 - res/cardsfolder/bedlam.txt | 11 - res/cardsfolder/bee_sting.txt | 10 - res/cardsfolder/befoul.txt | 11 - res/cardsfolder/behemoth_sledge.txt | 9 - res/cardsfolder/belbes_armor.txt | 11 - res/cardsfolder/belbes_percher.txt | 11 - res/cardsfolder/belbes_portal.txt | 9 - res/cardsfolder/belligerent_hatchling.txt | 15 - res/cardsfolder/bellowing_fiend.txt | 14 - res/cardsfolder/bellowing_tanglewurm.txt | 11 - res/cardsfolder/belltower_sphinx.txt | 13 - res/cardsfolder/beloved_chaplain.txt | 10 - res/cardsfolder/ben_ben_akki_hermit.txt | 12 - res/cardsfolder/benalish_cavalry.txt | 10 - res/cardsfolder/benalish_emissary.txt | 12 - res/cardsfolder/benalish_heralds.txt | 10 - res/cardsfolder/benalish_knight.txt | 12 - res/cardsfolder/benalish_missionary.txt | 11 - res/cardsfolder/benalish_trapper.txt | 10 - res/cardsfolder/benevolent_ancestor.txt | 11 - res/cardsfolder/benevolent_bodyguard.txt | 14 - res/cardsfolder/benevolent_unicorn.txt | 9 - res/cardsfolder/benthic_behemoth.txt | 11 - res/cardsfolder/benthic_djinn.txt | 12 - res/cardsfolder/benthicore.txt | 13 - res/cardsfolder/bequeathal.txt | 12 - res/cardsfolder/bereavement.txt | 14 - res/cardsfolder/berserk.txt | 13 - res/cardsfolder/berserk_murlodont.txt | 12 - res/cardsfolder/berserkers_of_blood_ridge.txt | 11 - res/cardsfolder/beseech_the_queen.txt | 11 - res/cardsfolder/bestial_fury.txt | 14 - res/cardsfolder/bestial_menace.txt | 11 - res/cardsfolder/betrayal.txt | 11 - res/cardsfolder/betrayal_of_flesh.txt | 13 - res/cardsfolder/betrothed_of_fire.txt | 13 - res/cardsfolder/bewilder.txt | 11 - res/cardsfolder/big_game_hunter.txt | 12 - res/cardsfolder/bile_urchin.txt | 11 - res/cardsfolder/bind.txt | 10 - res/cardsfolder/binding_agony.txt | 12 - res/cardsfolder/binding_grasp.txt | 13 - res/cardsfolder/biomantic_mastery.txt | 11 - res/cardsfolder/biorhythm.txt | 13 - res/cardsfolder/birchlore_rangers.txt | 16 - res/cardsfolder/bird_maiden.txt | 12 - res/cardsfolder/birds_of_paradise.txt | 27 - res/cardsfolder/biting_tether.txt | 12 - res/cardsfolder/bitterblossom.txt | 11 - res/cardsfolder/bituminous_blast.txt | 10 - res/cardsfolder/black_carriage.txt | 13 - res/cardsfolder/black_knight.txt | 18 - res/cardsfolder/black_lotus.txt | 16 - res/cardsfolder/black_mana_battery.txt | 11 - res/cardsfolder/black_market.txt | 13 - res/cardsfolder/black_poplar_shaman.txt | 10 - res/cardsfolder/black_scarab.txt | 12 - res/cardsfolder/black_suns_zenith.txt | 12 - res/cardsfolder/black_vise.txt | 15 - res/cardsfolder/black_ward.txt | 15 - res/cardsfolder/blackcleave_cliffs.txt | 11 - res/cardsfolder/blackcleave_goblin.txt | 11 - res/cardsfolder/blade_of_the_bloodchief.txt | 9 - res/cardsfolder/blade_of_the_sixth_pride.txt | 9 - res/cardsfolder/blade_sliver.txt | 11 - res/cardsfolder/blade_splicer.txt | 12 - res/cardsfolder/blade_tribe_berserkers.txt | 11 - res/cardsfolder/bladed_pinions.txt | 9 - res/cardsfolder/bladed_sentinel.txt | 11 - res/cardsfolder/blades_of_velis_vel.txt | 10 - res/cardsfolder/bladetusk_boar.txt | 10 - res/cardsfolder/bladewing_the_risen.txt | 13 - res/cardsfolder/bladewings_thrall.txt | 13 - res/cardsfolder/blanchwood_armor.txt | 17 - res/cardsfolder/blanchwood_treefolk.txt | 9 - res/cardsfolder/blanket_of_night.txt | 10 - res/cardsfolder/blasted_landscape.txt | 11 - res/cardsfolder/blaster_mage.txt | 10 - res/cardsfolder/blasting_station.txt | 12 - res/cardsfolder/blastoderm.txt | 11 - res/cardsfolder/blatant_thievery.txt | 9 - res/cardsfolder/blaze.txt | 17 - res/cardsfolder/blazethorn_scarecrow.txt | 12 - res/cardsfolder/blazing_archon.txt | 10 - res/cardsfolder/blazing_shoal.txt | 13 - res/cardsfolder/blazing_specter.txt | 13 - res/cardsfolder/bleak_coven_vampires.txt | 12 - res/cardsfolder/blessed_orator.txt | 12 - res/cardsfolder/blessed_reversal.txt | 14 - res/cardsfolder/blessed_wind.txt | 9 - res/cardsfolder/blessed_wine.txt | 11 - res/cardsfolder/blessing.txt | 15 - res/cardsfolder/blessing_of_leeches.txt | 15 - res/cardsfolder/blessing_of_the_nephilim.txt | 16 - res/cardsfolder/blight.txt | 14 - res/cardsfolder/blight_mamba.txt | 11 - res/cardsfolder/blight_sickle.txt | 9 - res/cardsfolder/blighted_agent.txt | 11 - res/cardsfolder/blighted_shaman.txt | 12 - res/cardsfolder/blightning.txt | 10 - res/cardsfolder/blightsoil_druid.txt | 11 - res/cardsfolder/blightspeaker.txt | 12 - res/cardsfolder/blightsteel_colossus.txt | 14 - res/cardsfolder/blightwidow.txt | 11 - res/cardsfolder/blind_creeper.txt | 12 - res/cardsfolder/blind_phantasm.txt | 9 - res/cardsfolder/blind_spot_giant.txt | 12 - res/cardsfolder/blind_with_anger.txt | 9 - res/cardsfolder/blind_zealot.txt | 13 - res/cardsfolder/blinding_light.txt | 13 - res/cardsfolder/blinding_mage.txt | 11 - res/cardsfolder/blinding_souleater.txt | 10 - res/cardsfolder/blinking_spirit.txt | 13 - res/cardsfolder/blinkmoth_infusion.txt | 11 - res/cardsfolder/blinkmoth_nexus.txt | 11 - res/cardsfolder/blinkmoth_well.txt | 11 - res/cardsfolder/blister_beetle.txt | 12 - res/cardsfolder/blistergrub.txt | 12 - res/cardsfolder/blistering_barrier.txt | 10 - res/cardsfolder/blistering_dieflyn.txt | 11 - res/cardsfolder/blistering_firecat.txt | 13 - res/cardsfolder/blisterstick_shaman.txt | 11 - res/cardsfolder/blitz_hellion.txt | 13 - res/cardsfolder/blizzard.txt | 10 - res/cardsfolder/blizzard_elemental.txt | 11 - res/cardsfolder/bloated_toad.txt | 11 - res/cardsfolder/blockade_runner.txt | 10 - res/cardsfolder/blockbuster.txt | 10 - res/cardsfolder/blood_celebrant.txt | 15 - res/cardsfolder/blood_crypt.txt | 8 - res/cardsfolder/blood_cultist.txt | 11 - res/cardsfolder/blood_frenzy.txt | 9 - res/cardsfolder/blood_hound.txt | 14 - res/cardsfolder/blood_knight.txt | 11 - res/cardsfolder/blood_moon.txt | 12 - res/cardsfolder/blood_pet.txt | 12 - res/cardsfolder/blood_rites.txt | 10 - res/cardsfolder/blood_seeker.txt | 10 - res/cardsfolder/blood_speaker.txt | 14 - res/cardsfolder/blood_tithe.txt | 10 - res/cardsfolder/blood_tyrant.txt | 14 - res/cardsfolder/blood_vassal.txt | 11 - res/cardsfolder/bloodbraid_elf.txt | 11 - res/cardsfolder/bloodcurdling_scream.txt | 11 - res/cardsfolder/bloodfire_colossus.txt | 12 - res/cardsfolder/bloodfire_dwarf.txt | 10 - res/cardsfolder/bloodfire_infusion.txt | 12 - res/cardsfolder/bloodfire_kavu.txt | 11 - res/cardsfolder/bloodghast.txt | 13 - res/cardsfolder/bloodhall_ooze.txt | 14 - res/cardsfolder/bloodhusk_ritualist.txt | 13 - res/cardsfolder/bloodied_ghost.txt | 11 - res/cardsfolder/bloodletter_quill.txt | 12 - res/cardsfolder/bloodmark_mentor.txt | 11 - res/cardsfolder/bloodpyre_elemental.txt | 10 - res/cardsfolder/bloodrite_invoker.txt | 11 - res/cardsfolder/bloodrock_cyclops.txt | 11 - res/cardsfolder/bloodscale_prowler.txt | 10 - res/cardsfolder/bloodscent.txt | 10 - res/cardsfolder/bloodshed_fever.txt | 10 - res/cardsfolder/bloodshot_cyclops.txt | 14 - res/cardsfolder/bloodshot_trainee.txt | 12 - res/cardsfolder/bloodstained_mire.txt | 9 - res/cardsfolder/bloodstoke_howler.txt | 12 - res/cardsfolder/bloodstone_cameo.txt | 10 - res/cardsfolder/bloodthirsty_ogre.txt | 13 - res/cardsfolder/bloodthorn_taunter.txt | 12 - res/cardsfolder/bloodthrone_vampire.txt | 11 - res/cardsfolder/blossoming_wreath.txt | 10 - res/cardsfolder/blue_elemental_blast.txt | 15 - res/cardsfolder/blue_mana_battery.txt | 11 - res/cardsfolder/blue_scarab.txt | 12 - res/cardsfolder/blue_suns_zenith.txt | 12 - res/cardsfolder/blue_ward.txt | 15 - res/cardsfolder/blunt_the_assault.txt | 11 - res/cardsfolder/blurred_mongoose.txt | 11 - res/cardsfolder/boa_constrictor.txt | 11 - res/cardsfolder/boar_umbra.txt | 11 - res/cardsfolder/boartusk_liege.txt | 13 - res/cardsfolder/body_of_jukai.txt | 11 - res/cardsfolder/bog_glider.txt | 12 - res/cardsfolder/bog_gnarr.txt | 13 - res/cardsfolder/bog_hoodlums.txt | 13 - res/cardsfolder/bog_imp.txt | 18 - res/cardsfolder/bog_initiate.txt | 11 - res/cardsfolder/bog_raiders.txt | 13 - res/cardsfolder/bog_rats.txt | 12 - res/cardsfolder/bog_serpent.txt | 12 - res/cardsfolder/bog_smugglers.txt | 10 - res/cardsfolder/bog_strider_ash.txt | 12 - res/cardsfolder/bog_tatters.txt | 10 - res/cardsfolder/bog_witch.txt | 11 - res/cardsfolder/bog_wraith.txt | 23 - res/cardsfolder/bog_wreckage.txt | 15 - res/cardsfolder/bogardan_firefiend.txt | 12 - res/cardsfolder/bogardan_hellkite.txt | 18 - res/cardsfolder/bogardan_lancer.txt | 11 - res/cardsfolder/bogardan_rager.txt | 13 - res/cardsfolder/boggart_arsonists.txt | 11 - res/cardsfolder/boggart_birth_rite.txt | 10 - res/cardsfolder/boggart_forager.txt | 11 - res/cardsfolder/boggart_harbinger.txt | 12 - res/cardsfolder/boggart_loggers.txt | 11 - res/cardsfolder/boggart_mob.txt | 13 - res/cardsfolder/boggart_ram_gang.txt | 11 - res/cardsfolder/boggart_shenanigans.txt | 11 - res/cardsfolder/boggart_sprite_chaser.txt | 11 - res/cardsfolder/boil.txt | 13 - res/cardsfolder/boiling_blood.txt | 11 - res/cardsfolder/boiling_seas.txt | 11 - res/cardsfolder/bojuka_bog.txt | 12 - res/cardsfolder/bojuka_brigand.txt | 15 - res/cardsfolder/bola_warrior.txt | 11 - res/cardsfolder/boldwyr_heavyweights.txt | 12 - res/cardsfolder/bonded_fetch.txt | 13 - res/cardsfolder/bonds_of_quicksilver.txt | 11 - res/cardsfolder/bone_flute.txt | 10 - res/cardsfolder/bone_harvest.txt | 12 - res/cardsfolder/bone_saw.txt | 9 - res/cardsfolder/bone_shredder.txt | 13 - res/cardsfolder/bone_splinters.txt | 10 - res/cardsfolder/bonehoard.txt | 12 - res/cardsfolder/boneknitter.txt | 11 - res/cardsfolder/boneshard_slasher.txt | 11 - res/cardsfolder/bonesplitter.txt | 9 - res/cardsfolder/bonesplitter_sliver.txt | 11 - res/cardsfolder/bonethorn_valesk.txt | 11 - res/cardsfolder/book_of_rass.txt | 9 - res/cardsfolder/boomerang.txt | 16 - res/cardsfolder/boon_reflection.txt | 9 - res/cardsfolder/borborygmos.txt | 12 - res/cardsfolder/border_guard.txt | 10 - res/cardsfolder/border_patrol.txt | 10 - res/cardsfolder/borderland_behemoth.txt | 14 - res/cardsfolder/borderland_ranger.txt | 11 - res/cardsfolder/boreal_centaur.txt | 10 - res/cardsfolder/boreal_druid.txt | 10 - res/cardsfolder/boreal_griffin.txt | 12 - res/cardsfolder/boreal_shelf.txt | 11 - res/cardsfolder/boris_devilboon.txt | 10 - res/cardsfolder/boros_garrison.txt | 13 - res/cardsfolder/boros_guildmage.txt | 11 - res/cardsfolder/boros_recruit.txt | 10 - res/cardsfolder/boros_signet.txt | 10 - res/cardsfolder/boros_swiftblade.txt | 10 - res/cardsfolder/borrowing_100000_arrows.txt | 11 - res/cardsfolder/borrowing_the_east_wind.txt | 11 - res/cardsfolder/bosh_iron_golem.txt | 13 - res/cardsfolder/bosk_banneret.txt | 10 - res/cardsfolder/bottle_gnomes.txt | 13 - res/cardsfolder/bottle_of_suleiman.txt | 15 - res/cardsfolder/bottomless_pit.txt | 11 - res/cardsfolder/bottomless_vault.txt | 12 - res/cardsfolder/bouncing_beebles.txt | 10 - res/cardsfolder/bound_in_silence.txt | 10 - res/cardsfolder/bounteous_kirin.txt | 13 - res/cardsfolder/bountiful_harvest.txt | 10 - res/cardsfolder/bounty_hunter.txt | 11 - res/cardsfolder/brackwater_elemental.txt | 13 - res/cardsfolder/braid_of_fire.txt | 9 - res/cardsfolder/braids_cabal_minion.txt | 14 - res/cardsfolder/braids_conjurer_adept.txt | 14 - res/cardsfolder/braidwood_cup.txt | 9 - res/cardsfolder/braidwood_sextant.txt | 9 - res/cardsfolder/brain_freeze.txt | 10 - res/cardsfolder/brainbite.txt | 10 - res/cardsfolder/braingeyser.txt | 14 - res/cardsfolder/brainspoil.txt | 10 - res/cardsfolder/brainstorm.txt | 12 - res/cardsfolder/bramble_creeper.txt | 11 - res/cardsfolder/bramblesnap.txt | 11 - res/cardsfolder/branching_bolt.txt | 13 - res/cardsfolder/branchsnap_lorian.txt | 11 - res/cardsfolder/branded_brawlers.txt | 11 - res/cardsfolder/brass_gnat.txt | 13 - res/cardsfolder/brass_herald.txt | 15 - res/cardsfolder/brass_man.txt | 14 - res/cardsfolder/brass_secretary.txt | 10 - res/cardsfolder/brass_squire.txt | 10 - res/cardsfolder/brass_talon_chimera.txt | 13 - res/cardsfolder/brassclaw_orcs.txt | 11 - res/cardsfolder/bravado.txt | 13 - res/cardsfolder/brave_the_elements.txt | 9 - res/cardsfolder/brawn.txt | 10 - res/cardsfolder/breach.txt | 9 - res/cardsfolder/break_asunder.txt | 10 - res/cardsfolder/breath_of_life.txt | 12 - res/cardsfolder/breath_of_malfegor.txt | 9 - res/cardsfolder/breathstealer.txt | 10 - res/cardsfolder/breeding_pit.txt | 12 - res/cardsfolder/breeding_pool.txt | 8 - res/cardsfolder/briar_patch.txt | 10 - res/cardsfolder/briar_shield.txt | 11 - res/cardsfolder/briarberry_cohort.txt | 12 - res/cardsfolder/briarhorn.txt | 16 - res/cardsfolder/briarknit_kami.txt | 13 - res/cardsfolder/bribery.txt | 10 - res/cardsfolder/bridge_from_below.txt | 13 - res/cardsfolder/brighthearth_banneret.txt | 11 - res/cardsfolder/brightstone_ritual.txt | 11 - res/cardsfolder/brilliant_halo.txt | 13 - res/cardsfolder/brilliant_plan.txt | 9 - res/cardsfolder/brilliant_ultimatum.txt | 8 - res/cardsfolder/brimstone_dragon.txt | 11 - res/cardsfolder/brimstone_mage.txt | 16 - res/cardsfolder/brindle_boar.txt | 10 - res/cardsfolder/brine_shaman.txt | 12 - res/cardsfolder/bringer_of_the_black_dawn.txt | 14 - res/cardsfolder/bringer_of_the_blue_dawn.txt | 13 - res/cardsfolder/bringer_of_the_green_dawn.txt | 13 - res/cardsfolder/bringer_of_the_red_dawn.txt | 13 - res/cardsfolder/bringer_of_the_white_dawn.txt | 13 - res/cardsfolder/brink_of_madness.txt | 11 - res/cardsfolder/brion_stoutarm.txt | 12 - res/cardsfolder/brittle_effigy.txt | 9 - res/cardsfolder/broken_ambitions.txt | 13 - res/cardsfolder/broken_dam.txt | 10 - res/cardsfolder/broken_fall.txt | 9 - res/cardsfolder/broken_visage.txt | 13 - res/cardsfolder/brood_birthing.txt | 8 - res/cardsfolder/brood_of_cockroaches.txt | 14 - res/cardsfolder/brood_sliver.txt | 11 - res/cardsfolder/broodhatch_nantuko.txt | 13 - res/cardsfolder/broodmate_dragon.txt | 12 - res/cardsfolder/broodstar.txt | 12 - res/cardsfolder/broodwarden.txt | 11 - res/cardsfolder/brothers_of_fire.txt | 13 - res/cardsfolder/brown_ouphe.txt | 11 - res/cardsfolder/browse.txt | 11 - res/cardsfolder/brush_with_death.txt | 11 - res/cardsfolder/brushland.txt | 18 - res/cardsfolder/brushwagg.txt | 12 - res/cardsfolder/brutal_nightstalker.txt | 11 - res/cardsfolder/brute_force.txt | 9 - res/cardsfolder/bubble_matrix.txt | 10 - res/cardsfolder/bubbling_beebles.txt | 10 - res/cardsfolder/bubbling_muck.txt | 12 - res/cardsfolder/bull_aurochs.txt | 13 - res/cardsfolder/bull_cerodon.txt | 11 - res/cardsfolder/bull_hippo.txt | 12 - res/cardsfolder/bull_rush.txt | 9 - res/cardsfolder/bullwhip.txt | 10 - res/cardsfolder/buoyancy.txt | 11 - res/cardsfolder/burden_of_greed.txt | 11 - res/cardsfolder/burgeoning.txt | 10 - res/cardsfolder/buried_alive.txt | 10 - res/cardsfolder/burn_the_impure.txt | 8 - res/cardsfolder/burning_cloak.txt | 10 - res/cardsfolder/burning_fields.txt | 9 - res/cardsfolder/burning_inquiry.txt | 10 - res/cardsfolder/burning_shield_askari.txt | 11 - res/cardsfolder/burr_grafter.txt | 12 - res/cardsfolder/burrenton_bombardier.txt | 11 - res/cardsfolder/burrowing.txt | 15 - res/cardsfolder/burst_lightning.txt | 10 - res/cardsfolder/burst_of_energy.txt | 10 - res/cardsfolder/burst_of_speed.txt | 11 - res/cardsfolder/butcher_of_malakir.txt | 12 - res/cardsfolder/cabal_archon.txt | 11 - res/cardsfolder/cabal_coffers.txt | 11 - res/cardsfolder/cabal_conditioning.txt | 11 - res/cardsfolder/cabal_executioner.txt | 13 - res/cardsfolder/cabal_inquisitor.txt | 10 - res/cardsfolder/cabal_patriarch.txt | 12 - res/cardsfolder/cabal_pit.txt | 12 - res/cardsfolder/cabal_ritual.txt | 11 - res/cardsfolder/cabal_slaver.txt | 13 - res/cardsfolder/cabal_surgeon.txt | 10 - res/cardsfolder/cabal_torturer.txt | 11 - res/cardsfolder/cabal_trainee.txt | 10 - res/cardsfolder/cache_raiders.txt | 12 - res/cardsfolder/cackling_fiend.txt | 11 - res/cardsfolder/cackling_flames.txt | 10 - res/cardsfolder/cackling_imp.txt | 11 - res/cardsfolder/cackling_witch.txt | 12 - res/cardsfolder/cadaver_imp.txt | 12 - res/cardsfolder/cadaverous_bloom.txt | 11 - res/cardsfolder/cadaverous_knight.txt | 11 - res/cardsfolder/cage_of_hands.txt | 11 - res/cardsfolder/cagemail.txt | 10 - res/cardsfolder/calciderm.txt | 11 - res/cardsfolder/calciform_pools.txt | 11 - res/cardsfolder/calcite_snapper.txt | 13 - res/cardsfolder/caldera_hellion.txt | 12 - res/cardsfolder/caldera_lake.txt | 14 - res/cardsfolder/call_for_blood.txt | 11 - res/cardsfolder/call_of_the_herd.txt | 11 - res/cardsfolder/call_of_the_wild.txt | 11 - res/cardsfolder/call_the_skybreaker.txt | 10 - res/cardsfolder/call_to_glory.txt | 11 - res/cardsfolder/call_to_heel.txt | 10 - res/cardsfolder/call_to_mind.txt | 9 - res/cardsfolder/call_to_the_grave.txt | 13 - res/cardsfolder/call_to_the_netherworld.txt | 10 - res/cardsfolder/caller_of_gales.txt | 10 - res/cardsfolder/caller_of_the_claw.txt | 13 - res/cardsfolder/callous_giant.txt | 9 - res/cardsfolder/calming_verse.txt | 11 - res/cardsfolder/caltrops.txt | 12 - res/cardsfolder/cancel.txt | 14 - res/cardsfolder/candelabra_of_tawnos.txt | 13 - res/cardsfolder/canker_abomination.txt | 11 - res/cardsfolder/canopy_cover.txt | 10 - res/cardsfolder/canopy_spider.txt | 13 - res/cardsfolder/cantivore.txt | 12 - res/cardsfolder/canyon_drake.txt | 12 - res/cardsfolder/canyon_minotaur.txt | 11 - res/cardsfolder/canyon_wildcat.txt | 11 - res/cardsfolder/cao_cao_lord_of_wei.txt | 10 - res/cardsfolder/cao_ren_wei_commander.txt | 12 - res/cardsfolder/capashen_knight.txt | 11 - res/cardsfolder/capashen_standard.txt | 11 - res/cardsfolder/capashen_templar.txt | 10 - res/cardsfolder/capashen_unicorn.txt | 10 - res/cardsfolder/capricious_sorcerer.txt | 10 - res/cardsfolder/capsize.txt | 10 - res/cardsfolder/captain_of_the_watch.txt | 14 - res/cardsfolder/captain_sisay.txt | 10 - res/cardsfolder/captivating_vampire.txt | 13 - res/cardsfolder/captive_flame.txt | 9 - res/cardsfolder/capture_of_jingzhou.txt | 9 - res/cardsfolder/captured_sunlight.txt | 10 - res/cardsfolder/carapace_forger.txt | 10 - res/cardsfolder/caravan_escort.txt | 13 - res/cardsfolder/caravan_hurda.txt | 10 - res/cardsfolder/carbonize.txt | 10 - res/cardsfolder/careful_consideration.txt | 11 - res/cardsfolder/careful_study.txt | 10 - res/cardsfolder/caress_of_phyrexia.txt | 11 - res/cardsfolder/caribou_range.txt | 13 - res/cardsfolder/carnage_altar.txt | 10 - res/cardsfolder/carnassid.txt | 11 - res/cardsfolder/carnifex_demon.txt | 12 - res/cardsfolder/carnival_of_souls.txt | 12 - res/cardsfolder/carnivorous_plant.txt | 11 - res/cardsfolder/carnophage.txt | 9 - res/cardsfolder/carrier_pigeons.txt | 12 - res/cardsfolder/carrion.txt | 11 - res/cardsfolder/carrion_ants.txt | 12 - res/cardsfolder/carrion_call.txt | 9 - res/cardsfolder/carrion_feeder.txt | 11 - res/cardsfolder/carrion_howler.txt | 10 - res/cardsfolder/carrion_thrash.txt | 11 - res/cardsfolder/carrion_wall.txt | 12 - res/cardsfolder/cartographer.txt | 12 - res/cardsfolder/carven_caryatid.txt | 12 - res/cardsfolder/cascade_bluffs.txt | 13 - res/cardsfolder/castigate.txt | 9 - res/cardsfolder/casting_of_bones.txt | 13 - res/cardsfolder/castle.txt | 16 - res/cardsfolder/castle_raptors.txt | 11 - res/cardsfolder/castle_sengir.txt | 13 - res/cardsfolder/cat_burglar.txt | 10 - res/cardsfolder/cat_warriors.txt | 12 - res/cardsfolder/catalog.txt | 10 - res/cardsfolder/catapult_master.txt | 11 - res/cardsfolder/catapult_squad.txt | 11 - res/cardsfolder/catastrophe.txt | 10 - res/cardsfolder/cateran_brute.txt | 11 - res/cardsfolder/cateran_enforcer.txt | 12 - res/cardsfolder/cateran_kidnappers.txt | 11 - res/cardsfolder/cateran_overlord.txt | 12 - res/cardsfolder/cateran_persuader.txt | 11 - res/cardsfolder/cateran_slaver.txt | 12 - res/cardsfolder/cateran_summons.txt | 10 - res/cardsfolder/cathartic_adept.txt | 10 - res/cardsfolder/cathodion.txt | 11 - res/cardsfolder/cauldron_haze.txt | 10 - res/cardsfolder/cauldron_of_souls.txt | 10 - res/cardsfolder/caustic_crawler.txt | 11 - res/cardsfolder/caustic_hound.txt | 11 - res/cardsfolder/caustic_rain.txt | 9 - res/cardsfolder/caustic_tar.txt | 11 - res/cardsfolder/caustic_wasps.txt | 12 - res/cardsfolder/cavalry_master.txt | 12 - res/cardsfolder/cave_in.txt | 10 - res/cardsfolder/cave_people.txt | 14 - res/cardsfolder/cave_sense.txt | 10 - res/cardsfolder/cave_tiger.txt | 11 - res/cardsfolder/cavern_crawler.txt | 11 - res/cardsfolder/cavern_harpy.txt | 14 - res/cardsfolder/cavern_thoctar.txt | 10 - res/cardsfolder/caverns_of_despair.txt | 9 - res/cardsfolder/caves_of_koilos.txt | 15 - res/cardsfolder/celestial_ancient.txt | 12 - res/cardsfolder/celestial_colonnade.txt | 12 - res/cardsfolder/celestial_crusader.txt | 13 - res/cardsfolder/celestial_gatekeeper.txt | 13 - res/cardsfolder/celestial_kirin.txt | 15 - res/cardsfolder/celestial_mantle.txt | 10 - res/cardsfolder/celestial_prism.txt | 18 - res/cardsfolder/celestial_purge.txt | 11 - res/cardsfolder/celestial_sword.txt | 10 - res/cardsfolder/cemetery_gate.txt | 11 - res/cardsfolder/cemetery_reaper.txt | 13 - res/cardsfolder/cenns_enlistment.txt | 10 - res/cardsfolder/cenns_heir.txt | 12 - res/cardsfolder/centaur_archer.txt | 10 - res/cardsfolder/centaur_chieftain.txt | 12 - res/cardsfolder/centaur_courser.txt | 9 - res/cardsfolder/centaur_garden.txt | 12 - res/cardsfolder/centaur_glade.txt | 9 - res/cardsfolder/centaur_omenreader.txt | 10 - res/cardsfolder/centaur_rootcaster.txt | 11 - res/cardsfolder/centaur_safeguard.txt | 11 - res/cardsfolder/centaur_veteran.txt | 11 - res/cardsfolder/cephalid_aristocrat.txt | 12 - res/cardsfolder/cephalid_broker.txt | 11 - res/cardsfolder/cephalid_coliseum.txt | 13 - res/cardsfolder/cephalid_illusionist.txt | 13 - res/cardsfolder/cephalid_inkshrouder.txt | 11 - res/cardsfolder/cephalid_looter.txt | 11 - res/cardsfolder/cephalid_pathmage.txt | 11 - res/cardsfolder/cephalid_retainer.txt | 10 - res/cardsfolder/cephalid_sage.txt | 13 - res/cardsfolder/cephalid_scout.txt | 11 - res/cardsfolder/cephalid_snitch.txt | 12 - res/cardsfolder/cephalid_vandal.txt | 14 - res/cardsfolder/cerebral_eruption.txt | 8 - res/cardsfolder/ceremonial_guard.txt | 14 - res/cardsfolder/cerodon_yearling.txt | 11 - res/cardsfolder/cerulean_sphinx.txt | 11 - res/cardsfolder/cerulean_wisps.txt | 12 - res/cardsfolder/cerulean_wyvern.txt | 11 - res/cardsfolder/cessation.txt | 13 - res/cardsfolder/ceta_disciple.txt | 16 - res/cardsfolder/ceta_sanctuary.txt | 9 - res/cardsfolder/chain_reaction.txt | 10 - res/cardsfolder/chainbreaker.txt | 11 - res/cardsfolder/chained_throatseeker.txt | 11 - res/cardsfolder/chainer_dementia_master.txt | 15 - res/cardsfolder/chainers_edict.txt | 10 - res/cardsfolder/chainflinger.txt | 11 - res/cardsfolder/chalice_of_the_void.txt | 14 - res/cardsfolder/chambered_nautilus.txt | 11 - res/cardsfolder/chameleon_colossus.txt | 13 - res/cardsfolder/champion_lancer.txt | 10 - res/cardsfolder/champions_drake.txt | 11 - res/cardsfolder/champions_victory.txt | 9 - res/cardsfolder/chandler.txt | 10 - res/cardsfolder/chandra_nalaar.txt | 11 - res/cardsfolder/chandras_outrage.txt | 10 - res/cardsfolder/chandras_spitfire.txt | 12 - res/cardsfolder/change_of_heart.txt | 11 - res/cardsfolder/changeling_berserker.txt | 13 - res/cardsfolder/changeling_hero.txt | 13 - res/cardsfolder/changeling_sentinel.txt | 11 - res/cardsfolder/changeling_titan.txt | 12 - res/cardsfolder/channel.txt | 15 - res/cardsfolder/channel_the_suns.txt | 10 - res/cardsfolder/chaos_charm.txt | 12 - res/cardsfolder/chaosphere.txt | 12 - res/cardsfolder/char.txt | 10 - res/cardsfolder/char_rumbler.txt | 11 - res/cardsfolder/charcoal_diamond.txt | 12 - res/cardsfolder/charging_bandits.txt | 11 - res/cardsfolder/charging_paladin.txt | 13 - res/cardsfolder/charging_rhino.txt | 10 - res/cardsfolder/charging_slateback.txt | 11 - res/cardsfolder/charging_troll.txt | 11 - res/cardsfolder/charmed_griffin.txt | 12 - res/cardsfolder/charnelhoard_wurm.txt | 12 - res/cardsfolder/chartooth_cougar.txt | 11 - res/cardsfolder/chastise.txt | 13 - res/cardsfolder/chatter_of_the_squirrel.txt | 10 - res/cardsfolder/chieftain_en_dal.txt | 11 - res/cardsfolder/child_of_alara.txt | 12 - res/cardsfolder/child_of_gaea.txt | 12 - res/cardsfolder/child_of_night.txt | 11 - res/cardsfolder/child_of_thorns.txt | 10 - res/cardsfolder/childhood_horror.txt | 11 - res/cardsfolder/chill.txt | 11 - res/cardsfolder/chill_to_the_bone.txt | 9 - res/cardsfolder/chilling_apparition.txt | 12 - res/cardsfolder/chilling_shade.txt | 12 - res/cardsfolder/chime_of_night.txt | 12 - res/cardsfolder/chimeric_coils.txt | 11 - res/cardsfolder/chimeric_egg.txt | 11 - res/cardsfolder/chimeric_idol.txt | 10 - res/cardsfolder/chimeric_mass.txt | 15 - res/cardsfolder/chimeric_staff.txt | 12 - res/cardsfolder/chimney_imp.txt | 13 - res/cardsfolder/chittering_rats.txt | 11 - res/cardsfolder/cho_arrim_bruiser.txt | 11 - res/cardsfolder/cho_manno_revolutionary.txt | 11 - res/cardsfolder/choke.txt | 11 - res/cardsfolder/choking_fumes.txt | 9 - res/cardsfolder/choking_sands.txt | 10 - res/cardsfolder/choking_tethers.txt | 12 - res/cardsfolder/chorus_of_woe.txt | 12 - res/cardsfolder/chromatic_sphere.txt | 16 - res/cardsfolder/chromatic_star.txt | 18 - res/cardsfolder/chrome_steed.txt | 11 - res/cardsfolder/chromescale_drake.txt | 14 - res/cardsfolder/chromium.txt | 12 - res/cardsfolder/chronatog.txt | 10 - res/cardsfolder/chronatog_totem.txt | 12 - res/cardsfolder/chronosavant.txt | 11 - res/cardsfolder/chub_toad.txt | 13 - res/cardsfolder/churning_eddy.txt | 10 - res/cardsfolder/cinder_crawler.txt | 10 - res/cardsfolder/cinder_elemental.txt | 12 - res/cardsfolder/cinder_giant.txt | 11 - res/cardsfolder/cinder_marsh.txt | 12 - res/cardsfolder/cinder_pyromancer.txt | 12 - res/cardsfolder/cinder_shade.txt | 12 - res/cardsfolder/cinder_storm.txt | 9 - res/cardsfolder/cinder_wall.txt | 15 - res/cardsfolder/cinderbones.txt | 11 - res/cardsfolder/cinderhaze_wretch.txt | 12 - res/cardsfolder/circular_logic.txt | 12 - res/cardsfolder/citanul_centaurs.txt | 11 - res/cardsfolder/citanul_druid.txt | 11 - res/cardsfolder/citanul_flute.txt | 12 - res/cardsfolder/citanul_hierophants.txt | 11 - res/cardsfolder/citanul_woodreaders.txt | 12 - res/cardsfolder/city_of_brass.txt | 19 - res/cardsfolder/city_of_shadows.txt | 12 - res/cardsfolder/city_of_traitors.txt | 10 - res/cardsfolder/civic_guildmage.txt | 12 - res/cardsfolder/civic_wayfinder.txt | 12 - res/cardsfolder/clairvoyance.txt | 11 - res/cardsfolder/claws_of_gix.txt | 11 - res/cardsfolder/claws_of_valakut.txt | 13 - res/cardsfolder/claws_of_wirewood.txt | 10 - res/cardsfolder/clay_statue.txt | 12 - res/cardsfolder/cleanfall.txt | 9 - res/cardsfolder/cleanse.txt | 10 - res/cardsfolder/clear.txt | 10 - res/cardsfolder/clearwater_goblet.txt | 13 - res/cardsfolder/clergy_en_vec.txt | 10 - res/cardsfolder/clickslither.txt | 11 - res/cardsfolder/cliff_threader.txt | 10 - res/cardsfolder/cliffrunner_behemoth.txt | 12 - res/cardsfolder/clinging_darkness.txt | 10 - res/cardsfolder/cloak_of_feathers.txt | 10 - res/cardsfolder/cloak_of_mists.txt | 10 - res/cardsfolder/clock_of_omens.txt | 10 - res/cardsfolder/clockwork_beetle.txt | 14 - res/cardsfolder/clockwork_condor.txt | 15 - res/cardsfolder/clockwork_dragon.txt | 16 - res/cardsfolder/clockwork_gnomes.txt | 10 - res/cardsfolder/clockwork_vorrac.txt | 15 - res/cardsfolder/clone.txt | 17 - res/cardsfolder/close_quarters.txt | 10 - res/cardsfolder/clot_sliver.txt | 13 - res/cardsfolder/cloud_crusader.txt | 11 - res/cardsfolder/cloud_djinn.txt | 11 - res/cardsfolder/cloud_dragon.txt | 11 - res/cardsfolder/cloud_elemental.txt | 13 - res/cardsfolder/cloud_of_faeries.txt | 13 - res/cardsfolder/cloud_pirates.txt | 11 - res/cardsfolder/cloud_spirit.txt | 12 - res/cardsfolder/cloud_sprite.txt | 12 - res/cardsfolder/cloudchaser_eagle.txt | 13 - res/cardsfolder/cloudchaser_kestrel.txt | 13 - res/cardsfolder/cloudcrest_lake.txt | 12 - res/cardsfolder/cloudcrown_oak.txt | 10 - res/cardsfolder/cloudgoat_ranger.txt | 12 - res/cardsfolder/cloudheath_drake.txt | 11 - res/cardsfolder/cloudhoof_kirin.txt | 13 - res/cardsfolder/cloudpost.txt | 12 - res/cardsfolder/cloudreach_cavalry.txt | 11 - res/cardsfolder/cloudseeder.txt | 11 - res/cardsfolder/cloudskate.txt | 11 - res/cardsfolder/cloudthresher.txt | 16 - res/cardsfolder/clout_of_the_dominus.txt | 13 - res/cardsfolder/clutch_of_the_undercity.txt | 11 - res/cardsfolder/clutch_of_undeath.txt | 13 - res/cardsfolder/coal_golem.txt | 11 - res/cardsfolder/coast_watcher.txt | 11 - res/cardsfolder/coastal_drake.txt | 11 - res/cardsfolder/coastal_hornclaw.txt | 11 - res/cardsfolder/coastal_piracy.txt | 11 - res/cardsfolder/coastal_tower.txt | 12 - res/cardsfolder/coat_of_arms.txt | 14 - res/cardsfolder/cobalt_golem.txt | 10 - res/cardsfolder/cockatrice.txt | 22 - res/cardsfolder/coercion.txt | 16 - res/cardsfolder/coffin_puppets.txt | 11 - res/cardsfolder/coffin_purge.txt | 11 - res/cardsfolder/cognivore.txt | 12 - res/cardsfolder/coiled_tinviper.txt | 10 - res/cardsfolder/coiling_oracle.txt | 11 - res/cardsfolder/coiling_woodworm.txt | 10 - res/cardsfolder/cold_eyed_selkie.txt | 13 - res/cardsfolder/collective_restraint.txt | 10 - res/cardsfolder/collective_unconscious.txt | 12 - res/cardsfolder/colos_yearling.txt | 11 - res/cardsfolder/colossal_might.txt | 9 - res/cardsfolder/colossus_of_sardia.txt | 16 - res/cardsfolder/combat_medic.txt | 10 - res/cardsfolder/combust.txt | 11 - res/cardsfolder/command_of_unsummoning.txt | 9 - res/cardsfolder/commander_eesha.txt | 11 - res/cardsfolder/commander_greven_il_vec.txt | 13 - res/cardsfolder/commune_with_nature.txt | 11 - res/cardsfolder/complex_automaton.txt | 12 - res/cardsfolder/composite_golem.txt | 12 - res/cardsfolder/compost.txt | 11 - res/cardsfolder/compulsion.txt | 11 - res/cardsfolder/compulsive_research.txt | 10 - res/cardsfolder/concentrate.txt | 9 - res/cardsfolder/conch_horn.txt | 11 - res/cardsfolder/concordant_crossroads.txt | 11 - res/cardsfolder/condemn.txt | 13 - res/cardsfolder/condescend.txt | 12 - res/cardsfolder/confiscate.txt | 12 - res/cardsfolder/conflux.txt | 13 - res/cardsfolder/confound.txt | 10 - res/cardsfolder/congregate.txt | 10 - res/cardsfolder/congregation_at_dawn.txt | 9 - res/cardsfolder/conjurers_bauble.txt | 10 - res/cardsfolder/conquering_manticore.txt | 12 - res/cardsfolder/conquerors_pledge.txt | 10 - res/cardsfolder/consecrated_sphinx.txt | 12 - res/cardsfolder/conservator.txt | 13 - res/cardsfolder/conspiracy.txt | 10 - res/cardsfolder/constant_mists.txt | 11 - res/cardsfolder/constricting_tendrils.txt | 11 - res/cardsfolder/consult_the_necrosages.txt | 11 - res/cardsfolder/consume_the_meek.txt | 9 - res/cardsfolder/consuming_bonfire.txt | 11 - res/cardsfolder/consumptive_goo.txt | 11 - res/cardsfolder/contagion.txt | 12 - res/cardsfolder/contagion_clasp.txt | 11 - res/cardsfolder/contagion_engine.txt | 12 - res/cardsfolder/contagious_nim.txt | 10 - res/cardsfolder/contaminated_bond.txt | 16 - res/cardsfolder/contaminated_ground.txt | 12 - res/cardsfolder/contemplation.txt | 10 - res/cardsfolder/contested_war_zone.txt | 10 - res/cardsfolder/control_magic.txt | 14 - res/cardsfolder/control_of_the_court.txt | 10 - res/cardsfolder/controvert.txt | 10 - res/cardsfolder/convalescence.txt | 10 - res/cardsfolder/convalescent_care.txt | 11 - res/cardsfolder/conversion.txt | 15 - res/cardsfolder/conversion_chamber.txt | 11 - res/cardsfolder/conviction.txt | 11 - res/cardsfolder/convincing_mirage.txt | 10 - res/cardsfolder/convolute.txt | 9 - res/cardsfolder/copper_carapace.txt | 10 - res/cardsfolder/copper_gnomes.txt | 10 - res/cardsfolder/copper_leaf_angel.txt | 13 - res/cardsfolder/copper_myr.txt | 11 - res/cardsfolder/copper_tablet.txt | 15 - res/cardsfolder/copperhorn_scout.txt | 11 - res/cardsfolder/copperline_gorge.txt | 11 - res/cardsfolder/copy_artifact.txt | 11 - res/cardsfolder/coral_atoll.txt | 11 - res/cardsfolder/coral_eel.txt | 12 - res/cardsfolder/coral_fighters.txt | 12 - res/cardsfolder/coral_helm.txt | 12 - res/cardsfolder/coral_merfolk.txt | 11 - res/cardsfolder/coral_reef.txt | 12 - res/cardsfolder/coral_trickster.txt | 13 - res/cardsfolder/coralhelm_commander.txt | 14 - res/cardsfolder/core_prowler.txt | 12 - res/cardsfolder/coretapper.txt | 12 - res/cardsfolder/corpse_connoisseur.txt | 13 - res/cardsfolder/corpse_cur.txt | 12 - res/cardsfolder/corpse_harvester.txt | 12 - res/cardsfolder/corpsehatch.txt | 11 - res/cardsfolder/corpulent_corpse.txt | 11 - res/cardsfolder/corrosive_gale.txt | 10 - res/cardsfolder/corrosive_mentor.txt | 11 - res/cardsfolder/corrupt.txt | 14 - res/cardsfolder/corrupt_court_official.txt | 11 - res/cardsfolder/corrupt_eunuchs.txt | 12 - res/cardsfolder/corrupt_official.txt | 12 - res/cardsfolder/corrupted_conscience.txt | 11 - res/cardsfolder/corrupted_harvester.txt | 11 - res/cardsfolder/corrupted_zendikon.txt | 12 - res/cardsfolder/cosis_ravager.txt | 11 - res/cardsfolder/cosis_trickster.txt | 11 - res/cardsfolder/cosmic_horror.txt | 12 - res/cardsfolder/council_of_advisors.txt | 11 - res/cardsfolder/counsel_of_the_soratami.txt | 10 - res/cardsfolder/counterbalance.txt | 12 - res/cardsfolder/counterintelligence.txt | 9 - res/cardsfolder/counterspell.txt | 20 - res/cardsfolder/countersquall.txt | 10 - res/cardsfolder/courier_hawk.txt | 11 - res/cardsfolder/couriers_capsule.txt | 9 - res/cardsfolder/court_archers.txt | 11 - res/cardsfolder/court_homunculus.txt | 10 - res/cardsfolder/cover_of_darkness.txt | 9 - res/cardsfolder/covert_operative.txt | 10 - res/cardsfolder/covetous_dragon.txt | 13 - res/cardsfolder/cowardice.txt | 11 - res/cardsfolder/crab_umbra.txt | 12 - res/cardsfolder/crabapple_cohort.txt | 11 - res/cardsfolder/crack_the_earth.txt | 9 - res/cardsfolder/crackdown.txt | 10 - res/cardsfolder/crackling_club.txt | 11 - res/cardsfolder/cradle_guard.txt | 11 - res/cardsfolder/cradle_of_vitality.txt | 11 - res/cardsfolder/cradle_to_grave.txt | 9 - res/cardsfolder/crafty_pathmage.txt | 12 - res/cardsfolder/crag_puca.txt | 10 - res/cardsfolder/cranial_extraction.txt | 8 - res/cardsfolder/crash.txt | 10 - res/cardsfolder/crash_landing.txt | 11 - res/cardsfolder/crash_of_rhinos.txt | 10 - res/cardsfolder/crashing_centaur.txt | 11 - res/cardsfolder/crater_hellion.txt | 12 - res/cardsfolder/craven_giant.txt | 11 - res/cardsfolder/craven_knight.txt | 10 - res/cardsfolder/craw_giant.txt | 13 - res/cardsfolder/craw_wurm.txt | 18 - res/cardsfolder/crawling_filth.txt | 12 - res/cardsfolder/crawlspace.txt | 8 - res/cardsfolder/crazed_armodon.txt | 11 - res/cardsfolder/crazed_goblin.txt | 10 - res/cardsfolder/crazed_skirge.txt | 11 - res/cardsfolder/creakwood_ghoul.txt | 11 - res/cardsfolder/creakwood_liege.txt | 14 - res/cardsfolder/cream_of_the_crop.txt | 12 - res/cardsfolder/creeping_corrosion.txt | 9 - res/cardsfolder/creeping_mold.txt | 15 - res/cardsfolder/creeping_tar_pit.txt | 12 - res/cardsfolder/cremate.txt | 11 - res/cardsfolder/crenellated_wall.txt | 11 - res/cardsfolder/crevasse.txt | 9 - res/cardsfolder/crib_swap.txt | 11 - res/cardsfolder/crimson_acolyte.txt | 11 - res/cardsfolder/crimson_kobolds.txt | 10 - res/cardsfolder/crimson_manticore.txt | 13 - res/cardsfolder/crimson_roc.txt | 12 - res/cardsfolder/crimson_wisps.txt | 11 - res/cardsfolder/crippling_fatigue.txt | 10 - res/cardsfolder/cromat.txt | 14 - res/cardsfolder/crookclaw_elder.txt | 12 - res/cardsfolder/crookclaw_transmuter.txt | 14 - res/cardsfolder/crookshank_kobolds.txt | 10 - res/cardsfolder/crop_rotation.txt | 10 - res/cardsfolder/crosiss_attendant.txt | 11 - res/cardsfolder/crosiss_catacombs.txt | 12 - res/cardsfolder/crosiss_charm.txt | 12 - res/cardsfolder/crossbow_ambush.txt | 12 - res/cardsfolder/crossbow_infantry.txt | 13 - res/cardsfolder/crosswinds.txt | 11 - res/cardsfolder/crovax_ascendant_hero.txt | 13 - res/cardsfolder/crowd_favorites.txt | 11 - res/cardsfolder/crowd_of_cinders.txt | 12 - res/cardsfolder/crown_of_flames.txt | 13 - res/cardsfolder/crucible_of_fire.txt | 11 - res/cardsfolder/crucible_of_worlds.txt | 9 - res/cardsfolder/crude_rampart.txt | 11 - res/cardsfolder/cruel_bargain.txt | 11 - res/cardsfolder/cruel_edict.txt | 11 - res/cardsfolder/cruel_fate.txt | 10 - res/cardsfolder/cruel_revival.txt | 10 - res/cardsfolder/cruel_tutor.txt | 10 - res/cardsfolder/cruel_ultimatum.txt | 14 - res/cardsfolder/crumble.txt | 14 - res/cardsfolder/crumbling_ashes.txt | 10 - res/cardsfolder/crumbling_necropolis.txt | 12 - res/cardsfolder/crumbling_sanctuary.txt | 9 - res/cardsfolder/crusade.txt | 16 - res/cardsfolder/crusading_knight.txt | 13 - res/cardsfolder/crush.txt | 9 - res/cardsfolder/crush_of_wurms.txt | 10 - res/cardsfolder/crusher_zendikon.txt | 12 - res/cardsfolder/crushing_pain.txt | 9 - res/cardsfolder/cryoclasm.txt | 11 - res/cardsfolder/crypt_angel.txt | 13 - res/cardsfolder/crypt_cobra.txt | 11 - res/cardsfolder/crypt_creeper.txt | 11 - res/cardsfolder/crypt_of_agadeem.txt | 14 - res/cardsfolder/crypt_ripper.txt | 11 - res/cardsfolder/crypt_sliver.txt | 12 - res/cardsfolder/cryptic_annelid.txt | 14 - res/cardsfolder/cryptic_command.txt | 9 - res/cardsfolder/cryptwailing.txt | 10 - res/cardsfolder/crystal_ball.txt | 10 - res/cardsfolder/crystal_chimes.txt | 10 - res/cardsfolder/crystal_quarry.txt | 11 - res/cardsfolder/crystal_rod.txt | 19 - res/cardsfolder/crystal_seer.txt | 13 - res/cardsfolder/crystal_shard.txt | 11 - res/cardsfolder/crystal_vein.txt | 12 - res/cardsfolder/crystalline_sliver.txt | 11 - res/cardsfolder/crystallization.txt | 11 - res/cardsfolder/cudgel_troll.txt | 11 - res/cardsfolder/culling_dais.txt | 12 - res/cardsfolder/culling_sun.txt | 9 - res/cardsfolder/culling_the_weak.txt | 10 - res/cardsfolder/cultbrand_cinder.txt | 11 - res/cardsfolder/cultivate.txt | 10 - res/cardsfolder/cumber_stone.txt | 10 - res/cardsfolder/cunning.txt | 14 - res/cardsfolder/cunning_advisor.txt | 10 - res/cardsfolder/cunning_lethemancer.txt | 11 - res/cardsfolder/cunning_sparkmage.txt | 11 - res/cardsfolder/curfew.txt | 11 - res/cardsfolder/curiosity.txt | 13 - res/cardsfolder/curse_of_chains.txt | 11 - res/cardsfolder/curse_of_marit_lage.txt | 12 - res/cardsfolder/curse_of_wizardry.txt | 8 - res/cardsfolder/cursecatcher.txt | 11 - res/cardsfolder/cursed_flesh.txt | 11 - res/cardsfolder/cursed_land.txt | 16 - res/cardsfolder/cursed_rack.txt | 10 - res/cardsfolder/cursed_ronin.txt | 11 - res/cardsfolder/cursed_scroll.txt | 8 - res/cardsfolder/cursed_totem.txt | 11 - res/cardsfolder/customs_depot.txt | 12 - res/cardsfolder/cut_the_earthly_bond.txt | 9 - res/cardsfolder/cutthroat_il_dal.txt | 10 - res/cardsfolder/cyclical_evolution.txt | 13 - res/cardsfolder/cyclopean_mummy.txt | 12 - res/cardsfolder/cyclopean_snare.txt | 10 - res/cardsfolder/cylian_elf.txt | 9 - res/cardsfolder/cylian_sunsinger.txt | 10 - res/cardsfolder/cystbearer.txt | 10 - res/cardsfolder/daggerback_basilisk.txt | 10 - res/cardsfolder/daggerclaw_imp.txt | 11 - res/cardsfolder/daily_regimen.txt | 11 - res/cardsfolder/dakkon_blackblade.txt | 11 - res/cardsfolder/dakmor_bat.txt | 10 - res/cardsfolder/dakmor_ghoul.txt | 12 - res/cardsfolder/dakmor_lancer.txt | 12 - res/cardsfolder/dakmor_plague.txt | 10 - res/cardsfolder/dakmor_salvage.txt | 12 - res/cardsfolder/dakmor_scorpion.txt | 10 - res/cardsfolder/dakmor_sorceress.txt | 11 - res/cardsfolder/damnation.txt | 9 - res/cardsfolder/damping_field.txt | 9 - res/cardsfolder/dance_of_many.txt | 17 - res/cardsfolder/dance_of_shadows.txt | 11 - res/cardsfolder/dance_of_the_dead.txt | 9 - res/cardsfolder/dancing_scimitar.txt | 15 - res/cardsfolder/dandan.txt | 14 - res/cardsfolder/daraja_griffin.txt | 12 - res/cardsfolder/darba.txt | 10 - res/cardsfolder/darien_king_of_kjeldor.txt | 12 - res/cardsfolder/darigaazs_attendant.txt | 11 - res/cardsfolder/darigaazs_caldera.txt | 12 - res/cardsfolder/darigaazs_charm.txt | 12 - res/cardsfolder/daring_apprentice.txt | 14 - res/cardsfolder/daring_leap.txt | 9 - res/cardsfolder/dark_banishing.txt | 14 - res/cardsfolder/dark_confidant.txt | 9 - res/cardsfolder/dark_depths.txt | 8 - res/cardsfolder/dark_hatchling.txt | 12 - res/cardsfolder/dark_heart_of_the_wood.txt | 11 - res/cardsfolder/dark_maze.txt | 13 - res/cardsfolder/dark_offering.txt | 11 - res/cardsfolder/dark_privilege.txt | 12 - res/cardsfolder/dark_ritual.txt | 20 - res/cardsfolder/dark_temper.txt | 11 - res/cardsfolder/dark_triumph.txt | 11 - res/cardsfolder/dark_tutelage.txt | 8 - res/cardsfolder/dark_withering.txt | 10 - res/cardsfolder/darkblast.txt | 10 - res/cardsfolder/darkest_hour.txt | 11 - res/cardsfolder/darkheart_sliver.txt | 12 - res/cardsfolder/darkling_stalker.txt | 11 - res/cardsfolder/darklit_gargoyle.txt | 11 - res/cardsfolder/darkness.txt | 10 - res/cardsfolder/darkslick_drake.txt | 13 - res/cardsfolder/darkslick_shores.txt | 11 - res/cardsfolder/darksteel_axe.txt | 10 - res/cardsfolder/darksteel_brute.txt | 10 - res/cardsfolder/darksteel_citadel.txt | 10 - res/cardsfolder/darksteel_colossus.txt | 14 - res/cardsfolder/darksteel_forge.txt | 9 - res/cardsfolder/darksteel_gargoyle.txt | 11 - res/cardsfolder/darksteel_ingot.txt | 14 - res/cardsfolder/darksteel_juggernaut.txt | 13 - res/cardsfolder/darksteel_myr.txt | 10 - res/cardsfolder/darksteel_pendant.txt | 11 - res/cardsfolder/darksteel_plate.txt | 10 - res/cardsfolder/darksteel_relic.txt | 10 - res/cardsfolder/darksteel_sentinel.txt | 12 - res/cardsfolder/darkwatch_elves.txt | 11 - res/cardsfolder/darkwater_catacombs.txt | 10 - res/cardsfolder/darkwater_egg.txt | 11 - res/cardsfolder/darting_merfolk.txt | 10 - res/cardsfolder/daru_cavalier.txt | 12 - res/cardsfolder/daru_encampment.txt | 10 - res/cardsfolder/daru_healer.txt | 11 - res/cardsfolder/daru_lancer.txt | 11 - res/cardsfolder/daru_mender.txt | 12 - res/cardsfolder/daru_sanctifier.txt | 12 - res/cardsfolder/daru_warchief.txt | 12 - res/cardsfolder/daunting_defender.txt | 10 - res/cardsfolder/dauntless_dourbark.txt | 13 - res/cardsfolder/dauntless_escort.txt | 11 - res/cardsfolder/dauthi_cutthroat.txt | 11 - res/cardsfolder/dauthi_embrace.txt | 9 - res/cardsfolder/dauthi_ghoul.txt | 12 - res/cardsfolder/dauthi_horror.txt | 11 - res/cardsfolder/dauthi_jackal.txt | 11 - res/cardsfolder/dauthi_marauder.txt | 10 - res/cardsfolder/dauthi_mercenary.txt | 11 - res/cardsfolder/dauthi_mindripper.txt | 13 - res/cardsfolder/dauthi_slayer.txt | 12 - res/cardsfolder/dauthi_trapper.txt | 10 - res/cardsfolder/dauthi_warlord.txt | 11 - res/cardsfolder/davenant_archer.txt | 12 - res/cardsfolder/davenant_healer.txt | 11 - res/cardsfolder/dawn_elemental.txt | 11 - res/cardsfolder/dawn_of_the_dead.txt | 14 - res/cardsfolder/dawnglare_invoker.txt | 10 - res/cardsfolder/dawning_purist.txt | 12 - res/cardsfolder/dawnray_archer.txt | 11 - res/cardsfolder/dawnstrider.txt | 10 - res/cardsfolder/day_of_destiny.txt | 11 - res/cardsfolder/day_of_judgment.txt | 10 - res/cardsfolder/day_of_the_dragons.txt | 8 - res/cardsfolder/daze.txt | 11 - res/cardsfolder/deadapult.txt | 9 - res/cardsfolder/deadfall.txt | 9 - res/cardsfolder/deadly_grub.txt | 10 - res/cardsfolder/deadly_insect.txt | 11 - res/cardsfolder/deadly_recluse.txt | 11 - res/cardsfolder/deadshot_minotaur.txt | 12 - res/cardsfolder/deadwood_treefolk.txt | 13 - res/cardsfolder/death_baron.txt | 10 - res/cardsfolder/death_bomb.txt | 11 - res/cardsfolder/death_cloud.txt | 14 - res/cardsfolder/death_cultist.txt | 11 - res/cardsfolder/death_denied.txt | 13 - res/cardsfolder/death_grasp.txt | 11 - res/cardsfolder/death_hood_cobra.txt | 11 - res/cardsfolder/death_mutation.txt | 12 - .../death_of_a_thousand_stings.txt | 13 - res/cardsfolder/death_pits_of_rath.txt | 12 - res/cardsfolder/death_pulse.txt | 12 - res/cardsfolder/death_speakers.txt | 11 - res/cardsfolder/death_stroke.txt | 9 - res/cardsfolder/death_ward.txt | 15 - res/cardsfolder/deathbringer_liege.txt | 16 - res/cardsfolder/deathbringer_thoctar.txt | 12 - res/cardsfolder/deathforge_shaman.txt | 13 - res/cardsfolder/deathgazer.txt | 17 - res/cardsfolder/deathgreeter.txt | 11 - res/cardsfolder/deathgrip.txt | 15 - res/cardsfolder/deathknell_kami.txt | 13 - res/cardsfolder/deathless_angel.txt | 11 - res/cardsfolder/deathmark.txt | 12 - res/cardsfolder/deathmark_prelate.txt | 11 - res/cardsfolder/deathmask_nezumi.txt | 10 - res/cardsfolder/deaths_duet.txt | 9 - res/cardsfolder/deaths_head_buzzard.txt | 13 - res/cardsfolder/deaths_shadow.txt | 12 - res/cardsfolder/deathspore_thallid.txt | 13 - res/cardsfolder/debtors_knell.txt | 10 - res/cardsfolder/deception.txt | 9 - res/cardsfolder/decimate.txt | 12 - res/cardsfolder/decimator_web.txt | 11 - res/cardsfolder/deconstruct.txt | 10 - res/cardsfolder/decree_of_annihilation.txt | 16 - res/cardsfolder/decree_of_justice.txt | 14 - res/cardsfolder/decree_of_savagery.txt | 12 - res/cardsfolder/dedicated_martyr.txt | 10 - res/cardsfolder/deep_analysis.txt | 10 - res/cardsfolder/deep_reconnaissance.txt | 10 - res/cardsfolder/deep_sea_serpent.txt | 10 - res/cardsfolder/deep_slumber_titan.txt | 13 - res/cardsfolder/deepchannel_mentor.txt | 11 - res/cardsfolder/deeptread_merrow.txt | 10 - res/cardsfolder/deepwood_drummer.txt | 10 - res/cardsfolder/deepwood_ghoul.txt | 10 - res/cardsfolder/deepwood_tantiv.txt | 11 - res/cardsfolder/deepwood_wolverine.txt | 11 - res/cardsfolder/defender_of_chaos.txt | 11 - res/cardsfolder/defender_of_law.txt | 11 - res/cardsfolder/defender_of_the_order.txt | 12 - res/cardsfolder/defense_grid.txt | 11 - res/cardsfolder/defense_of_the_heart.txt | 11 - res/cardsfolder/defensive_stance.txt | 11 - res/cardsfolder/defiant_elf.txt | 10 - res/cardsfolder/defiant_falcon.txt | 12 - res/cardsfolder/defiler_of_souls.txt | 12 - res/cardsfolder/deft_duelist.txt | 11 - res/cardsfolder/defy_gravity.txt | 10 - res/cardsfolder/dega_disciple.txt | 11 - res/cardsfolder/dega_sanctuary.txt | 9 - res/cardsfolder/deglamer.txt | 9 - res/cardsfolder/dehydration.txt | 13 - res/cardsfolder/deity_of_scars.txt | 12 - res/cardsfolder/deja_vu.txt | 10 - res/cardsfolder/delirium.txt | 12 - res/cardsfolder/delirium_skeins.txt | 11 - res/cardsfolder/delraich.txt | 11 - res/cardsfolder/deluge.txt | 10 - res/cardsfolder/delusions_of_mediocrity.txt | 13 - res/cardsfolder/dematerialize.txt | 10 - res/cardsfolder/dementia_bat.txt | 11 - res/cardsfolder/demigod_of_revenge.txt | 11 - res/cardsfolder/demolish.txt | 14 - res/cardsfolder/demon_of_deaths_gate.txt | 12 - res/cardsfolder/demonic_appetite.txt | 13 - res/cardsfolder/demonic_consultation.txt | 9 - res/cardsfolder/demonic_dread.txt | 10 - res/cardsfolder/demonic_hordes.txt | 14 - res/cardsfolder/demonic_torment.txt | 10 - res/cardsfolder/demonic_tutor.txt | 12 - res/cardsfolder/demons_horn.txt | 15 - res/cardsfolder/demons_jester.txt | 12 - res/cardsfolder/demonspine_whip.txt | 12 - res/cardsfolder/demystify.txt | 13 - res/cardsfolder/denizen_of_the_deep.txt | 13 - res/cardsfolder/dense_canopy.txt | 11 - res/cardsfolder/dense_foliage.txt | 11 - res/cardsfolder/deny_reality.txt | 10 - res/cardsfolder/denying_wind.txt | 10 - res/cardsfolder/deprive.txt | 10 - res/cardsfolder/deranged_hermit.txt | 13 - res/cardsfolder/derelor.txt | 12 - res/cardsfolder/descendant_of_soramaro.txt | 11 - res/cardsfolder/desecrated_earth.txt | 10 - res/cardsfolder/desert.txt | 11 - res/cardsfolder/desert_drake.txt | 10 - res/cardsfolder/desert_nomads.txt | 11 - res/cardsfolder/desert_sandstorm.txt | 9 - res/cardsfolder/desert_twister.txt | 13 - res/cardsfolder/deserted_temple.txt | 10 - res/cardsfolder/desolation_angel.txt | 15 - res/cardsfolder/desolation_giant.txt | 15 - res/cardsfolder/desperate_charge.txt | 9 - res/cardsfolder/despise.txt | 9 - res/cardsfolder/despoil.txt | 10 - res/cardsfolder/despondency.txt | 13 - res/cardsfolder/despotic_scepter.txt | 10 - res/cardsfolder/destructive_flow.txt | 11 - res/cardsfolder/destructive_force.txt | 11 - res/cardsfolder/destructive_urge.txt | 12 - res/cardsfolder/detonate.txt | 15 - res/cardsfolder/deus_of_calamity.txt | 12 - res/cardsfolder/devastate.txt | 10 - res/cardsfolder/devastating_summons.txt | 11 - res/cardsfolder/devastation.txt | 10 - res/cardsfolder/devoted_druid.txt | 12 - res/cardsfolder/devoted_hero.txt | 10 - res/cardsfolder/devoted_retainer.txt | 10 - res/cardsfolder/devour_in_shadow.txt | 11 - res/cardsfolder/devouring_deep.txt | 10 - res/cardsfolder/devout_harpist.txt | 10 - res/cardsfolder/devout_lightcaster.txt | 12 - res/cardsfolder/devout_monk.txt | 11 - res/cardsfolder/devout_witness.txt | 10 - res/cardsfolder/dewdrop_spy.txt | 14 - res/cardsfolder/diabolic_edict.txt | 9 - res/cardsfolder/diabolic_intent.txt | 10 - res/cardsfolder/diabolic_machine.txt | 12 - res/cardsfolder/diabolic_tutor.txt | 14 - res/cardsfolder/diabolic_vision.txt | 10 - res/cardsfolder/diamond_faerie.txt | 12 - res/cardsfolder/diamond_kaleidoscope.txt | 15 - res/cardsfolder/diamond_valley.txt | 10 - res/cardsfolder/didgeridoo.txt | 10 - res/cardsfolder/diligent_farmhand.txt | 10 - res/cardsfolder/diminish.txt | 10 - res/cardsfolder/diminishing_returns.txt | 14 - res/cardsfolder/dimir_aqueduct.txt | 13 - res/cardsfolder/dimir_cutpurse.txt | 12 - res/cardsfolder/dimir_guildmage.txt | 11 - res/cardsfolder/dimir_house_guard.txt | 12 - res/cardsfolder/dimir_infiltrator.txt | 11 - res/cardsfolder/dimir_machinations.txt | 11 - res/cardsfolder/dimir_signet.txt | 10 - res/cardsfolder/din_of_the_fireherd.txt | 13 - res/cardsfolder/dingus_egg.txt | 19 - res/cardsfolder/dingus_staff.txt | 11 - res/cardsfolder/diplomatic_escort.txt | 10 - res/cardsfolder/diplomatic_immunity.txt | 11 - res/cardsfolder/dire_undercurrents.txt | 13 - res/cardsfolder/dirge_of_dread.txt | 12 - res/cardsfolder/dirtcowl_wurm.txt | 11 - res/cardsfolder/dirtwater_wraith.txt | 11 - res/cardsfolder/dirty_wererat.txt | 11 - res/cardsfolder/disappear.txt | 12 - res/cardsfolder/disciple_of_grace.txt | 12 - res/cardsfolder/disciple_of_kangee.txt | 9 - res/cardsfolder/disciple_of_law.txt | 11 - res/cardsfolder/disciple_of_malice.txt | 11 - res/cardsfolder/disciple_of_tevesh_szat.txt | 11 - res/cardsfolder/disciple_of_the_vault.txt | 11 - res/cardsfolder/discombobulate.txt | 11 - res/cardsfolder/discordant_dirge.txt | 12 - res/cardsfolder/disease_carriers.txt | 11 - res/cardsfolder/disembowel.txt | 11 - res/cardsfolder/disempower.txt | 9 - res/cardsfolder/disenchant.txt | 22 - res/cardsfolder/disentomb.txt | 9 - res/cardsfolder/disfigure.txt | 9 - res/cardsfolder/disintegrate.txt | 17 - res/cardsfolder/dismal_failure.txt | 10 - res/cardsfolder/dismember.txt | 9 - res/cardsfolder/dismiss.txt | 10 - res/cardsfolder/disorient.txt | 10 - res/cardsfolder/dispatch.txt | 11 - res/cardsfolder/dispel.txt | 9 - res/cardsfolder/dispellers_capsule.txt | 9 - res/cardsfolder/dispense_justice.txt | 10 - res/cardsfolder/disperse.txt | 10 - res/cardsfolder/dispersing_orb.txt | 10 - res/cardsfolder/disrupt.txt | 11 - res/cardsfolder/disrupting_scepter.txt | 18 - res/cardsfolder/disruptive_pitmage.txt | 11 - res/cardsfolder/disruptive_student.txt | 10 - res/cardsfolder/dissipate.txt | 9 - res/cardsfolder/dissipation_field.txt | 10 - res/cardsfolder/distress.txt | 10 - res/cardsfolder/disturbed_burial.txt | 10 - res/cardsfolder/dive_bomber.txt | 12 - res/cardsfolder/divebomber_griffin.txt | 12 - res/cardsfolder/diversionary_tactics.txt | 10 - res/cardsfolder/divination.txt | 9 - res/cardsfolder/divine_offering.txt | 14 - res/cardsfolder/divine_presence.txt | 10 - res/cardsfolder/divine_retribution.txt | 10 - res/cardsfolder/divine_sacrament.txt | 11 - res/cardsfolder/divine_transformation.txt | 13 - res/cardsfolder/divine_verdict.txt | 9 - res/cardsfolder/diving_griffin.txt | 12 - res/cardsfolder/divinity_of_pride.txt | 12 - res/cardsfolder/dizzy_spell.txt | 11 - res/cardsfolder/djinn_of_the_lamp.txt | 10 - res/cardsfolder/do_or_die.txt | 10 - res/cardsfolder/dodecapod.txt | 11 - res/cardsfolder/dogged_hunter.txt | 10 - res/cardsfolder/dogpile.txt | 11 - res/cardsfolder/dolmen_gate.txt | 9 - res/cardsfolder/domestication.txt | 12 - res/cardsfolder/dominate.txt | 11 - res/cardsfolder/dominus_of_fealty.txt | 12 - res/cardsfolder/donate.txt | 9 - res/cardsfolder/doom_blade.txt | 10 - res/cardsfolder/doomed_necromancer.txt | 11 - res/cardsfolder/doomsday.txt | 15 - res/cardsfolder/doomsday_specter.txt | 15 - res/cardsfolder/door_to_nothingness.txt | 11 - res/cardsfolder/doran_the_siege_tower.txt | 9 - res/cardsfolder/dormant_gomazoa.txt | 14 - res/cardsfolder/dormant_sliver.txt | 13 - res/cardsfolder/dormant_volcano.txt | 11 - res/cardsfolder/dosans_oldest_chant.txt | 10 - res/cardsfolder/double_cleave.txt | 9 - res/cardsfolder/doubling_season.txt | 8 - res/cardsfolder/doubtless_one.txt | 14 - res/cardsfolder/douse.txt | 10 - res/cardsfolder/douse_in_gloom.txt | 10 - res/cardsfolder/dovescape.txt | 12 - res/cardsfolder/downdraft.txt | 10 - res/cardsfolder/downhill_charge.txt | 11 - res/cardsfolder/dowsing_shaman.txt | 10 - res/cardsfolder/draconian_cylix.txt | 9 - res/cardsfolder/drag_down.txt | 11 - res/cardsfolder/dragon_appeasement.txt | 10 - res/cardsfolder/dragon_arch.txt | 10 - res/cardsfolder/dragon_blood.txt | 10 - res/cardsfolder/dragon_broodmother.txt | 10 - res/cardsfolder/dragon_engine.txt | 14 - res/cardsfolder/dragon_fodder.txt | 9 - res/cardsfolder/dragon_mage.txt | 13 - res/cardsfolder/dragon_roost.txt | 10 - res/cardsfolder/dragon_tyrant.txt | 14 - res/cardsfolder/dragon_whelp.txt | 17 - res/cardsfolder/dragonmaster_outcast.txt | 11 - res/cardsfolder/dragons_claw.txt | 15 - res/cardsfolder/dragonskull_summit.txt | 12 - res/cardsfolder/dragonsoul_knight.txt | 12 - res/cardsfolder/dragonspeaker_shaman.txt | 10 - res/cardsfolder/dragonstalker.txt | 11 - res/cardsfolder/dragonstorm.txt | 11 - res/cardsfolder/drain_the_well.txt | 10 - res/cardsfolder/drake_hatchling.txt | 11 - res/cardsfolder/drake_skull_cameo.txt | 10 - res/cardsfolder/drake_umbra.txt | 11 - res/cardsfolder/dralnus_crusade.txt | 11 - res/cardsfolder/dramatic_entrance.txt | 10 - .../drana_kalastria_bloodchief.txt | 14 - res/cardsfolder/drastic_revelation.txt | 11 - res/cardsfolder/dread.txt | 14 - res/cardsfolder/dread_drone.txt | 12 - res/cardsfolder/dread_of_night.txt | 11 - res/cardsfolder/dread_reaper.txt | 13 - res/cardsfolder/dread_return.txt | 10 - res/cardsfolder/dread_slag.txt | 14 - res/cardsfolder/dread_specter.txt | 15 - res/cardsfolder/dread_statuary.txt | 10 - res/cardsfolder/dread_warlock.txt | 10 - res/cardsfolder/dreadship_reef.txt | 11 - res/cardsfolder/dreadwing.txt | 10 - res/cardsfolder/dream_cache.txt | 11 - res/cardsfolder/dream_fracture.txt | 11 - res/cardsfolder/dream_prowler.txt | 12 - res/cardsfolder/dream_stalker.txt | 12 - res/cardsfolder/dreamborn_muse.txt | 17 - res/cardsfolder/dreamcatcher.txt | 12 - res/cardsfolder/dreamscape_artist.txt | 10 - res/cardsfolder/dreamspoiler_witches.txt | 12 - res/cardsfolder/dreamstone_hedron.txt | 11 - res/cardsfolder/dredge.txt | 11 - res/cardsfolder/dreg_reaver.txt | 9 - res/cardsfolder/dregs_of_sorrow.txt | 15 - res/cardsfolder/dregscape_zombie.txt | 10 - res/cardsfolder/drekavac.txt | 10 - res/cardsfolder/drelnoch.txt | 11 - res/cardsfolder/drift_of_phantasms.txt | 12 - res/cardsfolder/drift_of_the_dead.txt | 12 - res/cardsfolder/drifter_il_dal.txt | 11 - res/cardsfolder/drifting_djinn.txt | 12 - res/cardsfolder/drifting_meadow.txt | 12 - res/cardsfolder/drill_skimmer.txt | 11 - res/cardsfolder/dripping_dead.txt | 12 - res/cardsfolder/dripping_tongue_zubera.txt | 12 - res/cardsfolder/dromad_purebred.txt | 11 - res/cardsfolder/dromars_attendant.txt | 11 - res/cardsfolder/dromars_cavern.txt | 12 - res/cardsfolder/dromosaur.txt | 12 - res/cardsfolder/drooling_groodion.txt | 11 - res/cardsfolder/drooling_ogre.txt | 12 - res/cardsfolder/drop_of_honey.txt | 9 - res/cardsfolder/dross_crocodile.txt | 10 - res/cardsfolder/dross_golem.txt | 11 - res/cardsfolder/dross_harvester.txt | 14 - res/cardsfolder/dross_hopper.txt | 10 - res/cardsfolder/dross_prowler.txt | 10 - res/cardsfolder/dross_ripper.txt | 10 - res/cardsfolder/dross_scorpion.txt | 12 - res/cardsfolder/drove_of_elves.txt | 12 - res/cardsfolder/drowned.txt | 10 - res/cardsfolder/drowned_catacomb.txt | 12 - res/cardsfolder/drowned_rusalka.txt | 12 - res/cardsfolder/drowner_initiate.txt | 11 - res/cardsfolder/drowner_of_secrets.txt | 10 - res/cardsfolder/drudge_reavers.txt | 11 - res/cardsfolder/drudge_skeletons.txt | 21 - res/cardsfolder/drudge_spell.txt | 13 - res/cardsfolder/druid_lyrist.txt | 10 - res/cardsfolder/druid_of_the_anima.txt | 12 - res/cardsfolder/druids_call.txt | 12 - res/cardsfolder/drumhunter.txt | 12 - res/cardsfolder/dry_spell.txt | 11 - res/cardsfolder/dryad_arbor.txt | 10 - res/cardsfolder/dryad_sophisticate.txt | 10 - res/cardsfolder/dryads_favor.txt | 10 - res/cardsfolder/dueling_grounds.txt | 9 - res/cardsfolder/duergar_assailant.txt | 11 - res/cardsfolder/duergar_cave_guard.txt | 11 - res/cardsfolder/duergar_hedge_mage.txt | 13 - res/cardsfolder/duergar_mine_captain.txt | 10 - res/cardsfolder/dune_brood_nephilim.txt | 12 - res/cardsfolder/dunerider_outlaw.txt | 10 - res/cardsfolder/dungeon_shade.txt | 11 - res/cardsfolder/duress.txt | 12 - res/cardsfolder/durkwood_baloth.txt | 10 - res/cardsfolder/durkwood_boars.txt | 12 - res/cardsfolder/dusk_imp.txt | 12 - res/cardsfolder/duskdale_wurm.txt | 11 - .../duskmantle_house_of_shadow.txt | 10 - res/cardsfolder/duskrider_falcon.txt | 11 - res/cardsfolder/duskrider_peregrine.txt | 12 - res/cardsfolder/dust_bowl.txt | 10 - res/cardsfolder/dust_corona.txt | 10 - res/cardsfolder/dust_elemental.txt | 15 - res/cardsfolder/dust_to_dust.txt | 10 - res/cardsfolder/dwarven_armorer.txt | 12 - res/cardsfolder/dwarven_armory.txt | 10 - res/cardsfolder/dwarven_berserker.txt | 11 - res/cardsfolder/dwarven_blastminer.txt | 11 - res/cardsfolder/dwarven_bloodboiler.txt | 11 - res/cardsfolder/dwarven_demolition_team.txt | 13 - res/cardsfolder/dwarven_grunt.txt | 10 - res/cardsfolder/dwarven_hold.txt | 12 - res/cardsfolder/dwarven_lieutenant.txt | 10 - res/cardsfolder/dwarven_miner.txt | 10 - res/cardsfolder/dwarven_nomad.txt | 10 - res/cardsfolder/dwarven_patrol.txt | 13 - res/cardsfolder/dwarven_pony.txt | 10 - res/cardsfolder/dwarven_ruins.txt | 14 - res/cardsfolder/dwarven_soldier.txt | 13 - res/cardsfolder/dwarven_song.txt | 11 - res/cardsfolder/dwarven_strike_force.txt | 10 - res/cardsfolder/dwarven_thaumaturgist.txt | 11 - res/cardsfolder/dwarven_trader.txt | 9 - res/cardsfolder/dwarven_vigilantes.txt | 13 - res/cardsfolder/dwarven_warriors.txt | 15 - res/cardsfolder/dwarven_weaponsmith.txt | 12 - res/cardsfolder/dying_wail.txt | 12 - res/cardsfolder/eager_cadet.txt | 10 - res/cardsfolder/early_frost.txt | 10 - res/cardsfolder/earnest_fellowship.txt | 14 - res/cardsfolder/earsplitting_rats.txt | 13 - res/cardsfolder/earth_elemental.txt | 15 - res/cardsfolder/earth_rift.txt | 10 - res/cardsfolder/earth_servant.txt | 12 - res/cardsfolder/earth_surge.txt | 11 - res/cardsfolder/earthbind.txt | 12 - res/cardsfolder/earthblighter.txt | 10 - res/cardsfolder/earthbrawn.txt | 12 - res/cardsfolder/earthcraft.txt | 10 - res/cardsfolder/earthen_goo.txt | 13 - res/cardsfolder/earthlink.txt | 12 - res/cardsfolder/earthquake.txt | 20 - res/cardsfolder/earthshaker.txt | 13 - res/cardsfolder/eastern_paladin.txt | 13 - res/cardsfolder/eater_of_days.txt | 13 - res/cardsfolder/ebon_dragon.txt | 12 - res/cardsfolder/ebon_drake.txt | 13 - res/cardsfolder/ebon_praetor.txt | 17 - res/cardsfolder/ebon_stronghold.txt | 14 - res/cardsfolder/ebony_horse.txt | 13 - res/cardsfolder/ebony_owl_netsuke.txt | 10 - res/cardsfolder/ebony_rhino.txt | 10 - res/cardsfolder/ebony_treefolk.txt | 10 - res/cardsfolder/echo_mage.txt | 18 - res/cardsfolder/echo_tracer.txt | 12 - res/cardsfolder/echoing_courage.txt | 9 - res/cardsfolder/echoing_decay.txt | 9 - res/cardsfolder/echoing_truth.txt | 8 - res/cardsfolder/edge_of_autumn.txt | 11 - res/cardsfolder/edge_of_the_divinity.txt | 14 - res/cardsfolder/edgewalker.txt | 11 - res/cardsfolder/eel_umbra.txt | 12 - res/cardsfolder/eerie_procession.txt | 10 - res/cardsfolder/eiganjo_castle.txt | 10 - res/cardsfolder/eiganjo_free_riders.txt | 13 - res/cardsfolder/eightfold_maze.txt | 9 - res/cardsfolder/ekundu_griffin.txt | 12 - res/cardsfolder/el_hajjaj.txt | 14 - res/cardsfolder/eladamri_lord_of_leaves.txt | 12 - res/cardsfolder/eladamris_call.txt | 9 - res/cardsfolder/eladamris_vineyard.txt | 10 - res/cardsfolder/eland_umbra.txt | 11 - res/cardsfolder/elder_druid.txt | 14 - res/cardsfolder/elder_mastery.txt | 12 - res/cardsfolder/eldrazi_conscription.txt | 10 - res/cardsfolder/eldrazi_monument.txt | 11 - res/cardsfolder/electric_eel.txt | 13 - res/cardsfolder/electrolyze.txt | 12 - res/cardsfolder/electropotence.txt | 11 - res/cardsfolder/elemental_augury.txt | 10 - res/cardsfolder/elemental_mastery.txt | 12 - res/cardsfolder/elephant_ambush.txt | 10 - res/cardsfolder/elephant_graveyard.txt | 10 - res/cardsfolder/elephant_guide.txt | 12 - res/cardsfolder/elesh_norn_grand_cenobite.txt | 13 - res/cardsfolder/elf_replica.txt | 10 - res/cardsfolder/elfhame_palace.txt | 12 - res/cardsfolder/elite_archers.txt | 12 - res/cardsfolder/elite_cat_warrior.txt | 10 - res/cardsfolder/elite_javelineer.txt | 12 - res/cardsfolder/elite_vanguard.txt | 10 - res/cardsfolder/elixir_of_immortality.txt | 11 - res/cardsfolder/elixir_of_vitality.txt | 11 - res/cardsfolder/elspeth_knight_errant.txt | 9 - res/cardsfolder/elspeth_tirel.txt | 13 - res/cardsfolder/elven_cache.txt | 10 - res/cardsfolder/elven_fortress.txt | 9 - res/cardsfolder/elven_lyre.txt | 9 - res/cardsfolder/elven_palisade.txt | 10 - res/cardsfolder/elven_riders.txt | 15 - res/cardsfolder/elven_rite.txt | 10 - res/cardsfolder/elven_warhounds.txt | 9 - res/cardsfolder/elves_of_deep_shadow.txt | 13 - res/cardsfolder/elvish_aberration.txt | 11 - res/cardsfolder/elvish_archdruid.txt | 15 - res/cardsfolder/elvish_archers.txt | 17 - res/cardsfolder/elvish_bard.txt | 11 - res/cardsfolder/elvish_berserker.txt | 14 - res/cardsfolder/elvish_branchbender.txt | 12 - res/cardsfolder/elvish_champion.txt | 15 - res/cardsfolder/elvish_eulogist.txt | 11 - res/cardsfolder/elvish_farmer.txt | 13 - res/cardsfolder/elvish_fury.txt | 10 - res/cardsfolder/elvish_guidance.txt | 14 - res/cardsfolder/elvish_handservant.txt | 12 - res/cardsfolder/elvish_harbinger.txt | 17 - res/cardsfolder/elvish_herder.txt | 10 - res/cardsfolder/elvish_hexhunter.txt | 10 - res/cardsfolder/elvish_hunter.txt | 10 - res/cardsfolder/elvish_lookout.txt | 10 - res/cardsfolder/elvish_lyrist.txt | 12 - res/cardsfolder/elvish_pathcutter.txt | 11 - res/cardsfolder/elvish_pioneer.txt | 12 - res/cardsfolder/elvish_piper.txt | 15 - res/cardsfolder/elvish_promenade.txt | 11 - res/cardsfolder/elvish_ranger.txt | 10 - res/cardsfolder/elvish_scout.txt | 12 - res/cardsfolder/elvish_scrapper.txt | 11 - res/cardsfolder/elvish_skysweeper.txt | 10 - res/cardsfolder/elvish_spirit_guide.txt | 11 - res/cardsfolder/elvish_vanguard.txt | 13 - res/cardsfolder/elvish_visionary.txt | 12 - res/cardsfolder/elvish_warrior.txt | 11 - res/cardsfolder/embargo.txt | 12 - res/cardsfolder/ember_fist_zubera.txt | 12 - res/cardsfolder/ember_hauler.txt | 10 - res/cardsfolder/ember_shot.txt | 10 - res/cardsfolder/ember_weaver.txt | 12 - res/cardsfolder/embermage_goblin.txt | 12 - res/cardsfolder/embersmith.txt | 11 - res/cardsfolder/emberstrike_duo.txt | 14 - res/cardsfolder/emberwilde_augur.txt | 10 - res/cardsfolder/emberwilde_caliph.txt | 16 - res/cardsfolder/emerald_dragonfly.txt | 11 - res/cardsfolder/emerald_medallion.txt | 10 - res/cardsfolder/emerald_oryx.txt | 10 - res/cardsfolder/emeria_angel.txt | 12 - res/cardsfolder/emeria_the_sky_ruin.txt | 12 - res/cardsfolder/emissary_of_despair.txt | 13 - res/cardsfolder/emissary_of_hope.txt | 13 - res/cardsfolder/emmessi_tome.txt | 10 - res/cardsfolder/emperor_crocodile.txt | 13 - res/cardsfolder/empress_galina.txt | 10 - res/cardsfolder/empty_shrine_kannushi.txt | 14 - res/cardsfolder/empty_the_catacombs.txt | 10 - res/cardsfolder/empty_the_warrens.txt | 10 - res/cardsfolder/empyrial_armor.txt | 12 - res/cardsfolder/empyrial_plate.txt | 11 - res/cardsfolder/emrakul_the_aeons_torn.txt | 16 - res/cardsfolder/emrakuls_hatcher.txt | 12 - res/cardsfolder/enatu_golem.txt | 11 - res/cardsfolder/enchanted_being.txt | 10 - res/cardsfolder/enchanted_evening.txt | 10 - res/cardsfolder/enchantresss_presence.txt | 11 - res/cardsfolder/enclave_cryptologist.txt | 17 - res/cardsfolder/enclave_elite.txt | 11 - res/cardsfolder/encroach.txt | 9 - res/cardsfolder/endbringers_revel.txt | 9 - res/cardsfolder/endless_cockroaches.txt | 12 - res/cardsfolder/enemy_of_the_guildpact.txt | 10 - res/cardsfolder/energizer.txt | 10 - res/cardsfolder/energy_arc.txt | 12 - res/cardsfolder/energy_bolt.txt | 11 - res/cardsfolder/energy_field.txt | 12 - res/cardsfolder/energy_flux.txt | 14 - res/cardsfolder/energy_storm.txt | 13 - res/cardsfolder/energy_tap.txt | 13 - res/cardsfolder/enervate.txt | 12 - res/cardsfolder/enfeeblement.txt | 13 - res/cardsfolder/engineered_plague.txt | 10 - res/cardsfolder/engulfing_flames.txt | 11 - res/cardsfolder/enigma_eidolon.txt | 12 - res/cardsfolder/enigma_sphinx.txt | 13 - res/cardsfolder/enlightened_tutor.txt | 11 - res/cardsfolder/enlisted_wurm.txt | 10 - res/cardsfolder/enlistment_officer.txt | 13 - res/cardsfolder/enormous_baloth.txt | 12 - res/cardsfolder/enrage.txt | 13 - res/cardsfolder/enshrined_memories.txt | 11 - res/cardsfolder/enslave.txt | 12 - res/cardsfolder/enslaved_dwarf.txt | 10 - res/cardsfolder/enslaved_scout.txt | 10 - res/cardsfolder/ensnare.txt | 11 - res/cardsfolder/ensnaring_bridge.txt | 11 - res/cardsfolder/entangling_trap.txt | 14 - res/cardsfolder/entangling_vines.txt | 9 - res/cardsfolder/entomb.txt | 9 - res/cardsfolder/entropic_eidolon.txt | 13 - res/cardsfolder/entropic_specter.txt | 13 - res/cardsfolder/envelop.txt | 9 - res/cardsfolder/eon_hub.txt | 9 - res/cardsfolder/ephemeron.txt | 11 - res/cardsfolder/epic_proportions.txt | 11 - res/cardsfolder/epic_struggle.txt | 11 - res/cardsfolder/equilibrium.txt | 11 - res/cardsfolder/erase.txt | 9 - res/cardsfolder/erg_raiders.txt | 12 - res/cardsfolder/eron_the_relentless.txt | 12 - res/cardsfolder/errant_doomsayers.txt | 10 - res/cardsfolder/errant_ephemeron.txt | 11 - res/cardsfolder/erratic_explosion.txt | 8 - res/cardsfolder/erratic_portal.txt | 10 - res/cardsfolder/ertai_the_corrupted.txt | 11 - res/cardsfolder/ertai_wizard_adept.txt | 10 - res/cardsfolder/ertais_trickery.txt | 11 - res/cardsfolder/escape_artist.txt | 11 - res/cardsfolder/escape_routes.txt | 10 - res/cardsfolder/escaped_null.txt | 13 - res/cardsfolder/esper_battlemage.txt | 11 - res/cardsfolder/esper_charm.txt | 12 - res/cardsfolder/esper_cormorants.txt | 10 - res/cardsfolder/esper_panorama.txt | 10 - res/cardsfolder/esper_sojourners.txt | 13 - res/cardsfolder/esper_stormblade.txt | 11 - res/cardsfolder/esperzoa.txt | 13 - res/cardsfolder/essence_drain.txt | 11 - res/cardsfolder/essence_feed.txt | 12 - res/cardsfolder/essence_flare.txt | 12 - res/cardsfolder/essence_fracture.txt | 10 - res/cardsfolder/essence_scatter.txt | 9 - res/cardsfolder/essence_sliver.txt | 14 - res/cardsfolder/essence_warden.txt | 11 - res/cardsfolder/etched_champion.txt | 11 - res/cardsfolder/etched_monstrosity.txt | 11 - res/cardsfolder/etched_oracle.txt | 12 - res/cardsfolder/eternal_dragon.txt | 12 - res/cardsfolder/eternal_flame.txt | 12 - res/cardsfolder/eternal_warrior.txt | 12 - res/cardsfolder/eternal_witness.txt | 11 - res/cardsfolder/eternity_snare.txt | 12 - res/cardsfolder/eternity_vessel.txt | 13 - res/cardsfolder/ethercaste_knight.txt | 10 - res/cardsfolder/ethereal_champion.txt | 12 - res/cardsfolder/ethereal_usher.txt | 11 - res/cardsfolder/ethereal_whiskergill.txt | 11 - res/cardsfolder/etherium_abomination.txt | 10 - res/cardsfolder/etherium_astrolabe.txt | 10 - res/cardsfolder/etherium_sculptor.txt | 10 - res/cardsfolder/ethersworn_adjudicator.txt | 12 - res/cardsfolder/evacuation.txt | 13 - res/cardsfolder/evaporate.txt | 10 - res/cardsfolder/evasive_action.txt | 12 - res/cardsfolder/even_the_odds.txt | 10 - res/cardsfolder/everbark_shaman.txt | 10 - res/cardsfolder/everflowing_chalice.txt | 12 - res/cardsfolder/everglades.txt | 11 - res/cardsfolder/evil_eye_of_orms_by_gore.txt | 14 - res/cardsfolder/evil_eye_of_urborg.txt | 12 - res/cardsfolder/evil_presence.txt | 14 - res/cardsfolder/evincars_justice.txt | 10 - res/cardsfolder/eviscerator.txt | 12 - res/cardsfolder/evolution_charm.txt | 12 - res/cardsfolder/evolving_wilds.txt | 9 - res/cardsfolder/exalted_angel.txt | 14 - res/cardsfolder/excavation.txt | 10 - res/cardsfolder/excise.txt | 11 - res/cardsfolder/exclude.txt | 10 - res/cardsfolder/excommunicate.txt | 11 - res/cardsfolder/execute.txt | 12 - res/cardsfolder/executioners_capsule.txt | 9 - res/cardsfolder/exhaustion.txt | 14 - res/cardsfolder/exhume.txt | 10 - res/cardsfolder/exile.txt | 12 - res/cardsfolder/exile_into_darkness.txt | 12 - res/cardsfolder/exiled_boggart.txt | 11 - res/cardsfolder/exorcist.txt | 10 - res/cardsfolder/exoskeletal_armor.txt | 13 - res/cardsfolder/exotic_curse.txt | 14 - res/cardsfolder/exotic_disease.txt | 12 - res/cardsfolder/exotic_orchard.txt | 10 - res/cardsfolder/expedition_map.txt | 9 - res/cardsfolder/expendable_troops.txt | 11 - res/cardsfolder/exploding_borders.txt | 12 - res/cardsfolder/exploration.txt | 8 - res/cardsfolder/explore.txt | 8 - res/cardsfolder/explosive_growth.txt | 10 - res/cardsfolder/explosive_revelation.txt | 8 - res/cardsfolder/explosive_vegetation.txt | 9 - res/cardsfolder/expunge.txt | 10 - res/cardsfolder/exsanguinate.txt | 12 - res/cardsfolder/extinguish.txt | 11 - res/cardsfolder/extortion.txt | 9 - res/cardsfolder/extra_arms.txt | 12 - res/cardsfolder/extract.txt | 10 - res/cardsfolder/extractor_demon.txt | 13 - res/cardsfolder/extruder.txt | 11 - res/cardsfolder/exuberant_firestoker.txt | 12 - res/cardsfolder/eye_of_nowhere.txt | 9 - res/cardsfolder/eye_of_ramos.txt | 11 - res/cardsfolder/eye_of_ugin.txt | 11 - res/cardsfolder/eye_spy.txt | 11 - res/cardsfolder/eyeblights_ending.txt | 9 - res/cardsfolder/eyes_of_the_wisent.txt | 11 - res/cardsfolder/ezuri_renegade_leader.txt | 11 - res/cardsfolder/ezuris_archers.txt | 12 - res/cardsfolder/ezuris_brigade.txt | 10 - res/cardsfolder/fable_of_wolf_and_owl.txt | 13 - res/cardsfolder/fabricate.txt | 11 - res/cardsfolder/face_of_fear.txt | 11 - res/cardsfolder/faceless_butcher.txt | 15 - res/cardsfolder/faceless_devourer.txt | 15 - res/cardsfolder/facevaulter.txt | 10 - res/cardsfolder/fact_or_fiction.txt | 8 - res/cardsfolder/fade_from_memory.txt | 10 - res/cardsfolder/faerie_conclave.txt | 12 - res/cardsfolder/faerie_harbinger.txt | 14 - res/cardsfolder/faerie_macabre.txt | 11 - res/cardsfolder/faerie_mechanist.txt | 12 - res/cardsfolder/faerie_noble.txt | 13 - res/cardsfolder/faerie_swarm.txt | 12 - res/cardsfolder/faerie_tauntings.txt | 10 - res/cardsfolder/faerie_trickery.txt | 9 - res/cardsfolder/faith_healer.txt | 11 - res/cardsfolder/fallen_angel.txt | 15 - res/cardsfolder/fallen_askari.txt | 11 - res/cardsfolder/fallen_cleric.txt | 11 - res/cardsfolder/fallen_ferromancer.txt | 11 - res/cardsfolder/fallen_ideal.txt | 13 - res/cardsfolder/fallow_earth.txt | 10 - res/cardsfolder/fallowsage.txt | 11 - res/cardsfolder/false_cure.txt | 14 - res/cardsfolder/false_defeat.txt | 9 - res/cardsfolder/false_demise.txt | 13 - res/cardsfolder/false_mourning.txt | 10 - res/cardsfolder/false_prophet.txt | 12 - res/cardsfolder/false_summoning.txt | 9 - res/cardsfolder/falter.txt | 12 - res/cardsfolder/familiar_ground.txt | 11 - res/cardsfolder/familiars_ruse.txt | 10 - res/cardsfolder/famine.txt | 9 - res/cardsfolder/fanatical_devotion.txt | 9 - res/cardsfolder/fanatical_fever.txt | 9 - res/cardsfolder/fang_skulkin.txt | 10 - res/cardsfolder/fangren_firstborn.txt | 11 - res/cardsfolder/fangren_hunter.txt | 10 - res/cardsfolder/fangren_marauder.txt | 11 - res/cardsfolder/fangren_pathcutter.txt | 11 - res/cardsfolder/fanning_the_flames.txt | 11 - res/cardsfolder/far_wanderings.txt | 10 - res/cardsfolder/farhaven_elf.txt | 11 - res/cardsfolder/farmstead.txt | 13 - res/cardsfolder/farrelite_priest.txt | 11 - res/cardsfolder/farseek.txt | 9 - res/cardsfolder/farsight_mask.txt | 8 - res/cardsfolder/fastbond.txt | 11 - res/cardsfolder/fatal_attraction.txt | 14 - res/cardsfolder/fatal_blow.txt | 10 - res/cardsfolder/fatal_frenzy.txt | 11 - res/cardsfolder/fatal_mutation.txt | 14 - res/cardsfolder/fatestitcher.txt | 11 - res/cardsfolder/fathom_seer.txt | 12 - res/cardsfolder/fault_line.txt | 11 - res/cardsfolder/fault_riders.txt | 11 - res/cardsfolder/faultgrinder.txt | 15 - res/cardsfolder/fauna_shaman.txt | 10 - res/cardsfolder/favor_of_the_mighty.txt | 8 - res/cardsfolder/favor_of_the_overbeing.txt | 13 - res/cardsfolder/favorable_destiny.txt | 13 - res/cardsfolder/fear.txt | 20 - res/cardsfolder/feast_of_blood.txt | 11 - res/cardsfolder/feast_of_flesh.txt | 11 - res/cardsfolder/feast_of_the_unicorn.txt | 11 - res/cardsfolder/feast_of_worms.txt | 11 - res/cardsfolder/feast_or_famine.txt | 11 - res/cardsfolder/fecundity.txt | 12 - res/cardsfolder/feebleness.txt | 11 - res/cardsfolder/feedback.txt | 16 - res/cardsfolder/feedback_bolt.txt | 11 - res/cardsfolder/feeding_frenzy.txt | 11 - res/cardsfolder/feldons_cane.txt | 12 - res/cardsfolder/felidar_sovereign.txt | 11 - res/cardsfolder/fellwar_stone.txt | 13 - res/cardsfolder/femeref_archers.txt | 13 - res/cardsfolder/femeref_enchantress.txt | 11 - res/cardsfolder/femeref_healer.txt | 10 - res/cardsfolder/femeref_knight.txt | 11 - res/cardsfolder/femeref_scouts.txt | 9 - res/cardsfolder/fen_stalker.txt | 11 - res/cardsfolder/fencer_clique.txt | 11 - res/cardsfolder/fencers_magemark.txt | 11 - res/cardsfolder/fend_off.txt | 11 - res/cardsfolder/fendeep_summoner.txt | 11 - res/cardsfolder/feral_animist.txt | 11 - res/cardsfolder/feral_hydra.txt | 12 - res/cardsfolder/feral_instinct.txt | 10 - res/cardsfolder/feral_lightning.txt | 10 - res/cardsfolder/feral_shadow.txt | 12 - res/cardsfolder/feral_thallid.txt | 12 - res/cardsfolder/ferocious_charge.txt | 10 - res/cardsfolder/ferocity.txt | 13 - res/cardsfolder/ferozs_ban.txt | 12 - res/cardsfolder/ferrovore.txt | 10 - res/cardsfolder/fertilid.txt | 11 - res/cardsfolder/fervent_charge.txt | 10 - res/cardsfolder/fervent_denial.txt | 10 - res/cardsfolder/fervor.txt | 13 - res/cardsfolder/festercreep.txt | 12 - res/cardsfolder/festering_evil.txt | 11 - res/cardsfolder/festering_goblin.txt | 13 - res/cardsfolder/festering_march.txt | 12 - res/cardsfolder/festering_wound.txt | 14 - res/cardsfolder/festival.txt | 11 - res/cardsfolder/festival_of_trokin.txt | 10 - res/cardsfolder/fetid_heath.txt | 13 - res/cardsfolder/fetid_horror.txt | 10 - res/cardsfolder/feudkillers_verdict.txt | 8 - res/cardsfolder/fever_charm.txt | 12 - res/cardsfolder/fevered_convulsions.txt | 9 - res/cardsfolder/fevered_strength.txt | 10 - res/cardsfolder/fiddlehead_kami.txt | 13 - res/cardsfolder/field_marshal.txt | 12 - res/cardsfolder/field_of_souls.txt | 10 - res/cardsfolder/fieldmist_borderpost.txt | 12 - res/cardsfolder/fierce_empath.txt | 11 - res/cardsfolder/fiery_conclusion.txt | 9 - res/cardsfolder/fiery_fall.txt | 10 - res/cardsfolder/fiery_hellhound.txt | 11 - res/cardsfolder/fiery_mantle.txt | 13 - res/cardsfolder/fiery_temper.txt | 11 - res/cardsfolder/fight_to_the_death.txt | 9 - res/cardsfolder/fighting_drake.txt | 12 - res/cardsfolder/figure_of_destiny.txt | 9 - res/cardsfolder/filigree_angel.txt | 13 - res/cardsfolder/filigree_fracture.txt | 10 - res/cardsfolder/filigree_sages.txt | 10 - res/cardsfolder/fill_with_fright.txt | 10 - res/cardsfolder/filth.txt | 10 - res/cardsfolder/filthy_cur.txt | 12 - res/cardsfolder/final_judgment.txt | 9 - res/cardsfolder/final_revels.txt | 11 - res/cardsfolder/final_sting_faerie.txt | 12 - res/cardsfolder/final_strike.txt | 11 - res/cardsfolder/finest_hour.txt | 10 - res/cardsfolder/fire_ambush.txt | 9 - res/cardsfolder/fire_ants.txt | 10 - res/cardsfolder/fire_at_will.txt | 11 - res/cardsfolder/fire_belly_changeling.txt | 11 - res/cardsfolder/fire_bowman.txt | 10 - res/cardsfolder/fire_diamond.txt | 12 - res/cardsfolder/fire_dragon.txt | 14 - res/cardsfolder/fire_drake.txt | 12 - res/cardsfolder/fire_elemental.txt | 16 - res/cardsfolder/fire_field_ogre.txt | 11 - res/cardsfolder/fire_imp.txt | 12 - res/cardsfolder/fire_lit_thicket.txt | 13 - res/cardsfolder/fire_servant.txt | 9 - res/cardsfolder/fire_snake.txt | 11 - res/cardsfolder/fire_sprites.txt | 12 - res/cardsfolder/fire_tempest.txt | 10 - res/cardsfolder/fireball.txt | 16 - res/cardsfolder/fireblast.txt | 10 - res/cardsfolder/firebolt.txt | 10 - res/cardsfolder/firebreathing.txt | 21 - res/cardsfolder/firecat_blitz.txt | 13 - res/cardsfolder/firefly.txt | 11 - res/cardsfolder/firemane_angel.txt | 14 - res/cardsfolder/firemaw_kavu.txt | 15 - res/cardsfolder/fires_of_yavimaya.txt | 10 - res/cardsfolder/firescreamer.txt | 10 - res/cardsfolder/fireshrieker.txt | 9 - res/cardsfolder/fireslinger.txt | 11 - res/cardsfolder/firestorm.txt | 9 - res/cardsfolder/firestorm_hellkite.txt | 12 - res/cardsfolder/firewake_sliver.txt | 12 - res/cardsfolder/firewild_borderpost.txt | 12 - res/cardsfolder/first_volley.txt | 10 - res/cardsfolder/fishliver_oil.txt | 11 - res/cardsfolder/fissure.txt | 10 - res/cardsfolder/fissure_vent.txt | 13 - res/cardsfolder/fistful_of_force.txt | 11 - res/cardsfolder/fists_of_ironwood.txt | 12 - res/cardsfolder/fists_of_the_anvil.txt | 10 - res/cardsfolder/fists_of_the_demigod.txt | 13 - res/cardsfolder/fit_of_rage.txt | 10 - res/cardsfolder/flagstones_of_trokair.txt | 12 - res/cardsfolder/flailing_manticore.txt | 14 - res/cardsfolder/flailing_ogre.txt | 12 - res/cardsfolder/flailing_soldier.txt | 12 - res/cardsfolder/flame_burst.txt | 11 - res/cardsfolder/flame_elemental.txt | 11 - res/cardsfolder/flame_jab.txt | 10 - res/cardsfolder/flame_javelin.txt | 9 - res/cardsfolder/flame_jet.txt | 10 - res/cardsfolder/flame_kin_zealot.txt | 12 - res/cardsfolder/flame_rift.txt | 9 - res/cardsfolder/flame_slash.txt | 9 - res/cardsfolder/flame_spirit.txt | 12 - res/cardsfolder/flameblast_dragon.txt | 14 - res/cardsfolder/flameborn_hellion.txt | 11 - res/cardsfolder/flameborn_viron.txt | 9 - res/cardsfolder/flamebreak.txt | 9 - res/cardsfolder/flamecore_elemental.txt | 10 - res/cardsfolder/flamekin_brawler.txt | 10 - res/cardsfolder/flamekin_harbinger.txt | 12 - res/cardsfolder/flamekin_spitfire.txt | 10 - res/cardsfolder/flameshot.txt | 13 - res/cardsfolder/flametongue_kavu.txt | 12 - res/cardsfolder/flamewave_invoker.txt | 11 - res/cardsfolder/flaming_sword.txt | 11 - res/cardsfolder/flanking_troops.txt | 11 - res/cardsfolder/flare.txt | 12 - res/cardsfolder/flaring_flame_kin.txt | 12 - res/cardsfolder/flash_counter.txt | 10 - res/cardsfolder/flash_flood.txt | 12 - res/cardsfolder/flash_of_defiance.txt | 12 - res/cardsfolder/flashfires.txt | 19 - res/cardsfolder/flashfreeze.txt | 12 - res/cardsfolder/flayed_nim.txt | 13 - res/cardsfolder/flayer_husk.txt | 10 - res/cardsfolder/fledgling_djinn.txt | 12 - res/cardsfolder/fledgling_dragon.txt | 12 - res/cardsfolder/fledgling_griffin.txt | 12 - res/cardsfolder/fledgling_imp.txt | 10 - res/cardsfolder/fledgling_mawcor.txt | 12 - res/cardsfolder/fledgling_osprey.txt | 10 - res/cardsfolder/fleet_footed_monk.txt | 10 - res/cardsfolder/fleetfoot_panther.txt | 13 - res/cardsfolder/fleeting_aven.txt | 12 - res/cardsfolder/fleeting_distraction.txt | 10 - res/cardsfolder/fleeting_image.txt | 14 - res/cardsfolder/flensermite.txt | 11 - res/cardsfolder/flesh_allergy.txt | 11 - res/cardsfolder/flesh_eater_imp.txt | 12 - res/cardsfolder/fleshbag_marauder.txt | 12 - res/cardsfolder/fleshformer.txt | 11 - res/cardsfolder/fleshgrafter.txt | 11 - res/cardsfolder/fleshwrither.txt | 10 - res/cardsfolder/flicker.txt | 11 - res/cardsfolder/flickerwisp.txt | 14 - res/cardsfolder/flight.txt | 19 - res/cardsfolder/flight_of_fancy.txt | 12 - res/cardsfolder/flight_spellbomb.txt | 12 - res/cardsfolder/fling.txt | 12 - res/cardsfolder/flint_golem.txt | 11 - res/cardsfolder/floating_dream_zubera.txt | 12 - res/cardsfolder/flood.txt | 11 - res/cardsfolder/flood_plain.txt | 10 - res/cardsfolder/floodbringer.txt | 12 - res/cardsfolder/flooded_grove.txt | 13 - res/cardsfolder/flooded_shoreline.txt | 10 - res/cardsfolder/flooded_strand.txt | 9 - res/cardsfolder/floodwater_dam.txt | 13 - res/cardsfolder/flourishing_defenses.txt | 11 - res/cardsfolder/flow_of_ideas.txt | 12 - res/cardsfolder/flow_of_maggots.txt | 11 - res/cardsfolder/flowstone_blade.txt | 11 - res/cardsfolder/flowstone_charger.txt | 11 - res/cardsfolder/flowstone_crusher.txt | 11 - res/cardsfolder/flowstone_embrace.txt | 11 - res/cardsfolder/flowstone_flood.txt | 11 - res/cardsfolder/flowstone_giant.txt | 10 - res/cardsfolder/flowstone_hellion.txt | 11 - res/cardsfolder/flowstone_mauler.txt | 11 - res/cardsfolder/flowstone_overseer.txt | 10 - res/cardsfolder/flowstone_salamander.txt | 10 - res/cardsfolder/flowstone_sculpture.txt | 13 - res/cardsfolder/flowstone_shambler.txt | 11 - res/cardsfolder/flowstone_slide.txt | 13 - res/cardsfolder/flowstone_strike.txt | 9 - res/cardsfolder/flowstone_surge.txt | 11 - res/cardsfolder/flowstone_thopter.txt | 10 - res/cardsfolder/flowstone_wall.txt | 11 - res/cardsfolder/flowstone_wyvern.txt | 11 - res/cardsfolder/fluctuator.txt | 10 - res/cardsfolder/flurry_of_wings.txt | 11 - res/cardsfolder/flying_carpet.txt | 15 - res/cardsfolder/flying_men.txt | 11 - res/cardsfolder/fodder_cannon.txt | 10 - res/cardsfolder/fodder_launch.txt | 11 - res/cardsfolder/fog.txt | 19 - res/cardsfolder/fog_bank.txt | 12 - res/cardsfolder/fog_elemental.txt | 17 - res/cardsfolder/fog_of_gnats.txt | 11 - res/cardsfolder/folk_medicine.txt | 11 - res/cardsfolder/folk_of_an_havva.txt | 11 - res/cardsfolder/folk_of_the_pines.txt | 10 - res/cardsfolder/followed_footsteps.txt | 12 - res/cardsfolder/fomori_nomad.txt | 9 - res/cardsfolder/font_of_mythos.txt | 10 - res/cardsfolder/fools_demise.txt | 14 - res/cardsfolder/fools_tome.txt | 9 - res/cardsfolder/foot_soldiers.txt | 11 - res/cardsfolder/footbottom_feast.txt | 12 - res/cardsfolder/foothill_guide.txt | 11 - res/cardsfolder/footsteps_of_the_goryo.txt | 11 - res/cardsfolder/foratog.txt | 11 - res/cardsfolder/forbid.txt | 12 - res/cardsfolder/forbidden_lore.txt | 11 - res/cardsfolder/forbidden_orchard.txt | 15 - res/cardsfolder/forbidding_watchtower.txt | 12 - res/cardsfolder/force_of_nature.txt | 17 - res/cardsfolder/force_of_savagery.txt | 11 - res/cardsfolder/force_of_will.txt | 11 - res/cardsfolder/force_spike.txt | 11 - res/cardsfolder/force_void.txt | 10 - res/cardsfolder/forced_fruition.txt | 11 - res/cardsfolder/forced_march.txt | 11 - res/cardsfolder/forced_retreat.txt | 9 - res/cardsfolder/forced_worship.txt | 11 - res/cardsfolder/forcemage_advocate.txt | 11 - res/cardsfolder/foresee.txt | 11 - res/cardsfolder/foresight.txt | 12 - res/cardsfolder/forest.txt | 44 - res/cardsfolder/forest_bear.txt | 9 - res/cardsfolder/forethought_amulet.txt | 10 - res/cardsfolder/forfend.txt | 11 - res/cardsfolder/forge_armor.txt | 12 - res/cardsfolder/forgotten_ancient.txt | 12 - res/cardsfolder/forgotten_cave.txt | 11 - res/cardsfolder/forgotten_harvest.txt | 10 - res/cardsfolder/fork.txt | 12 - res/cardsfolder/forked_bolt.txt | 10 - res/cardsfolder/forked_branch_garami.txt | 11 - res/cardsfolder/form_of_the_dragon.txt | 14 - res/cardsfolder/forsaken_city.txt | 17 - res/cardsfolder/forsaken_wastes.txt | 12 - res/cardsfolder/fortify.txt | 11 - res/cardsfolder/fortitude.txt | 13 - res/cardsfolder/fortune_thief.txt | 11 - res/cardsfolder/foul_familiar.txt | 12 - res/cardsfolder/foul_imp.txt | 15 - res/cardsfolder/foul_presence.txt | 13 - res/cardsfolder/foul_spirit.txt | 12 - res/cardsfolder/fountain_of_youth.txt | 12 - res/cardsfolder/fountain_watch.txt | 10 - res/cardsfolder/foxfire.txt | 13 - res/cardsfolder/foxfire_oak.txt | 10 - res/cardsfolder/fracturing_gust.txt | 11 - res/cardsfolder/frantic_purification.txt | 10 - res/cardsfolder/frantic_salvage.txt | 13 - res/cardsfolder/frantic_search.txt | 12 - res/cardsfolder/frazzle.txt | 9 - res/cardsfolder/freed_from_the_real.txt | 13 - res/cardsfolder/freewind_equenaut.txt | 13 - res/cardsfolder/freewind_falcon.txt | 11 - res/cardsfolder/frenetic_ogre.txt | 11 - res/cardsfolder/frenetic_raptor.txt | 10 - res/cardsfolder/frenzied_tilling.txt | 10 - res/cardsfolder/fresh_meat.txt | 11 - res/cardsfolder/fresh_volunteers.txt | 9 - res/cardsfolder/freyalise_supplicant.txt | 13 - res/cardsfolder/freyalises_charm.txt | 12 - res/cardsfolder/freyalises_radiance.txt | 11 - res/cardsfolder/freyalises_winds.txt | 11 - res/cardsfolder/frightcrawler.txt | 11 - res/cardsfolder/frog_tongue.txt | 12 - res/cardsfolder/frogmite.txt | 10 - res/cardsfolder/frogtosser_banneret.txt | 11 - res/cardsfolder/frontier_guide.txt | 10 - res/cardsfolder/frontline_sage.txt | 12 - res/cardsfolder/frontline_strategist.txt | 13 - res/cardsfolder/frost_giant.txt | 10 - res/cardsfolder/frost_marsh.txt | 11 - res/cardsfolder/frost_ogre.txt | 9 - res/cardsfolder/frost_raptor.txt | 12 - res/cardsfolder/frost_titan.txt | 13 - res/cardsfolder/frostling.txt | 10 - res/cardsfolder/frostweb_spider.txt | 13 - res/cardsfolder/frostwind_invoker.txt | 11 - res/cardsfolder/frozen_aether.txt | 8 - res/cardsfolder/frozen_shade.txt | 15 - res/cardsfolder/frozen_solid.txt | 11 - res/cardsfolder/fruition.txt | 10 - res/cardsfolder/fuel_for_the_cause.txt | 10 - res/cardsfolder/fugitive_wizard.txt | 12 - res/cardsfolder/fugue.txt | 10 - res/cardsfolder/fulminator_mage.txt | 10 - res/cardsfolder/fume_spitter.txt | 11 - res/cardsfolder/fumiko_the_lowblood.txt | 15 - res/cardsfolder/funeral_charm.txt | 13 - res/cardsfolder/funeral_march.txt | 13 - res/cardsfolder/funeral_pyre.txt | 11 - res/cardsfolder/fungal_bloom.txt | 10 - res/cardsfolder/fungal_reaches.txt | 11 - res/cardsfolder/fungal_shambler.txt | 13 - res/cardsfolder/fungus_elemental.txt | 11 - res/cardsfolder/fungus_sliver.txt | 11 - res/cardsfolder/fungusaur.txt | 17 - res/cardsfolder/furious_assault.txt | 11 - res/cardsfolder/furnace_brood.txt | 11 - res/cardsfolder/furnace_celebration.txt | 11 - res/cardsfolder/furnace_of_rath.txt | 13 - res/cardsfolder/furnace_scamp.txt | 12 - res/cardsfolder/furnace_spirit.txt | 11 - res/cardsfolder/furnace_whelp.txt | 12 - res/cardsfolder/fury_sliver.txt | 11 - res/cardsfolder/fusion_elemental.txt | 9 - res/cardsfolder/fylamarid.txt | 13 - res/cardsfolder/fyndhorn_bow.txt | 9 - res/cardsfolder/fyndhorn_brownie.txt | 11 - res/cardsfolder/fyndhorn_elder.txt | 15 - res/cardsfolder/fyndhorn_elves.txt | 10 - res/cardsfolder/fyndhorn_pollen.txt | 12 - res/cardsfolder/gaddock_teeg.txt | 9 - res/cardsfolder/gaeas_anthem.txt | 10 - res/cardsfolder/gaeas_avenger.txt | 10 - res/cardsfolder/gaeas_bounty.txt | 9 - res/cardsfolder/gaeas_cradle.txt | 11 - res/cardsfolder/gaeas_embrace.txt | 11 - res/cardsfolder/gaeas_herald.txt | 12 - res/cardsfolder/gaeas_might.txt | 11 - res/cardsfolder/gaeas_revenge.txt | 11 - res/cardsfolder/gaeas_skyfolk.txt | 10 - res/cardsfolder/gainsay.txt | 10 - res/cardsfolder/gale_force.txt | 10 - res/cardsfolder/galepowder_mage.txt | 14 - res/cardsfolder/galinas_knight.txt | 10 - res/cardsfolder/gallantry.txt | 11 - res/cardsfolder/galvanic_arc.txt | 12 - res/cardsfolder/galvanic_blast.txt | 10 - res/cardsfolder/galvanic_key.txt | 11 - res/cardsfolder/gamble.txt | 11 - res/cardsfolder/game_trail_changeling.txt | 11 - res/cardsfolder/gang_of_elk.txt | 13 - res/cardsfolder/gangrenous_goliath.txt | 11 - res/cardsfolder/gangrenous_zombies.txt | 11 - res/cardsfolder/gargoyle_castle.txt | 10 - res/cardsfolder/garruk_wildspeaker.txt | 14 - res/cardsfolder/garruks_companion.txt | 10 - res/cardsfolder/garruks_packleader.txt | 11 - res/cardsfolder/garza_zol_plague_queen.txt | 14 - res/cardsfolder/gaseous_form.txt | 14 - res/cardsfolder/gate_hound.txt | 11 - res/cardsfolder/gate_to_phyrexia.txt | 10 - res/cardsfolder/gatekeeper_of_malakir.txt | 14 - res/cardsfolder/gathan_raiders.txt | 11 - res/cardsfolder/gatherer_of_graces.txt | 13 - res/cardsfolder/gauntlet_of_might.txt | 15 - res/cardsfolder/gaze_of_adamaro.txt | 11 - res/cardsfolder/gaze_of_justice.txt | 10 - res/cardsfolder/gelatinous_genesis.txt | 11 - res/cardsfolder/gelectrode.txt | 12 - res/cardsfolder/gelid_shackles.txt | 12 - res/cardsfolder/gemhide_sliver.txt | 16 - res/cardsfolder/gemini_engine.txt | 15 - res/cardsfolder/gempalm_avenger.txt | 12 - res/cardsfolder/gempalm_incinerator.txt | 13 - res/cardsfolder/gempalm_polluter.txt | 13 - res/cardsfolder/gempalm_sorcerer.txt | 12 - res/cardsfolder/gempalm_strider.txt | 12 - res/cardsfolder/gemstone_array.txt | 15 - res/cardsfolder/gemstone_mine.txt | 16 - res/cardsfolder/generals_kabuto.txt | 9 - res/cardsfolder/genesis.txt | 11 - res/cardsfolder/genesis_chamber.txt | 11 - res/cardsfolder/genesis_wave.txt | 11 - res/cardsfolder/genju_of_the_realm.txt | 14 - res/cardsfolder/geothermal_crevice.txt | 12 - res/cardsfolder/gerrards_battle_cry.txt | 9 - res/cardsfolder/gerrards_command.txt | 10 - res/cardsfolder/gerrards_irregulars.txt | 11 - res/cardsfolder/gerrards_verdict.txt | 8 - res/cardsfolder/gerrards_wisdom.txt | 12 - res/cardsfolder/geth_lord_of_the_vault.txt | 13 - res/cardsfolder/geths_grimoire.txt | 10 - res/cardsfolder/geths_verdict.txt | 10 - res/cardsfolder/geyser_glider.txt | 11 - res/cardsfolder/ghalmas_warden.txt | 11 - res/cardsfolder/ghastlord_of_fugue.txt | 12 - res/cardsfolder/ghastly_demise.txt | 10 - res/cardsfolder/ghitu_encampment.txt | 12 - res/cardsfolder/ghitu_fire_eater.txt | 12 - res/cardsfolder/ghitu_slinger.txt | 13 - res/cardsfolder/ghitu_war_cry.txt | 9 - res/cardsfolder/ghor_clan_bloodscale.txt | 11 - res/cardsfolder/ghor_clan_savage.txt | 10 - res/cardsfolder/ghost_hounds.txt | 13 - res/cardsfolder/ghost_lit_nourisher.txt | 11 - res/cardsfolder/ghost_lit_raider.txt | 11 - res/cardsfolder/ghost_lit_redeemer.txt | 11 - res/cardsfolder/ghost_lit_stalker.txt | 11 - res/cardsfolder/ghost_lit_warder.txt | 12 - res/cardsfolder/ghost_quarter.txt | 12 - res/cardsfolder/ghost_ship.txt | 13 - res/cardsfolder/ghost_tactician.txt | 11 - res/cardsfolder/ghost_town.txt | 11 - res/cardsfolder/ghost_warden.txt | 11 - res/cardsfolder/ghostfire.txt | 10 - res/cardsfolder/ghostflame_sliver.txt | 10 - res/cardsfolder/ghostly_changeling.txt | 11 - res/cardsfolder/ghostly_prison.txt | 8 - res/cardsfolder/ghostly_visit.txt | 9 - res/cardsfolder/ghostly_wings.txt | 11 - res/cardsfolder/ghosts_of_the_damned.txt | 11 - res/cardsfolder/ghostway.txt | 12 - res/cardsfolder/ghouls_feast.txt | 10 - res/cardsfolder/giant_badger.txt | 11 - res/cardsfolder/giant_cockroach.txt | 12 - res/cardsfolder/giant_crab.txt | 10 - res/cardsfolder/giant_dustwasp.txt | 11 - res/cardsfolder/giant_growth.txt | 22 - res/cardsfolder/giant_harbinger.txt | 12 - res/cardsfolder/giant_mantis.txt | 10 - res/cardsfolder/giant_octopus.txt | 12 - res/cardsfolder/giant_scorpion.txt | 10 - res/cardsfolder/giant_shark.txt | 16 - res/cardsfolder/giant_solifuge.txt | 12 - res/cardsfolder/giant_spider.txt | 23 - res/cardsfolder/giant_strength.txt | 14 - res/cardsfolder/giant_tortoise.txt | 11 - res/cardsfolder/giant_trap_door_spider.txt | 12 - res/cardsfolder/giant_warthog.txt | 10 - res/cardsfolder/giants_ire.txt | 11 - res/cardsfolder/gibbering_hyenas.txt | 10 - res/cardsfolder/gibbering_kami.txt | 11 - res/cardsfolder/gift_of_estates.txt | 11 - res/cardsfolder/gift_of_granite.txt | 11 - res/cardsfolder/gift_of_the_deity.txt | 13 - res/cardsfolder/gift_of_the_woods.txt | 14 - res/cardsfolder/gigadrowse.txt | 10 - res/cardsfolder/gigantomancer.txt | 9 - res/cardsfolder/gigapede.txt | 13 - res/cardsfolder/gilded_lotus.txt | 14 - res/cardsfolder/gilder_bairn.txt | 9 - res/cardsfolder/gilt_leaf_archdruid.txt | 11 - res/cardsfolder/gilt_leaf_palace.txt | 11 - res/cardsfolder/gilt_leaf_seer.txt | 10 - res/cardsfolder/giltspire_avenger.txt | 11 - res/cardsfolder/gitaxian_probe.txt | 11 - res/cardsfolder/glacial_crevasses.txt | 11 - res/cardsfolder/glacial_fortress.txt | 12 - res/cardsfolder/glacial_wall.txt | 13 - res/cardsfolder/glaciers.txt | 11 - res/cardsfolder/glade_gnarr.txt | 13 - res/cardsfolder/glare_of_subdual.txt | 9 - res/cardsfolder/glarewielder.txt | 16 - res/cardsfolder/glass_golem.txt | 9 - res/cardsfolder/glassdust_hulk.txt | 13 - res/cardsfolder/glasses_of_urza.txt | 16 - res/cardsfolder/glaze_fiend.txt | 13 - res/cardsfolder/gleam_of_resistance.txt | 12 - res/cardsfolder/glen_elendra_archmage.txt | 12 - res/cardsfolder/glen_elendra_liege.txt | 13 - res/cardsfolder/glen_elendra_pranksters.txt | 13 - res/cardsfolder/glimmerdust_nap.txt | 9 - res/cardsfolder/glimmering_angel.txt | 11 - res/cardsfolder/glimmerpoint_stag.txt | 14 - res/cardsfolder/glimmerpost.txt | 12 - res/cardsfolder/glimmervoid.txt | 17 - res/cardsfolder/glimpse_of_nature.txt | 13 - res/cardsfolder/glimpse_the_unthinkable.txt | 9 - res/cardsfolder/glint_eye_nephilim.txt | 13 - res/cardsfolder/glint_hawk_idol.txt | 11 - res/cardsfolder/glintwing_invoker.txt | 10 - res/cardsfolder/glissa_the_traitor.txt | 13 - res/cardsfolder/glissas_courier.txt | 10 - res/cardsfolder/glissas_scorn.txt | 10 - res/cardsfolder/glistener_elf.txt | 10 - res/cardsfolder/glistening_oil.txt | 15 - res/cardsfolder/glitterfang.txt | 12 - res/cardsfolder/global_ruin.txt | 9 - res/cardsfolder/gloom.txt | 16 - res/cardsfolder/gloomdrifter.txt | 13 - res/cardsfolder/gloomhunter.txt | 10 - res/cardsfolder/gloomlance.txt | 10 - res/cardsfolder/gloomwidow.txt | 11 - res/cardsfolder/gloomwidows_feast.txt | 10 - res/cardsfolder/glorious_anthem.txt | 14 - res/cardsfolder/glorious_charge.txt | 9 - res/cardsfolder/glory.txt | 10 - res/cardsfolder/glory_of_warfare.txt | 11 - res/cardsfolder/glory_seeker.txt | 12 - res/cardsfolder/gloryscale_viashino.txt | 12 - res/cardsfolder/glowing_anemone.txt | 11 - res/cardsfolder/glowrider.txt | 10 - res/cardsfolder/gluttonous_slime.txt | 11 - res/cardsfolder/gluttonous_zombie.txt | 12 - res/cardsfolder/glyph_of_destruction.txt | 12 - res/cardsfolder/gnarled_effigy.txt | 9 - res/cardsfolder/gnarled_mass.txt | 9 - res/cardsfolder/gnarlid_pack.txt | 10 - res/cardsfolder/gnat_alley_creeper.txt | 10 - res/cardsfolder/gnat_miser.txt | 10 - res/cardsfolder/gnathosaur.txt | 11 - res/cardsfolder/go_for_the_throat.txt | 9 - res/cardsfolder/goatnapper.txt | 11 - res/cardsfolder/gobhobbler_rats.txt | 11 - res/cardsfolder/goblin_arsonist.txt | 11 - res/cardsfolder/goblin_artillery.txt | 11 - res/cardsfolder/goblin_assault.txt | 11 - res/cardsfolder/goblin_balloon_brigade.txt | 16 - res/cardsfolder/goblin_berserker.txt | 11 - res/cardsfolder/goblin_bombardment.txt | 10 - res/cardsfolder/goblin_brigand.txt | 11 - res/cardsfolder/goblin_bully.txt | 9 - res/cardsfolder/goblin_burrows.txt | 10 - res/cardsfolder/goblin_bushwhacker.txt | 13 - res/cardsfolder/goblin_cavaliers.txt | 10 - res/cardsfolder/goblin_caves.txt | 12 - res/cardsfolder/goblin_charbelcher.txt | 8 - res/cardsfolder/goblin_chariot.txt | 13 - res/cardsfolder/goblin_chieftain.txt | 14 - res/cardsfolder/goblin_chirurgeon.txt | 10 - res/cardsfolder/goblin_clearcutter.txt | 14 - res/cardsfolder/goblin_commando.txt | 12 - res/cardsfolder/goblin_deathraiders.txt | 10 - res/cardsfolder/goblin_digging_team.txt | 13 - res/cardsfolder/goblin_dirigible.txt | 13 - res/cardsfolder/goblin_dynamo.txt | 13 - res/cardsfolder/goblin_elite_infantry.txt | 15 - res/cardsfolder/goblin_firebug.txt | 11 - res/cardsfolder/goblin_firestarter.txt | 10 - res/cardsfolder/goblin_gardener.txt | 12 - res/cardsfolder/goblin_gaveleer.txt | 13 - res/cardsfolder/goblin_general.txt | 12 - res/cardsfolder/goblin_glider.txt | 14 - res/cardsfolder/goblin_goon.txt | 10 - res/cardsfolder/goblin_grenade.txt | 9 - res/cardsfolder/goblin_grenadiers.txt | 12 - res/cardsfolder/goblin_guide.txt | 12 - res/cardsfolder/goblin_hero.txt | 11 - res/cardsfolder/goblin_king.txt | 21 - res/cardsfolder/goblin_lackey.txt | 11 - res/cardsfolder/goblin_legionnaire.txt | 12 - res/cardsfolder/goblin_lookout.txt | 10 - res/cardsfolder/goblin_lore.txt | 11 - res/cardsfolder/goblin_marshal.txt | 13 - res/cardsfolder/goblin_masons.txt | 11 - res/cardsfolder/goblin_matron.txt | 13 - res/cardsfolder/goblin_medics.txt | 11 - res/cardsfolder/goblin_mountaineer.txt | 13 - res/cardsfolder/goblin_mutant.txt | 12 - res/cardsfolder/goblin_offensive.txt | 11 - res/cardsfolder/goblin_outlander.txt | 10 - res/cardsfolder/goblin_patrol.txt | 10 - res/cardsfolder/goblin_piker.txt | 13 - res/cardsfolder/goblin_piledriver.txt | 13 - res/cardsfolder/goblin_pyromancer.txt | 14 - res/cardsfolder/goblin_raider.txt | 13 - res/cardsfolder/goblin_razerunners.txt | 13 - res/cardsfolder/goblin_replica.txt | 10 - res/cardsfolder/goblin_rimerunner.txt | 11 - res/cardsfolder/goblin_ringleader.txt | 13 - res/cardsfolder/goblin_roughrider.txt | 9 - res/cardsfolder/goblin_ruinblaster.txt | 14 - res/cardsfolder/goblin_scouts.txt | 9 - res/cardsfolder/goblin_settler.txt | 11 - res/cardsfolder/goblin_sharpshooter.txt | 13 - res/cardsfolder/goblin_shortcutter.txt | 12 - res/cardsfolder/goblin_shrine.txt | 15 - res/cardsfolder/goblin_ski_patrol.txt | 11 - res/cardsfolder/goblin_sky_raider.txt | 12 - res/cardsfolder/goblin_skycutter.txt | 11 - res/cardsfolder/goblin_sledder.txt | 10 - res/cardsfolder/goblin_soothsayer.txt | 10 - res/cardsfolder/goblin_spelunkers.txt | 12 - res/cardsfolder/goblin_spy.txt | 10 - res/cardsfolder/goblin_striker.txt | 11 - res/cardsfolder/goblin_swine_rider.txt | 11 - res/cardsfolder/goblin_taskmaster.txt | 11 - res/cardsfolder/goblin_tinkerer.txt | 12 - res/cardsfolder/goblin_trenches.txt | 9 - res/cardsfolder/goblin_tunneler.txt | 11 - res/cardsfolder/goblin_turncoat.txt | 10 - res/cardsfolder/goblin_vandal.txt | 13 - res/cardsfolder/goblin_war_buggy.txt | 11 - res/cardsfolder/goblin_war_paint.txt | 10 - res/cardsfolder/goblin_war_strike.txt | 12 - res/cardsfolder/goblin_war_wagon.txt | 12 - res/cardsfolder/goblin_warchief.txt | 13 - res/cardsfolder/goblin_wardriver.txt | 11 - res/cardsfolder/goblin_warrens.txt | 13 - res/cardsfolder/goblin_wizard.txt | 11 - res/cardsfolder/godhead_of_awe.txt | 11 - res/cardsfolder/godless_shrine.txt | 8 - res/cardsfolder/godos_irregulars.txt | 10 - .../gods_eye_gate_to_the_reikai.txt | 12 - res/cardsfolder/godsire.txt | 11 - res/cardsfolder/godtoucher.txt | 12 - res/cardsfolder/godtracker_of_jund.txt | 11 - res/cardsfolder/gold_myr.txt | 11 - res/cardsfolder/golden_bear.txt | 9 - res/cardsfolder/golden_urn.txt | 12 - res/cardsfolder/goldenglow_moth.txt | 13 - res/cardsfolder/goldmeadow_dodger.txt | 10 - res/cardsfolder/goldmeadow_harrier.txt | 10 - res/cardsfolder/goldmeadow_lookout.txt | 9 - res/cardsfolder/golem_artisan.txt | 13 - res/cardsfolder/golem_foundry.txt | 11 - res/cardsfolder/golems_heart.txt | 10 - res/cardsfolder/golgari_brownscale.txt | 12 - res/cardsfolder/golgari_germination.txt | 10 - res/cardsfolder/golgari_grave_troll.txt | 13 - res/cardsfolder/golgari_guildmage.txt | 11 - res/cardsfolder/golgari_rot_farm.txt | 13 - res/cardsfolder/golgari_rotwurm.txt | 10 - res/cardsfolder/golgari_signet.txt | 10 - res/cardsfolder/golgari_thug.txt | 12 - res/cardsfolder/goliath_beetle.txt | 10 - res/cardsfolder/goliath_sphinx.txt | 10 - res/cardsfolder/goliath_spider.txt | 10 - res/cardsfolder/gore_vassal.txt | 9 - res/cardsfolder/goretusk_firebeast.txt | 11 - res/cardsfolder/gorger_wurm.txt | 10 - res/cardsfolder/gorgon_flail.txt | 9 - res/cardsfolder/gorgon_recluse.txt | 16 - res/cardsfolder/gorilla_chieftain.txt | 12 - res/cardsfolder/gorilla_pack.txt | 12 - res/cardsfolder/gorilla_shaman.txt | 13 - res/cardsfolder/gorilla_warrior.txt | 11 - res/cardsfolder/gossamer_chains.txt | 10 - res/cardsfolder/gossamer_phantasm.txt | 12 - res/cardsfolder/gosta_dirk.txt | 11 - res/cardsfolder/graceful_adept.txt | 10 - res/cardsfolder/grafted_exoskeleton.txt | 11 - res/cardsfolder/grafted_skullcap.txt | 14 - res/cardsfolder/grafted_wargear.txt | 11 - res/cardsfolder/grand_arbiter_augustin_iv.txt | 12 - res/cardsfolder/grand_coliseum.txt | 17 - res/cardsfolder/grandmother_sengir.txt | 10 - res/cardsfolder/granger_guildmage.txt | 12 - res/cardsfolder/granite_gargoyle.txt | 14 - res/cardsfolder/granite_grip.txt | 14 - res/cardsfolder/granite_shard.txt | 10 - res/cardsfolder/granulate.txt | 9 - res/cardsfolder/grapeshot.txt | 10 - res/cardsfolder/grapeshot_catapult.txt | 13 - res/cardsfolder/grappler_spider.txt | 10 - res/cardsfolder/grasp_of_darkness.txt | 9 - res/cardsfolder/grassland_crusader.txt | 11 - res/cardsfolder/grasslands.txt | 10 - res/cardsfolder/gratuitous_violence.txt | 9 - res/cardsfolder/grave_defiler.txt | 12 - res/cardsfolder/grave_pact.txt | 13 - res/cardsfolder/grave_robbers.txt | 11 - res/cardsfolder/grave_shell_scarab.txt | 11 - res/cardsfolder/grave_titan.txt | 13 - res/cardsfolder/gravebind.txt | 12 - res/cardsfolder/graveborn_muse.txt | 15 - res/cardsfolder/gravedigger.txt | 21 - res/cardsfolder/gravel_slinger.txt | 11 - res/cardsfolder/gravelgill_axeshark.txt | 10 - res/cardsfolder/gravelgill_duo.txt | 14 - res/cardsfolder/graven_cairns.txt | 14 - res/cardsfolder/gravespawn_sovereign.txt | 11 - res/cardsfolder/gravitational_shift.txt | 12 - res/cardsfolder/gray_ogre.txt | 13 - res/cardsfolder/graypelt_hunter.txt | 14 - res/cardsfolder/graypelt_refuge.txt | 13 - res/cardsfolder/grayscaled_gharial.txt | 10 - res/cardsfolder/grazing_gladehart.txt | 11 - res/cardsfolder/grazing_kelpie.txt | 12 - res/cardsfolder/great_defender.txt | 11 - res/cardsfolder/great_furnace.txt | 9 - res/cardsfolder/great_sable_stag.txt | 12 - res/cardsfolder/great_wall.txt | 9 - res/cardsfolder/great_whale.txt | 11 - res/cardsfolder/greatbow_doyen.txt | 13 - res/cardsfolder/greater_auramancy.txt | 11 - res/cardsfolder/greater_basilisk.txt | 10 - res/cardsfolder/greater_forgeling.txt | 10 - res/cardsfolder/greater_good.txt | 13 - res/cardsfolder/greater_mossdog.txt | 10 - res/cardsfolder/greed.txt | 12 - res/cardsfolder/greel_mind_raker.txt | 12 - res/cardsfolder/greels_caress.txt | 11 - res/cardsfolder/green_mana_battery.txt | 11 - res/cardsfolder/green_scarab.txt | 12 - res/cardsfolder/green_suns_zenith.txt | 12 - res/cardsfolder/green_ward.txt | 15 - res/cardsfolder/greener_pastures.txt | 9 - res/cardsfolder/greenhilt_trainee.txt | 11 - res/cardsfolder/greenseeker.txt | 11 - res/cardsfolder/greenweaver_druid.txt | 11 - res/cardsfolder/gremlin_mine.txt | 10 - res/cardsfolder/griffin_canyon.txt | 12 - res/cardsfolder/griffin_guide.txt | 12 - res/cardsfolder/griffin_sentinel.txt | 11 - res/cardsfolder/grim_affliction.txt | 10 - res/cardsfolder/grim_feast.txt | 14 - res/cardsfolder/grim_harvest.txt | 10 - res/cardsfolder/grim_lavamancer.txt | 10 - res/cardsfolder/grim_monolith.txt | 12 - res/cardsfolder/grim_poppet.txt | 11 - res/cardsfolder/grim_tutor.txt | 11 - res/cardsfolder/grimclaw_bats.txt | 11 - res/cardsfolder/grindclock.txt | 11 - res/cardsfolder/grinding_station.txt | 12 - res/cardsfolder/grindstone.txt | 8 - res/cardsfolder/grinning_demon.txt | 12 - res/cardsfolder/grinning_ignus.txt | 11 - res/cardsfolder/gristle_grinner.txt | 11 - res/cardsfolder/gristleback.txt | 12 - res/cardsfolder/grixis_battlemage.txt | 12 - res/cardsfolder/grixis_charm.txt | 12 - res/cardsfolder/grixis_grimblade.txt | 11 - res/cardsfolder/grixis_panorama.txt | 10 - res/cardsfolder/grixis_slavedriver.txt | 12 - res/cardsfolder/grixis_sojourners.txt | 13 - res/cardsfolder/grizzled_leotau.txt | 9 - res/cardsfolder/grizzled_wolverine.txt | 11 - res/cardsfolder/grizzly_bears.txt | 21 - res/cardsfolder/grizzly_fate.txt | 11 - res/cardsfolder/groffskithur.txt | 11 - res/cardsfolder/grollub.txt | 13 - res/cardsfolder/grotag_siege_runner.txt | 11 - res/cardsfolder/grotag_thrasher.txt | 11 - res/cardsfolder/grotesque_hybrid.txt | 12 - res/cardsfolder/ground_rift.txt | 10 - res/cardsfolder/groundbreaker.txt | 12 - res/cardsfolder/groundling_pouncer.txt | 10 - res/cardsfolder/groundskeeper.txt | 11 - res/cardsfolder/grove_of_the_burnwillows.txt | 12 - res/cardsfolder/growth_spasm.txt | 11 - res/cardsfolder/gruesome_encore.txt | 10 - res/cardsfolder/gruul_guildmage.txt | 11 - res/cardsfolder/gruul_signet.txt | 10 - res/cardsfolder/gruul_turf.txt | 13 - res/cardsfolder/gruul_war_plow.txt | 10 - res/cardsfolder/guan_yu_sainted_warrior.txt | 12 - res/cardsfolder/guan_yus_1000_li_march.txt | 9 - res/cardsfolder/guard_duty.txt | 10 - res/cardsfolder/guard_gomazoa.txt | 12 - res/cardsfolder/guardian_idol.txt | 11 - res/cardsfolder/guardian_of_cloverdell.txt | 12 - res/cardsfolder/guardian_of_solitude.txt | 12 - res/cardsfolder/guardian_of_the_guildpact.txt | 10 - res/cardsfolder/guardian_seraph.txt | 11 - res/cardsfolder/guardian_zendikon.txt | 12 - res/cardsfolder/guardians_magemark.txt | 12 - res/cardsfolder/guardians_of_akrasa.txt | 11 - res/cardsfolder/guerrilla_tactics.txt | 14 - res/cardsfolder/guided_strike.txt | 11 - res/cardsfolder/guiltfeeder.txt | 13 - res/cardsfolder/guilty_conscience.txt | 12 - res/cardsfolder/guma.txt | 10 - res/cardsfolder/gush.txt | 10 - res/cardsfolder/gust_skimmer.txt | 10 - res/cardsfolder/gustrider_exuberant.txt | 11 - res/cardsfolder/gut_shot.txt | 9 - res/cardsfolder/gutless_ghoul.txt | 10 - res/cardsfolder/guttural_response.txt | 9 - res/cardsfolder/gutwrencher_oni.txt | 14 - res/cardsfolder/guul_draz_assassin.txt | 17 - res/cardsfolder/guul_draz_specter.txt | 13 - res/cardsfolder/guul_draz_vampire.txt | 10 - res/cardsfolder/gwafa_hazid_profiteer.txt | 13 - res/cardsfolder/gwendlyn_di_corci.txt | 10 - res/cardsfolder/gwyllion_hedge_mage.txt | 13 - res/cardsfolder/haazda_exonerator.txt | 10 - res/cardsfolder/hada_freeblade.txt | 13 - res/cardsfolder/hada_spy_patrol.txt | 14 - res/cardsfolder/hag_hedge_mage.txt | 13 - res/cardsfolder/hagra_crocodile.txt | 13 - res/cardsfolder/hagra_diabolist.txt | 16 - res/cardsfolder/hail_storm.txt | 13 - res/cardsfolder/hair_strung_koto.txt | 10 - res/cardsfolder/halberdier.txt | 10 - res/cardsfolder/halcyon_glaze.txt | 11 - res/cardsfolder/halimar_depths.txt | 12 - res/cardsfolder/halimar_excavator.txt | 15 - res/cardsfolder/halimar_wavewatch.txt | 13 - res/cardsfolder/hallowed_burial.txt | 9 - res/cardsfolder/hallowed_fountain.txt | 8 - res/cardsfolder/hallowed_ground.txt | 10 - res/cardsfolder/halo_hunter.txt | 12 - res/cardsfolder/halt_order.txt | 10 - res/cardsfolder/hamletback_goliath.txt | 12 - res/cardsfolder/hammer_mage.txt | 12 - res/cardsfolder/hammer_of_bogardan.txt | 12 - res/cardsfolder/hammer_of_ruin.txt | 11 - res/cardsfolder/hammerfist_giant.txt | 10 - res/cardsfolder/hammerhead_shark.txt | 10 - res/cardsfolder/hammerheim_deadeye.txt | 12 - res/cardsfolder/hana_kami.txt | 11 - res/cardsfolder/hand_of_cruelty.txt | 11 - res/cardsfolder/hand_of_death.txt | 11 - res/cardsfolder/hand_of_emrakul.txt | 11 - res/cardsfolder/hand_of_honor.txt | 11 - res/cardsfolder/hand_of_justice.txt | 10 - res/cardsfolder/hand_of_the_praetors.txt | 13 - res/cardsfolder/hanna_ships_navigator.txt | 10 - res/cardsfolder/hannas_custody.txt | 10 - res/cardsfolder/hapless_researcher.txt | 12 - res/cardsfolder/harabaz_druid.txt | 17 - res/cardsfolder/harbinger_of_night.txt | 12 - res/cardsfolder/harbinger_of_spring.txt | 11 - res/cardsfolder/harbor_guardian.txt | 12 - res/cardsfolder/harbor_serpent.txt | 11 - res/cardsfolder/harmattan_efreet.txt | 12 - res/cardsfolder/harmonic_convergence.txt | 10 - res/cardsfolder/harmonize.txt | 9 - res/cardsfolder/harpoon_sniper.txt | 12 - res/cardsfolder/harrier_griffin.txt | 12 - res/cardsfolder/harrow.txt | 11 - res/cardsfolder/haru_onna.txt | 13 - res/cardsfolder/harvest_gwyllion.txt | 10 - res/cardsfolder/harvester_druid.txt | 11 - res/cardsfolder/hasran_ogress.txt | 12 - res/cardsfolder/hatchet_bully.txt | 11 - res/cardsfolder/hatching_plans.txt | 12 - res/cardsfolder/hate_weaver.txt | 12 - res/cardsfolder/hateflayer.txt | 12 - res/cardsfolder/haunted_angel.txt | 14 - res/cardsfolder/haunted_cadaver.txt | 13 - res/cardsfolder/haunted_crossroads.txt | 10 - res/cardsfolder/haunting_apparition.txt | 11 - res/cardsfolder/haunting_echoes.txt | 11 - res/cardsfolder/haunting_hymn.txt | 10 - res/cardsfolder/haunting_misery.txt | 9 - res/cardsfolder/haunting_wind.txt | 11 - res/cardsfolder/havenwood_battleground.txt | 14 - res/cardsfolder/havenwood_wurm.txt | 11 - res/cardsfolder/havoc.txt | 11 - res/cardsfolder/havoc_demon.txt | 13 - res/cardsfolder/hawkeater_moth.txt | 11 - res/cardsfolder/haze_of_rage.txt | 11 - res/cardsfolder/hazerider_drake.txt | 11 - res/cardsfolder/hazy_homunculus.txt | 11 - res/cardsfolder/he_who_hungers.txt | 13 - res/cardsfolder/headhunter.txt | 12 - res/cardsfolder/headless_horseman.txt | 9 - res/cardsfolder/headlong_rush.txt | 10 - res/cardsfolder/headstone.txt | 10 - res/cardsfolder/heal.txt | 11 - res/cardsfolder/healing_leaves.txt | 11 - res/cardsfolder/healing_salve.txt | 21 - res/cardsfolder/heap_doll.txt | 11 - res/cardsfolder/heart_of_light.txt | 11 - res/cardsfolder/heart_of_ramos.txt | 11 - res/cardsfolder/heart_of_yavimaya.txt | 11 - res/cardsfolder/heart_sliver.txt | 13 - res/cardsfolder/heart_warden.txt | 12 - res/cardsfolder/hearth_charm.txt | 12 - res/cardsfolder/hearthcage_giant.txt | 12 - res/cardsfolder/hearthfire_hobgoblin.txt | 10 - res/cardsfolder/heartlash_cinder.txt | 13 - res/cardsfolder/heartless_hidetsugu.txt | 14 - res/cardsfolder/heartmender.txt | 12 - res/cardsfolder/heartstabber_mosquito.txt | 13 - res/cardsfolder/heartstone.txt | 9 - res/cardsfolder/heartwood_dryad.txt | 10 - res/cardsfolder/heartwood_shard.txt | 10 - res/cardsfolder/heartwood_treefolk.txt | 10 - res/cardsfolder/heat_of_battle.txt | 11 - res/cardsfolder/heat_ray.txt | 11 - res/cardsfolder/heat_shimmer.txt | 9 - res/cardsfolder/heavens_gate.txt | 11 - res/cardsfolder/heavy_arbalest.txt | 12 - res/cardsfolder/heavy_ballista.txt | 13 - res/cardsfolder/hedge_troll.txt | 11 - res/cardsfolder/hedron_crab.txt | 11 - res/cardsfolder/hedron_matrix.txt | 8 - res/cardsfolder/hedron_rover.txt | 12 - res/cardsfolder/hedron_scrabbler.txt | 12 - res/cardsfolder/heedless_one.txt | 12 - res/cardsfolder/heidar_rimewind_master.txt | 11 - res/cardsfolder/heightened_awareness.txt | 13 - res/cardsfolder/helionaut.txt | 16 - res/cardsfolder/heliophial.txt | 11 - res/cardsfolder/helix_pinnacle.txt | 13 - res/cardsfolder/hell_bent_raider.txt | 13 - res/cardsfolder/hell_swarm.txt | 10 - res/cardsfolder/helldozer.txt | 9 - res/cardsfolder/hellfire.txt | 13 - res/cardsfolder/hellfire_mongrel.txt | 11 - res/cardsfolder/hellhole_rats.txt | 14 - res/cardsfolder/hellion_eruption.txt | 8 - res/cardsfolder/hellkite_igniter.txt | 14 - res/cardsfolder/hellkite_overlord.txt | 14 - res/cardsfolder/hells_caretaker.txt | 12 - res/cardsfolder/hells_thunder.txt | 13 - res/cardsfolder/hellspark_elemental.txt | 13 - res/cardsfolder/helm_of_awakening.txt | 9 - res/cardsfolder/helm_of_possession.txt | 11 - res/cardsfolder/helm_of_the_ghastlord.txt | 16 - res/cardsfolder/hematite_golem.txt | 10 - res/cardsfolder/hematite_talisman.txt | 11 - res/cardsfolder/henchfiend_of_ukor.txt | 12 - res/cardsfolder/henge_guardian.txt | 10 - res/cardsfolder/henge_of_ramos.txt | 15 - res/cardsfolder/herald_of_serra.txt | 12 - res/cardsfolder/herbal_poultice.txt | 9 - res/cardsfolder/herd_gnarr.txt | 12 - res/cardsfolder/heritage_druid.txt | 11 - res/cardsfolder/hermetic_study.txt | 12 - res/cardsfolder/hermit_druid.txt | 10 - res/cardsfolder/hero_of_bladehold.txt | 13 - res/cardsfolder/hero_of_oxid_ridge.txt | 15 - res/cardsfolder/heroes_remembered.txt | 10 - res/cardsfolder/heroes_reunion.txt | 9 - res/cardsfolder/heros_demise.txt | 9 - res/cardsfolder/heros_resolve.txt | 11 - res/cardsfolder/hex.txt | 9 - res/cardsfolder/hexplate_golem.txt | 9 - res/cardsfolder/hibernation.txt | 12 - res/cardsfolder/hibernation_sliver.txt | 12 - res/cardsfolder/hickory_woodlot.txt | 13 - res/cardsfolder/hidden_ancients.txt | 10 - res/cardsfolder/hidden_gibbons.txt | 10 - res/cardsfolder/hidden_guerrillas.txt | 10 - res/cardsfolder/hidden_herd.txt | 10 - res/cardsfolder/hidden_path.txt | 10 - res/cardsfolder/hidden_spider.txt | 10 - res/cardsfolder/hideous_end.txt | 10 - res/cardsfolder/hidetsugus_second_rite.txt | 9 - res/cardsfolder/high_market.txt | 11 - res/cardsfolder/high_seas.txt | 11 - res/cardsfolder/high_tide.txt | 12 - res/cardsfolder/highland_berserker.txt | 15 - res/cardsfolder/highland_giant.txt | 9 - res/cardsfolder/highland_weald.txt | 11 - res/cardsfolder/highway_robber.txt | 14 - res/cardsfolder/higure_the_still_wind.txt | 14 - res/cardsfolder/hill_giant.txt | 19 - res/cardsfolder/hillcomber_giant.txt | 10 - res/cardsfolder/hindering_light.txt | 10 - res/cardsfolder/hindering_touch.txt | 11 - res/cardsfolder/hired_giant.txt | 11 - res/cardsfolder/hisokas_defiance.txt | 10 - res/cardsfolder/hissing_iguanar.txt | 11 - res/cardsfolder/hissing_miasma.txt | 10 - res/cardsfolder/hivestone.txt | 10 - res/cardsfolder/hivis_of_the_scale.txt | 12 - res/cardsfolder/hoar_shade.txt | 10 - res/cardsfolder/hoard_smelter_dragon.txt | 13 - res/cardsfolder/hoarders_greed.txt | 12 - res/cardsfolder/hobble.txt | 13 - res/cardsfolder/hobgoblin_dragoon.txt | 11 - res/cardsfolder/hokori_dust_drinker.txt | 10 - res/cardsfolder/hold_the_line.txt | 10 - res/cardsfolder/hollow_dogs.txt | 14 - res/cardsfolder/hollow_trees.txt | 12 - res/cardsfolder/hollowborn_barghest.txt | 12 - res/cardsfolder/hollowsage.txt | 11 - res/cardsfolder/holy_armor.txt | 15 - res/cardsfolder/holy_day.txt | 13 - res/cardsfolder/holy_light.txt | 10 - res/cardsfolder/holy_strength.txt | 21 - res/cardsfolder/homarid.txt | 14 - res/cardsfolder/homarid_shaman.txt | 11 - res/cardsfolder/homarid_spawning_bed.txt | 11 - res/cardsfolder/homarid_warrior.txt | 13 - res/cardsfolder/honden_of_cleansing_fire.txt | 11 - res/cardsfolder/honden_of_infinite_rage.txt | 11 - res/cardsfolder/honden_of_lifes_web.txt | 11 - res/cardsfolder/honden_of_nights_reach.txt | 11 - res/cardsfolder/honden_of_seeing_winds.txt | 11 - res/cardsfolder/honor_guard.txt | 14 - res/cardsfolder/honor_of_the_pure.txt | 11 - res/cardsfolder/honor_worn_shaku.txt | 11 - res/cardsfolder/hooded_kavu.txt | 10 - res/cardsfolder/hoodwink.txt | 9 - res/cardsfolder/hoof_skulkin.txt | 11 - res/cardsfolder/hoofprints_of_the_stag.txt | 11 - res/cardsfolder/hope_and_glory.txt | 12 - res/cardsfolder/hope_charm.txt | 12 - res/cardsfolder/hopping_automaton.txt | 10 - res/cardsfolder/horde_of_notions.txt | 12 - res/cardsfolder/horizon_canopy.txt | 12 - res/cardsfolder/horizon_drake.txt | 11 - res/cardsfolder/horizon_spellbomb.txt | 11 - res/cardsfolder/horn_of_deafening.txt | 10 - res/cardsfolder/horn_of_greed.txt | 11 - res/cardsfolder/horn_of_ramos.txt | 11 - res/cardsfolder/horned_cheetah.txt | 12 - res/cardsfolder/horned_kavu.txt | 12 - res/cardsfolder/horned_sliver.txt | 11 - res/cardsfolder/horned_troll.txt | 11 - res/cardsfolder/horned_turtle.txt | 15 - res/cardsfolder/hornet_cannon.txt | 9 - res/cardsfolder/hornet_cobra.txt | 10 - res/cardsfolder/hornet_harasser.txt | 11 - res/cardsfolder/hornet_sting.txt | 9 - res/cardsfolder/horobi_deaths_wail.txt | 10 - res/cardsfolder/horrible_hordes.txt | 10 - res/cardsfolder/horrifying_revelation.txt | 10 - res/cardsfolder/horror_of_horrors.txt | 11 - res/cardsfolder/horseshoe_crab.txt | 11 - res/cardsfolder/hostile_realm.txt | 11 - res/cardsfolder/hoverguard_observer.txt | 11 - res/cardsfolder/hoverguard_sweepers.txt | 12 - res/cardsfolder/hovermyr.txt | 11 - res/cardsfolder/howl_from_beyond.txt | 19 - res/cardsfolder/howl_of_the_night_pack.txt | 11 - res/cardsfolder/howling_banshee.txt | 13 - res/cardsfolder/howling_fury.txt | 10 - res/cardsfolder/howling_gale.txt | 10 - res/cardsfolder/howling_mine.txt | 21 - res/cardsfolder/howling_wolf.txt | 11 - res/cardsfolder/hua_tuo_honored_physician.txt | 11 - res/cardsfolder/huang_zhong_shu_general.txt | 10 - res/cardsfolder/hulking_cyclops.txt | 13 - res/cardsfolder/hulking_goblin.txt | 11 - res/cardsfolder/hulking_ogre.txt | 11 - res/cardsfolder/hull_breach.txt | 13 - res/cardsfolder/hum_of_the_radix.txt | 10 - res/cardsfolder/humble_budoka.txt | 10 - res/cardsfolder/hunding_gjornersen.txt | 10 - res/cardsfolder/hundroog.txt | 10 - res/cardsfolder/hunger_of_the_nim.txt | 11 - res/cardsfolder/hungry_mist.txt | 11 - res/cardsfolder/hungry_spriggan.txt | 12 - res/cardsfolder/hunted_dragon.txt | 13 - res/cardsfolder/hunted_horror.txt | 12 - res/cardsfolder/hunted_lammasu.txt | 12 - res/cardsfolder/hunted_phantasm.txt | 12 - res/cardsfolder/hunted_troll.txt | 12 - res/cardsfolder/hunted_wumpus.txt | 14 - res/cardsfolder/hunting_cheetah.txt | 11 - res/cardsfolder/hunting_drake.txt | 13 - res/cardsfolder/hunting_grounds.txt | 10 - res/cardsfolder/hunting_moa.txt | 14 - res/cardsfolder/hunting_pack.txt | 10 - res/cardsfolder/hunting_triad.txt | 12 - res/cardsfolder/hurkyls_recall.txt | 12 - res/cardsfolder/hurloon_minotaur.txt | 14 - res/cardsfolder/hurloon_shaman.txt | 12 - res/cardsfolder/hurly_burly.txt | 11 - res/cardsfolder/hurr_jackal.txt | 12 - res/cardsfolder/hurricane.txt | 22 - res/cardsfolder/hush.txt | 10 - res/cardsfolder/hyalopterous_lemure.txt | 10 - res/cardsfolder/hydromorph_guardian.txt | 11 - res/cardsfolder/hydromorph_gull.txt | 12 - res/cardsfolder/hyena_umbra.txt | 11 - res/cardsfolder/hymn_of_rebirth.txt | 9 - res/cardsfolder/hymn_to_tourach.txt | 9 - res/cardsfolder/hyperion_blacksmith.txt | 11 - res/cardsfolder/hypervolt_grasp.txt | 13 - res/cardsfolder/hypnotic_specter.txt | 19 - res/cardsfolder/hypochondria.txt | 11 - res/cardsfolder/hystrodon.txt | 13 - res/cardsfolder/icatian_crier.txt | 11 - res/cardsfolder/icatian_javelineers.txt | 12 - res/cardsfolder/icatian_lieutenant.txt | 10 - res/cardsfolder/icatian_moneychanger.txt | 17 - res/cardsfolder/icatian_priest.txt | 11 - res/cardsfolder/icatian_scout.txt | 11 - res/cardsfolder/icatian_store.txt | 12 - res/cardsfolder/icatian_town.txt | 11 - res/cardsfolder/ice_cage.txt | 11 - res/cardsfolder/ice_storm.txt | 11 - res/cardsfolder/iceberg.txt | 13 - res/cardsfolder/icefall.txt | 10 - res/cardsfolder/icequake.txt | 10 - res/cardsfolder/ichneumon_druid.txt | 10 - res/cardsfolder/ichor_explosion.txt | 11 - res/cardsfolder/ichor_rats.txt | 12 - res/cardsfolder/ichor_slick.txt | 11 - res/cardsfolder/ichor_wellspring.txt | 13 - res/cardsfolder/ichorclaw_myr.txt | 12 - res/cardsfolder/ichorid.txt | 13 - res/cardsfolder/icy_manipulator.txt | 16 - res/cardsfolder/identity_crisis.txt | 10 - res/cardsfolder/idle_thoughts.txt | 9 - res/cardsfolder/idyllic_tutor.txt | 10 - res/cardsfolder/ifh_biff_efreet.txt | 11 - res/cardsfolder/igneous_golem.txt | 10 - res/cardsfolder/igneous_pouncer.txt | 12 - res/cardsfolder/ignite_disorder.txt | 12 - res/cardsfolder/ignite_memories.txt | 9 - res/cardsfolder/ihsans_shade.txt | 10 - res/cardsfolder/iizuka_the_ruthless.txt | 12 - res/cardsfolder/ikiral_outrider.txt | 13 - res/cardsfolder/ill_gotten_gains.txt | 13 - res/cardsfolder/illuminated_wings.txt | 12 - res/cardsfolder/illumination.txt | 16 - res/cardsfolder/illusionary_forces.txt | 11 - res/cardsfolder/illusionary_servant.txt | 12 - res/cardsfolder/illusionary_wall.txt | 13 - res/cardsfolder/illusions_of_grandeur.txt | 14 - res/cardsfolder/illusory_demon.txt | 13 - res/cardsfolder/imaginary_pet.txt | 13 - res/cardsfolder/imi_statue.txt | 9 - res/cardsfolder/immaculate_magistrate.txt | 11 - res/cardsfolder/immobilizing_ink.txt | 12 - res/cardsfolder/immolating_souleater.txt | 10 - res/cardsfolder/immolation.txt | 11 - res/cardsfolder/impaler_shrike.txt | 12 - res/cardsfolder/impending_disaster.txt | 12 - res/cardsfolder/imperial_edict.txt | 9 - res/cardsfolder/imperial_hellkite.txt | 13 - res/cardsfolder/imperial_recruiter.txt | 11 - res/cardsfolder/imperial_seal.txt | 10 - res/cardsfolder/imperiosaur.txt | 9 - res/cardsfolder/imperious_perfect.txt | 12 - res/cardsfolder/implements_of_sacrifice.txt | 14 - res/cardsfolder/implode.txt | 10 - res/cardsfolder/improvised_armor.txt | 11 - res/cardsfolder/impulse.txt | 10 - res/cardsfolder/in_the_web_of_war.txt | 10 - res/cardsfolder/incendiary.txt | 14 - res/cardsfolder/incendiary_command.txt | 9 - res/cardsfolder/incinerate.txt | 13 - res/cardsfolder/incurable_ogre.txt | 9 - res/cardsfolder/indebted_samurai.txt | 12 - res/cardsfolder/independent_troops.txt | 9 - res/cardsfolder/indestructible_aura.txt | 10 - res/cardsfolder/index.txt | 12 - res/cardsfolder/indigo_faerie.txt | 12 - res/cardsfolder/indomitable_ancients.txt | 9 - res/cardsfolder/indomitable_archangel.txt | 12 - res/cardsfolder/indomitable_will.txt | 11 - res/cardsfolder/indrik_stomphowler.txt | 11 - res/cardsfolder/inexorable_tide.txt | 10 - res/cardsfolder/infantry_veteran.txt | 13 - res/cardsfolder/infected_vermin.txt | 11 - res/cardsfolder/infectious_horror.txt | 11 - res/cardsfolder/infectious_host.txt | 11 - res/cardsfolder/infernal_caretaker.txt | 13 - res/cardsfolder/infernal_contract.txt | 12 - res/cardsfolder/infernal_kirin.txt | 14 - res/cardsfolder/infernal_medusa.txt | 15 - res/cardsfolder/infernal_tribute.txt | 10 - res/cardsfolder/inferno.txt | 14 - res/cardsfolder/inferno_titan.txt | 15 - res/cardsfolder/infest.txt | 10 - res/cardsfolder/infested_roothold.txt | 13 - res/cardsfolder/infiltrate.txt | 9 - res/cardsfolder/infiltration_lens.txt | 11 - res/cardsfolder/infiltrator_il_kor.txt | 11 - res/cardsfolder/inflame.txt | 10 - res/cardsfolder/information_dealer.txt | 11 - res/cardsfolder/infuse.txt | 11 - res/cardsfolder/ingenious_thief.txt | 13 - res/cardsfolder/ingot_chewer.txt | 14 - res/cardsfolder/inheritance.txt | 10 - .../initiates_of_the_ebon_hand.txt | 12 - res/cardsfolder/ink_dissolver.txt | 10 - res/cardsfolder/ink_eyes_servant_of_oni.txt | 14 - res/cardsfolder/inkfathom_divers.txt | 12 - res/cardsfolder/inkfathom_infiltrator.txt | 11 - res/cardsfolder/inkmoth_nexus.txt | 10 - res/cardsfolder/inkwell_leviathan.txt | 12 - res/cardsfolder/inner_calm_outer_strength.txt | 10 - res/cardsfolder/inner_chamber_guard.txt | 10 - res/cardsfolder/inner_fire.txt | 11 - res/cardsfolder/inner_flame_acolyte.txt | 15 - res/cardsfolder/innocence_kami.txt | 13 - res/cardsfolder/innocent_blood.txt | 10 - res/cardsfolder/inquisition_of_kozilek.txt | 9 - res/cardsfolder/insatiable_souleater.txt | 10 - res/cardsfolder/inside_out.txt | 11 - res/cardsfolder/insidious_bookworms.txt | 11 - res/cardsfolder/insight.txt | 12 - res/cardsfolder/insolence.txt | 11 - res/cardsfolder/inspiration.txt | 11 - res/cardsfolder/inspired_charge.txt | 9 - res/cardsfolder/inspired_sprite.txt | 16 - res/cardsfolder/inspirit.txt | 11 - res/cardsfolder/instill_energy.txt | 19 - res/cardsfolder/instill_furor.txt | 10 - res/cardsfolder/instill_infection.txt | 10 - res/cardsfolder/insurrection.txt | 9 - res/cardsfolder/intervene.txt | 9 - res/cardsfolder/intimidation.txt | 10 - res/cardsfolder/intimidator_initiate.txt | 12 - res/cardsfolder/into_the_core.txt | 9 - res/cardsfolder/into_the_north.txt | 10 - res/cardsfolder/into_the_roil.txt | 11 - res/cardsfolder/into_thin_air.txt | 10 - res/cardsfolder/intrepid_hero.txt | 12 - res/cardsfolder/intruder_alarm.txt | 11 - res/cardsfolder/intuition.txt | 8 - res/cardsfolder/inundate.txt | 10 - res/cardsfolder/invigorating_boon.txt | 11 - res/cardsfolder/invigorating_falls.txt | 10 - res/cardsfolder/invincible_hymn.txt | 10 - res/cardsfolder/inviolability.txt | 10 - res/cardsfolder/invisibility.txt | 13 - res/cardsfolder/invoke_the_firemind.txt | 13 - res/cardsfolder/iona_shield_of_emeria.txt | 10 - res/cardsfolder/ionas_judgment.txt | 9 - res/cardsfolder/ior_ruin_expedition.txt | 11 - res/cardsfolder/ire_of_kaminari.txt | 11 - res/cardsfolder/iridescent_angel.txt | 15 - res/cardsfolder/irini_sengir.txt | 11 - res/cardsfolder/iron_barb_hellion.txt | 11 - res/cardsfolder/iron_heart_chimera.txt | 13 - res/cardsfolder/iron_lance.txt | 9 - res/cardsfolder/iron_maiden.txt | 11 - res/cardsfolder/iron_myr.txt | 11 - res/cardsfolder/iron_star.txt | 19 - res/cardsfolder/iron_tusk_elephant.txt | 10 - res/cardsfolder/iron_will.txt | 10 - res/cardsfolder/ironclaw_buzzardiers.txt | 11 - res/cardsfolder/ironclaw_curse.txt | 11 - res/cardsfolder/ironclaw_orcs.txt | 14 - res/cardsfolder/ironhoof_ox.txt | 10 - res/cardsfolder/ironroot_treefolk.txt | 14 - res/cardsfolder/ironshell_beetle.txt | 11 - res/cardsfolder/irradiate.txt | 11 - res/cardsfolder/irrigation_ditch.txt | 12 - res/cardsfolder/isamaru_hound_of_konda.txt | 9 - res/cardsfolder/isao_enlightened_bushi.txt | 12 - res/cardsfolder/ishi_ishi_akki_crackshot.txt | 12 - res/cardsfolder/island.txt | 44 - res/cardsfolder/island_fish_jasconius.txt | 17 - res/cardsfolder/island_of_wak_wak.txt | 10 - res/cardsfolder/isleback_spawn.txt | 11 - res/cardsfolder/isochron_scepter.txt | 8 - res/cardsfolder/isolation_cell.txt | 10 - res/cardsfolder/it_that_betrays.txt | 12 - res/cardsfolder/ith_high_arcanist.txt | 14 - res/cardsfolder/ivory_crane_netsuke.txt | 11 - res/cardsfolder/ivory_cup.txt | 19 - res/cardsfolder/ivory_giant.txt | 13 - res/cardsfolder/ivory_guardians.txt | 13 - res/cardsfolder/ivory_tower.txt | 13 - res/cardsfolder/ivy_dancer.txt | 10 - res/cardsfolder/ivy_elemental.txt | 11 - res/cardsfolder/iwamori_of_the_open_fist.txt | 12 - res/cardsfolder/ixidors_will.txt | 12 - res/cardsfolder/izzet_boilerworks.txt | 13 - res/cardsfolder/izzet_chronarch.txt | 11 - res/cardsfolder/izzet_signet.txt | 10 - res/cardsfolder/jabaris_banner.txt | 9 - res/cardsfolder/jace_beleren.txt | 14 - res/cardsfolder/jace_the_mind_sculptor.txt | 9 - res/cardsfolder/jaces_erasure.txt | 10 - res/cardsfolder/jaces_ingenuity.txt | 9 - res/cardsfolder/jackal_pup.txt | 12 - res/cardsfolder/jackalope_herd.txt | 12 - res/cardsfolder/jacques_le_vert.txt | 11 - res/cardsfolder/jade_idol.txt | 12 - res/cardsfolder/jade_leech.txt | 10 - res/cardsfolder/jade_statue.txt | 13 - res/cardsfolder/jagged_lightning.txt | 11 - res/cardsfolder/jagged_poppet.txt | 14 - res/cardsfolder/jagged_scar_archers.txt | 13 - res/cardsfolder/jagwasp_swarm.txt | 10 - res/cardsfolder/jalum_tome.txt | 12 - res/cardsfolder/jamuraan_lion.txt | 11 - res/cardsfolder/jandors_ring.txt | 10 - res/cardsfolder/jandors_saddlebags.txt | 14 - res/cardsfolder/jangling_automaton.txt | 11 - res/cardsfolder/jareth_leonine_titan.txt | 16 - res/cardsfolder/jasmine_boreal.txt | 10 - res/cardsfolder/jawbone_skulkin.txt | 11 - res/cardsfolder/jaya_ballard_task_mage.txt | 13 - res/cardsfolder/jayemdae_tome.txt | 18 - res/cardsfolder/jedit_ojanen.txt | 9 - res/cardsfolder/jedit_ojanen_of_efrava.txt | 13 - res/cardsfolder/jedits_dragoons.txt | 12 - res/cardsfolder/jenara_asura_of_war.txt | 11 - .../jerrard_of_the_closed_fist.txt | 9 - res/cardsfolder/jeska_warrior_adept.txt | 12 - res/cardsfolder/jesters_cap.txt | 12 - res/cardsfolder/jet_medallion.txt | 10 - res/cardsfolder/jeweled_spirit.txt | 17 - res/cardsfolder/jhessian_infiltrator.txt | 10 - res/cardsfolder/jhessian_lookout.txt | 9 - res/cardsfolder/jhessian_zombies.txt | 12 - res/cardsfolder/jhoira_of_the_ghitu.txt | 10 - res/cardsfolder/jhoiras_toolbox.txt | 10 - res/cardsfolder/jhovall_queen.txt | 10 - res/cardsfolder/jhovall_rider.txt | 10 - res/cardsfolder/jin_gitaxias_core_augur.txt | 13 - res/cardsfolder/jiwari_the_earth_aflame.txt | 13 - res/cardsfolder/jodahs_avenger.txt | 13 - res/cardsfolder/join_the_ranks.txt | 10 - res/cardsfolder/joiner_adept.txt | 16 - res/cardsfolder/jokulhaups.txt | 12 - res/cardsfolder/jolraels_centaur.txt | 11 - res/cardsfolder/jolraels_favor.txt | 13 - res/cardsfolder/jolt.txt | 11 - res/cardsfolder/jolting_merfolk.txt | 12 - res/cardsfolder/jor_kadeen_the_prevailer.txt | 13 - res/cardsfolder/joraga_bard.txt | 15 - res/cardsfolder/joraga_treespeaker.txt | 16 - res/cardsfolder/joraga_warcaller.txt | 13 - res/cardsfolder/journey_to_nowhere.txt | 13 - res/cardsfolder/journeyers_kite.txt | 9 - res/cardsfolder/joven.txt | 10 - res/cardsfolder/jovens_tools.txt | 11 - res/cardsfolder/jovial_evil.txt | 11 - res/cardsfolder/joyous_respite.txt | 11 - res/cardsfolder/judge_of_currents.txt | 11 - res/cardsfolder/jugan_the_rising_star.txt | 16 - res/cardsfolder/juggernaut.txt | 17 - res/cardsfolder/juju_bubble.txt | 13 - res/cardsfolder/jukai_messenger.txt | 10 - res/cardsfolder/jump.txt | 14 - res/cardsfolder/jund_battlemage.txt | 11 - res/cardsfolder/jund_charm.txt | 12 - res/cardsfolder/jund_hackblade.txt | 12 - res/cardsfolder/jund_panorama.txt | 10 - res/cardsfolder/jund_sojourners.txt | 13 - res/cardsfolder/jungle_barrier.txt | 12 - res/cardsfolder/jungle_basin.txt | 11 - res/cardsfolder/jungle_lion.txt | 10 - res/cardsfolder/jungle_patrol.txt | 11 - res/cardsfolder/jungle_shrine.txt | 12 - res/cardsfolder/jungle_troll.txt | 11 - res/cardsfolder/jungle_weaver.txt | 11 - res/cardsfolder/jungle_wurm.txt | 12 - res/cardsfolder/juniper_order_advocate.txt | 12 - res/cardsfolder/juniper_order_druid.txt | 11 - res/cardsfolder/juniper_order_ranger.txt | 13 - res/cardsfolder/junk_diver.txt | 13 - res/cardsfolder/junktroller.txt | 11 - res/cardsfolder/juntu_stakes.txt | 10 - res/cardsfolder/junun_efreet.txt | 12 - res/cardsfolder/just_fate.txt | 10 - res/cardsfolder/juvenile_gloomwidow.txt | 11 - res/cardsfolder/juzam_djinn.txt | 11 - res/cardsfolder/jwar_isle_refuge.txt | 13 - res/cardsfolder/jwari_scuttler.txt | 9 - res/cardsfolder/jwari_shapeshifter.txt | 10 - res/cardsfolder/kabira_crossroads.txt | 12 - res/cardsfolder/kabira_vindicator.txt | 14 - res/cardsfolder/kabuto_moth.txt | 11 - res/cardsfolder/kaervek_the_merciless.txt | 12 - res/cardsfolder/kaerveks_hex.txt | 10 - res/cardsfolder/kaerveks_spite.txt | 10 - .../kaijin_of_the_vanishing_touch.txt | 13 - res/cardsfolder/kalastria_highborn.txt | 13 - res/cardsfolder/kaleidostone.txt | 12 - res/cardsfolder/kalonian_behemoth.txt | 10 - res/cardsfolder/kamahl_fist_of_krosa.txt | 12 - res/cardsfolder/kamahl_pit_fighter.txt | 12 - res/cardsfolder/kamahls_desire.txt | 11 - res/cardsfolder/kami_of_ancient_law.txt | 11 - res/cardsfolder/kami_of_empty_graves.txt | 10 - res/cardsfolder/kami_of_false_hope.txt | 10 - res/cardsfolder/kami_of_fires_roar.txt | 11 - res/cardsfolder/kami_of_lunacy.txt | 11 - res/cardsfolder/kami_of_old_stone.txt | 10 - res/cardsfolder/kami_of_tattered_shoji.txt | 12 - res/cardsfolder/kami_of_the_crescent_moon.txt | 11 - res/cardsfolder/kami_of_the_honored_dead.txt | 13 - res/cardsfolder/kami_of_the_hunt.txt | 12 - res/cardsfolder/kami_of_the_palace_fields.txt | 12 - res/cardsfolder/kami_of_the_tended_garden.txt | 11 - res/cardsfolder/kami_of_the_waning_moon.txt | 14 - .../kami_of_twisted_reflection.txt | 11 - res/cardsfolder/karakas.txt | 10 - res/cardsfolder/kargan_dragonlord.txt | 15 - res/cardsfolder/karma.txt | 15 - res/cardsfolder/karmic_guide.txt | 14 - res/cardsfolder/karn_silver_golem.txt | 15 - res/cardsfolder/karns_touch.txt | 11 - res/cardsfolder/karoo.txt | 11 - res/cardsfolder/karoo_meerkat.txt | 10 - res/cardsfolder/karplusan_forest.txt | 18 - res/cardsfolder/karplusan_giant.txt | 11 - res/cardsfolder/karplusan_strider.txt | 12 - res/cardsfolder/karplusan_wolverine.txt | 11 - res/cardsfolder/karplusan_yeti.txt | 14 - res/cardsfolder/karstoderm.txt | 12 - res/cardsfolder/kashi_tribe_elite.txt | 13 - res/cardsfolder/kashi_tribe_reaver.txt | 13 - res/cardsfolder/kashi_tribe_warriors.txt | 12 - res/cardsfolder/kasimir_the_lone_wolf.txt | 9 - res/cardsfolder/kataki_wars_wage.txt | 11 - res/cardsfolder/kathari_bomber.txt | 14 - res/cardsfolder/kathari_remnant.txt | 12 - res/cardsfolder/kathari_screecher.txt | 11 - res/cardsfolder/kavu_aggressor.txt | 12 - res/cardsfolder/kavu_climber.txt | 13 - res/cardsfolder/kavu_glider.txt | 11 - res/cardsfolder/kavu_howler.txt | 12 - res/cardsfolder/kavu_lair.txt | 11 - res/cardsfolder/kavu_mauler.txt | 13 - res/cardsfolder/kavu_monarch.txt | 14 - res/cardsfolder/kavu_predator.txt | 13 - res/cardsfolder/kavu_runner.txt | 11 - res/cardsfolder/kavu_scout.txt | 13 - res/cardsfolder/kavu_titan.txt | 9 - res/cardsfolder/kaysa.txt | 11 - res/cardsfolder/kazandu_blademaster.txt | 15 - res/cardsfolder/kazandu_refuge.txt | 13 - res/cardsfolder/kazandu_tuskcaller.txt | 16 - res/cardsfolder/kazuul_warlord.txt | 14 - res/cardsfolder/kederekt_leviathan.txt | 13 - res/cardsfolder/kederekt_parasite.txt | 11 - res/cardsfolder/keen_eyed_archers.txt | 10 - res/cardsfolder/keen_sense.txt | 12 - res/cardsfolder/keeneye_aven.txt | 11 - res/cardsfolder/keening_banshee.txt | 13 - res/cardsfolder/keening_stone.txt | 8 - res/cardsfolder/keep_watch.txt | 11 - res/cardsfolder/keeper_of_kookus.txt | 11 - res/cardsfolder/keeper_of_the_nine_gales.txt | 12 - res/cardsfolder/keeper_of_tresserhorn.txt | 12 - res/cardsfolder/keepers_of_the_faith.txt | 9 - res/cardsfolder/kei_takahashi.txt | 10 - res/cardsfolder/keiga_the_tide_star.txt | 12 - res/cardsfolder/keldon_arsonist.txt | 10 - res/cardsfolder/keldon_battlewagon.txt | 17 - res/cardsfolder/keldon_berserker.txt | 11 - res/cardsfolder/keldon_champion.txt | 13 - res/cardsfolder/keldon_halberdier.txt | 11 - res/cardsfolder/keldon_mantle.txt | 14 - res/cardsfolder/keldon_marauders.txt | 13 - res/cardsfolder/keldon_megaliths.txt | 11 - res/cardsfolder/keldon_necropolis.txt | 11 - res/cardsfolder/keldon_vandals.txt | 12 - res/cardsfolder/keldon_warlord.txt | 16 - res/cardsfolder/kelinore_bat.txt | 10 - res/cardsfolder/kelsinko_ranger.txt | 11 - res/cardsfolder/kemba_kha_regent.txt | 13 - res/cardsfolder/kembas_skyguard.txt | 12 - res/cardsfolder/kemuri_onna.txt | 13 - res/cardsfolder/kezzerdrix.txt | 12 - res/cardsfolder/khabal_ghoul.txt | 12 - res/cardsfolder/khalni_garden.txt | 12 - res/cardsfolder/khalni_gem.txt | 16 - res/cardsfolder/khalni_heart_expedition.txt | 11 - res/cardsfolder/khalni_hydra.txt | 10 - res/cardsfolder/kher_keep.txt | 10 - res/cardsfolder/kiki_jiki_mirror_breaker.txt | 11 - res/cardsfolder/kiku_nights_flower.txt | 12 - res/cardsfolder/kikus_shadow.txt | 11 - res/cardsfolder/killer_bees.txt | 13 - res/cardsfolder/killer_whale.txt | 10 - res/cardsfolder/kiln_fiend.txt | 12 - res/cardsfolder/kiln_walker.txt | 11 - res/cardsfolder/kindle.txt | 10 - res/cardsfolder/kindled_fury.txt | 10 - res/cardsfolder/king_cheetah.txt | 11 - res/cardsfolder/king_crab.txt | 11 - res/cardsfolder/king_suleiman.txt | 11 - res/cardsfolder/kingfisher.txt | 13 - res/cardsfolder/kings_assassin.txt | 10 - res/cardsfolder/kinsbaile_balloonist.txt | 12 - res/cardsfolder/kinsbaile_borderguard.txt | 10 - res/cardsfolder/kinsbaile_cavalier.txt | 11 - res/cardsfolder/kinsbaile_skirmisher.txt | 11 - res/cardsfolder/kird_ape.txt | 13 - res/cardsfolder/kiri_onna.txt | 14 - res/cardsfolder/kirtars_desire.txt | 11 - res/cardsfolder/kismet.txt | 11 - res/cardsfolder/kiss_of_death.txt | 10 - res/cardsfolder/kiss_of_the_amesha.txt | 10 - res/cardsfolder/kitchen_finks.txt | 12 - res/cardsfolder/kitesail.txt | 9 - res/cardsfolder/kitesail_apprentice.txt | 11 - res/cardsfolder/kithkin_daggerdare.txt | 10 - res/cardsfolder/kithkin_greatheart.txt | 11 - res/cardsfolder/kithkin_harbinger.txt | 12 - res/cardsfolder/kithkin_healer.txt | 10 - res/cardsfolder/kithkin_rabble.txt | 12 - res/cardsfolder/kithkin_shielddare.txt | 10 - res/cardsfolder/kithkin_spellduster.txt | 13 - res/cardsfolder/kithkin_zephyrnaut.txt | 10 - res/cardsfolder/kitsune_blademaster.txt | 11 - res/cardsfolder/kitsune_dawnblade.txt | 13 - res/cardsfolder/kitsune_diviner.txt | 11 - res/cardsfolder/kitsune_loreweaver.txt | 11 - res/cardsfolder/kitsune_riftwalker.txt | 10 - res/cardsfolder/kjeldoran_dead.txt | 15 - res/cardsfolder/kjeldoran_gargoyle.txt | 14 - res/cardsfolder/kjeldoran_home_guard.txt | 12 - res/cardsfolder/kjeldoran_javelineer.txt | 13 - res/cardsfolder/kjeldoran_outpost.txt | 11 - res/cardsfolder/kjeldoran_outrider.txt | 10 - res/cardsfolder/kjeldoran_war_cry.txt | 10 - res/cardsfolder/knight_captain_of_eos.txt | 12 - res/cardsfolder/knight_errant.txt | 11 - res/cardsfolder/knight_exemplar.txt | 12 - res/cardsfolder/knight_of_cliffhaven.txt | 14 - res/cardsfolder/knight_of_dawn.txt | 15 - res/cardsfolder/knight_of_dusk.txt | 11 - res/cardsfolder/knight_of_meadowgrain.txt | 11 - res/cardsfolder/knight_of_new_alara.txt | 14 - res/cardsfolder/knight_of_stromgald.txt | 13 - res/cardsfolder/knight_of_sursi.txt | 12 - res/cardsfolder/knight_of_the_reliquary.txt | 13 - res/cardsfolder/knight_of_the_skyward_eye.txt | 10 - .../knight_of_the_white_orchid.txt | 13 - res/cardsfolder/knight_of_valor.txt | 11 - res/cardsfolder/knighthood.txt | 11 - res/cardsfolder/knotvine_mystic.txt | 11 - res/cardsfolder/knotvine_paladin.txt | 12 - res/cardsfolder/knucklebone_witch.txt | 11 - res/cardsfolder/kobold_drill_sergeant.txt | 11 - res/cardsfolder/kobold_overlord.txt | 12 - res/cardsfolder/kobold_taskmaster.txt | 12 - res/cardsfolder/kobolds_of_kher_keep.txt | 10 - res/cardsfolder/kodama_of_the_center_tree.txt | 14 - res/cardsfolder/kodama_of_the_north_tree.txt | 11 - res/cardsfolder/kodama_of_the_south_tree.txt | 13 - res/cardsfolder/kodamas_reach.txt | 10 - res/cardsfolder/kokusho_the_evening_star.txt | 13 - res/cardsfolder/konda_lord_of_eiganjo.txt | 12 - res/cardsfolder/kondas_hatamoto.txt | 12 - res/cardsfolder/kongming_sleeping_dragon.txt | 11 - res/cardsfolder/kookus.txt | 15 - res/cardsfolder/kor_aeronaut.txt | 14 - res/cardsfolder/kor_cartographer.txt | 11 - res/cardsfolder/kor_duelist.txt | 11 - res/cardsfolder/kor_firewalker.txt | 12 - res/cardsfolder/kor_haven.txt | 11 - res/cardsfolder/kor_hookmaster.txt | 13 - res/cardsfolder/kor_line_slinger.txt | 10 - res/cardsfolder/kor_sanctifiers.txt | 12 - res/cardsfolder/kor_skyfisher.txt | 13 - res/cardsfolder/kor_spiritdancer.txt | 14 - .../korlash_heir_to_blackblade.txt | 13 - res/cardsfolder/kormus_bell.txt | 14 - res/cardsfolder/koskun_keep.txt | 13 - res/cardsfolder/koth_of_the_hammer.txt | 10 - res/cardsfolder/koths_courier.txt | 10 - res/cardsfolder/kozilek_butcher_of_truth.txt | 13 - res/cardsfolder/kozileks_predator.txt | 12 - res/cardsfolder/kraken_hatchling.txt | 9 - res/cardsfolder/krakens_eye.txt | 15 - res/cardsfolder/krakilin.txt | 12 - res/cardsfolder/kranioceros.txt | 10 - res/cardsfolder/krark_clan_engineers.txt | 11 - res/cardsfolder/krark_clan_grunt.txt | 10 - res/cardsfolder/krark_clan_ironworks.txt | 10 - res/cardsfolder/krark_clan_ogre.txt | 11 - res/cardsfolder/krark_clan_shaman.txt | 11 - res/cardsfolder/krark_clan_stoker.txt | 11 - res/cardsfolder/kresh_the_bloodbraided.txt | 12 - res/cardsfolder/kris_mage.txt | 11 - res/cardsfolder/krosan_archer.txt | 12 - res/cardsfolder/krosan_avenger.txt | 11 - res/cardsfolder/krosan_beast.txt | 10 - res/cardsfolder/krosan_cloudscraper.txt | 12 - res/cardsfolder/krosan_colossus.txt | 10 - res/cardsfolder/krosan_constrictor.txt | 11 - res/cardsfolder/krosan_grip.txt | 10 - res/cardsfolder/krosan_groundshaker.txt | 10 - res/cardsfolder/krosan_restorer.txt | 12 - res/cardsfolder/krosan_tusker.txt | 12 - res/cardsfolder/krosan_verge.txt | 12 - res/cardsfolder/krosan_warchief.txt | 11 - res/cardsfolder/krosan_wayfarer.txt | 11 - res/cardsfolder/krovikan_elementalist.txt | 12 - res/cardsfolder/krovikan_fetish.txt | 13 - res/cardsfolder/krovikan_horror.txt | 10 - res/cardsfolder/krovikan_mist.txt | 13 - res/cardsfolder/krovikan_rot.txt | 10 - res/cardsfolder/krovikan_scoundrel.txt | 9 - res/cardsfolder/kry_shield.txt | 12 - res/cardsfolder/kuldotha_flamefiend.txt | 15 - res/cardsfolder/kuldotha_forgemaster.txt | 11 - res/cardsfolder/kuldotha_phoenix.txt | 12 - res/cardsfolder/kuldotha_rebirth.txt | 10 - res/cardsfolder/kuldotha_ringleader.txt | 12 - res/cardsfolder/kulrath_knight.txt | 11 - res/cardsfolder/kurgadon.txt | 11 - res/cardsfolder/kuro_pitlord.txt | 12 - res/cardsfolder/kuros_taken.txt | 11 - res/cardsfolder/kyoki_sanitys_eclipse.txt | 13 - res/cardsfolder/kyren_glider.txt | 11 - res/cardsfolder/kyren_negotiations.txt | 9 - res/cardsfolder/kyren_sniper.txt | 11 - res/cardsfolder/lab_rats.txt | 10 - res/cardsfolder/labyrinth_minotaur.txt | 11 - res/cardsfolder/laccolith_grunt.txt | 13 - res/cardsfolder/laccolith_titan.txt | 13 - res/cardsfolder/laccolith_warrior.txt | 13 - res/cardsfolder/laccolith_whelp.txt | 13 - res/cardsfolder/lace_with_moonglove.txt | 10 - res/cardsfolder/lady_caleria.txt | 11 - res/cardsfolder/lady_evangela.txt | 11 - res/cardsfolder/lady_orca.txt | 9 - .../lady_zhurong_warrior_queen.txt | 10 - res/cardsfolder/lagac_lizard.txt | 9 - res/cardsfolder/lake_of_the_dead.txt | 11 - res/cardsfolder/lance.txt | 13 - res/cardsfolder/land_cap.txt | 14 - res/cardsfolder/land_equilibrium.txt | 8 - res/cardsfolder/land_leeches.txt | 11 - res/cardsfolder/land_tax.txt | 12 - res/cardsfolder/landbind_ritual.txt | 10 - res/cardsfolder/lantern_kami.txt | 10 - res/cardsfolder/lantern_lit_graveyard.txt | 12 - res/cardsfolder/lapis_lazuli_talisman.txt | 11 - res/cardsfolder/lapse_of_certainty.txt | 9 - res/cardsfolder/laquatuss_champion.txt | 14 - res/cardsfolder/larceny.txt | 11 - res/cardsfolder/lash_out.txt | 11 - res/cardsfolder/lashknife_barrier.txt | 11 - res/cardsfolder/lashwrithe.txt | 13 - res/cardsfolder/last_breath.txt | 11 - res/cardsfolder/last_caress.txt | 11 - res/cardsfolder/last_gasp.txt | 9 - res/cardsfolder/last_kiss.txt | 10 - res/cardsfolder/last_laugh.txt | 12 - res/cardsfolder/last_stand.txt | 20 - res/cardsfolder/last_word.txt | 10 - res/cardsfolder/latulla_keldon_overseer.txt | 12 - res/cardsfolder/latullas_orders.txt | 13 - res/cardsfolder/launch.txt | 13 - res/cardsfolder/lava_axe.txt | 18 - res/cardsfolder/lava_dart.txt | 10 - res/cardsfolder/lava_flow.txt | 9 - res/cardsfolder/lava_hounds.txt | 13 - res/cardsfolder/lava_runner.txt | 14 - res/cardsfolder/lava_spike.txt | 9 - res/cardsfolder/lava_storm.txt | 10 - res/cardsfolder/lava_tubes.txt | 14 - res/cardsfolder/lava_zombie.txt | 13 - res/cardsfolder/lavaborn_muse.txt | 13 - res/cardsfolder/lavaclaw_reaches.txt | 14 - res/cardsfolder/lavacore_elemental.txt | 13 - res/cardsfolder/lavafume_invoker.txt | 10 - res/cardsfolder/lavalanche.txt | 8 - res/cardsfolder/lavamancers_skill.txt | 14 - res/cardsfolder/lawbringer.txt | 11 - res/cardsfolder/lay_bare.txt | 10 - res/cardsfolder/lay_of_the_land.txt | 9 - res/cardsfolder/lay_waste.txt | 11 - res/cardsfolder/lead_astray.txt | 10 - res/cardsfolder/lead_belly_chimera.txt | 14 - res/cardsfolder/lead_golem.txt | 12 - res/cardsfolder/lead_the_stampede.txt | 9 - res/cardsfolder/leaden_fists.txt | 11 - res/cardsfolder/leaden_myr.txt | 11 - res/cardsfolder/leaf_arrow.txt | 10 - res/cardsfolder/leaf_crowned_elder.txt | 10 - res/cardsfolder/leaf_dancer.txt | 10 - res/cardsfolder/leaf_gilder.txt | 10 - res/cardsfolder/leafdrake_roost.txt | 11 - res/cardsfolder/leap.txt | 10 - res/cardsfolder/leap_of_flame.txt | 10 - res/cardsfolder/leaping_lizard.txt | 10 - res/cardsfolder/leatherback_baloth.txt | 9 - res/cardsfolder/leeches.txt | 9 - res/cardsfolder/leechridden_swamp.txt | 10 - res/cardsfolder/leering_emblem.txt | 11 - res/cardsfolder/legacy_weapon.txt | 12 - res/cardsfolder/legacys_allure.txt | 12 - res/cardsfolder/legions_of_lim_dul.txt | 11 - res/cardsfolder/leonin_abunas.txt | 9 - res/cardsfolder/leonin_armorguard.txt | 12 - res/cardsfolder/leonin_battlemage.txt | 13 - res/cardsfolder/leonin_den_guard.txt | 11 - res/cardsfolder/leonin_elder.txt | 11 - res/cardsfolder/leonin_relic_warder.txt | 14 - res/cardsfolder/leonin_scimitar.txt | 10 - res/cardsfolder/leonin_skyhunter.txt | 12 - res/cardsfolder/leonin_squire.txt | 11 - res/cardsfolder/leonin_sun_standard.txt | 10 - res/cardsfolder/leshracs_rite.txt | 13 - res/cardsfolder/leshracs_sigil.txt | 12 - res/cardsfolder/lesser_gargadon.txt | 12 - res/cardsfolder/lethargy_trap.txt | 11 - res/cardsfolder/leveler.txt | 12 - res/cardsfolder/levitation.txt | 13 - res/cardsfolder/ley_druid.txt | 17 - res/cardsfolder/leyline_of_anticipation.txt | 10 - res/cardsfolder/leyline_of_lifeforce.txt | 10 - res/cardsfolder/leyline_of_lightning.txt | 11 - res/cardsfolder/leyline_of_punishment.txt | 9 - res/cardsfolder/leyline_of_singularity.txt | 10 - res/cardsfolder/leyline_of_the_meek.txt | 11 - res/cardsfolder/leyline_of_the_void.txt | 10 - res/cardsfolder/leyline_of_vitality.txt | 13 - res/cardsfolder/lhurgoyf.txt | 12 - res/cardsfolder/liability.txt | 11 - res/cardsfolder/liberated_dwarf.txt | 11 - res/cardsfolder/library_of_alexandria.txt | 10 - res/cardsfolder/lich.txt | 12 - res/cardsfolder/lich_lord_of_unx.txt | 13 - res/cardsfolder/lichenthrope.txt | 11 - res/cardsfolder/liege_of_the_axe.txt | 13 - res/cardsfolder/liege_of_the_pit.txt | 13 - res/cardsfolder/liege_of_the_tangle.txt | 17 - res/cardsfolder/lieutenant_kirtar.txt | 12 - res/cardsfolder/life_and_limb.txt | 10 - res/cardsfolder/life_burst.txt | 11 - res/cardsfolder/life_chisel.txt | 11 - res/cardsfolder/life_from_the_loam.txt | 10 - res/cardsfolder/lifeblood.txt | 11 - res/cardsfolder/lifeforce.txt | 15 - res/cardsfolder/lifegift.txt | 10 - res/cardsfolder/lifelink.txt | 9 - res/cardsfolder/lifes_finale.txt | 10 - res/cardsfolder/lifesmith.txt | 11 - res/cardsfolder/lifespark_spellbomb.txt | 10 - res/cardsfolder/lifespinner.txt | 11 - res/cardsfolder/lifetap.txt | 16 - res/cardsfolder/light_of_day.txt | 11 - res/cardsfolder/light_of_sanction.txt | 10 - res/cardsfolder/lightbringer.txt | 11 - res/cardsfolder/lighthouse_chronologist.txt | 12 - res/cardsfolder/lightkeeper_of_emeria.txt | 14 - res/cardsfolder/lightmine_field.txt | 11 - res/cardsfolder/lightning_angel.txt | 13 - res/cardsfolder/lightning_blast.txt | 12 - res/cardsfolder/lightning_blow.txt | 10 - res/cardsfolder/lightning_bolt.txt | 15 - res/cardsfolder/lightning_cloud.txt | 10 - res/cardsfolder/lightning_crafter.txt | 10 - res/cardsfolder/lightning_dragon.txt | 12 - res/cardsfolder/lightning_elemental.txt | 15 - res/cardsfolder/lightning_greaves.txt | 9 - res/cardsfolder/lightning_helix.txt | 10 - res/cardsfolder/lightning_hounds.txt | 10 - res/cardsfolder/lightning_reaver.txt | 16 - res/cardsfolder/lightning_rift.txt | 11 - res/cardsfolder/lightning_serpent.txt | 14 - res/cardsfolder/lightning_surge.txt | 11 - res/cardsfolder/lightning_talons.txt | 10 - res/cardsfolder/lightwielder_paladin.txt | 12 - res/cardsfolder/lignify.txt | 11 - res/cardsfolder/liliana_vess.txt | 14 - res/cardsfolder/lilianas_caress.txt | 10 - res/cardsfolder/lilianas_specter.txt | 12 - res/cardsfolder/lilting_refrain.txt | 13 - res/cardsfolder/lim_dul_the_necromancer.txt | 13 - res/cardsfolder/lim_duls_cohort.txt | 13 - res/cardsfolder/lim_duls_high_guard.txt | 11 - res/cardsfolder/limestone_golem.txt | 11 - res/cardsfolder/lin_sivvi_defiant_hero.txt | 13 - res/cardsfolder/lingering_death.txt | 12 - res/cardsfolder/lingering_mirage.txt | 13 - res/cardsfolder/lingering_tormentor.txt | 11 - res/cardsfolder/linvala_keeper_of_silence.txt | 12 - res/cardsfolder/lionheart_maverick.txt | 11 - res/cardsfolder/liquify.txt | 9 - res/cardsfolder/liquimetal_coating.txt | 10 - res/cardsfolder/lithatog.txt | 12 - res/cardsfolder/liu_bei_lord_of_shu.txt | 11 - res/cardsfolder/living_airship.txt | 11 - res/cardsfolder/living_armor.txt | 10 - res/cardsfolder/living_artifact.txt | 19 - res/cardsfolder/living_death.txt | 8 - res/cardsfolder/living_hive.txt | 13 - res/cardsfolder/living_lands.txt | 16 - res/cardsfolder/living_plane.txt | 10 - res/cardsfolder/living_wall.txt | 14 - res/cardsfolder/livonya_silone.txt | 11 - res/cardsfolder/lizard_warrior.txt | 9 - res/cardsfolder/llanowar_augur.txt | 10 - res/cardsfolder/llanowar_behemoth.txt | 12 - res/cardsfolder/llanowar_cavalry.txt | 10 - res/cardsfolder/llanowar_dead.txt | 10 - res/cardsfolder/llanowar_druid.txt | 11 - res/cardsfolder/llanowar_elite.txt | 12 - res/cardsfolder/llanowar_elves.txt | 21 - res/cardsfolder/llanowar_empath.txt | 13 - res/cardsfolder/llanowar_knight.txt | 10 - res/cardsfolder/llanowar_mentor.txt | 11 - res/cardsfolder/llanowar_sentinel.txt | 12 - res/cardsfolder/llanowar_wastes.txt | 15 - res/cardsfolder/loam_dweller.txt | 11 - res/cardsfolder/loam_lion.txt | 10 - res/cardsfolder/loamdragger_giant.txt | 9 - res/cardsfolder/lobotomy.txt | 9 - res/cardsfolder/loch_korrigan.txt | 10 - res/cardsfolder/lockjaw_snapper.txt | 12 - res/cardsfolder/locust_miser.txt | 10 - res/cardsfolder/locust_swarm.txt | 12 - res/cardsfolder/lodestone_bauble.txt | 9 - res/cardsfolder/lodestone_golem.txt | 10 - res/cardsfolder/lodestone_myr.txt | 11 - res/cardsfolder/lone_missionary.txt | 11 - res/cardsfolder/lonely_sandbar.txt | 12 - res/cardsfolder/long_forgotten_gohei.txt | 12 - res/cardsfolder/long_term_plans.txt | 10 - res/cardsfolder/longbow_archer.txt | 13 - res/cardsfolder/looming_hoverguard.txt | 12 - res/cardsfolder/looming_shade.txt | 15 - res/cardsfolder/looter_il_kor.txt | 13 - res/cardsfolder/lord_magnus.txt | 11 - res/cardsfolder/lord_of_atlantis.txt | 20 - res/cardsfolder/lord_of_extinction.txt | 10 - res/cardsfolder/lord_of_shatterskull_pass.txt | 14 - res/cardsfolder/lord_of_the_pit.txt | 18 - res/cardsfolder/lord_of_the_undead.txt | 16 - res/cardsfolder/lord_of_tresserhorn.txt | 15 - res/cardsfolder/lore_broker.txt | 11 - res/cardsfolder/lorescale_coatl.txt | 11 - res/cardsfolder/lorthos_the_tidemaker.txt | 12 - res/cardsfolder/lose_hope.txt | 10 - res/cardsfolder/lost_auramancers.txt | 10 - res/cardsfolder/lost_hours.txt | 9 - res/cardsfolder/lost_leonin.txt | 10 - res/cardsfolder/lost_soul.txt | 13 - res/cardsfolder/lotus_bloom.txt | 15 - res/cardsfolder/lotus_blossom.txt | 17 - res/cardsfolder/lotus_cobra.txt | 11 - res/cardsfolder/lotus_guardian.txt | 15 - res/cardsfolder/lotus_petal.txt | 14 - res/cardsfolder/lotus_vale.txt | 14 - res/cardsfolder/lovisa_coldeyes.txt | 11 - res/cardsfolder/lowland_giant.txt | 9 - res/cardsfolder/loxodon_anchorite.txt | 10 - res/cardsfolder/loxodon_convert.txt | 9 - res/cardsfolder/loxodon_gatekeeper.txt | 9 - res/cardsfolder/loxodon_hierarch.txt | 12 - res/cardsfolder/loxodon_mender.txt | 10 - res/cardsfolder/loxodon_mystic.txt | 11 - res/cardsfolder/loxodon_partisan.txt | 11 - res/cardsfolder/loxodon_punisher.txt | 12 - res/cardsfolder/loxodon_stalwart.txt | 11 - res/cardsfolder/loxodon_warhammer.txt | 11 - res/cardsfolder/loxodon_wayfarer.txt | 9 - res/cardsfolder/loyal_retainers.txt | 10 - res/cardsfolder/loyal_sentry.txt | 13 - res/cardsfolder/lu_bu_master_at_arms.txt | 11 - res/cardsfolder/lu_meng_wu_general.txt | 10 - res/cardsfolder/lu_su_wu_advisor.txt | 10 - res/cardsfolder/lu_xun_scholar_general.txt | 12 - res/cardsfolder/lucent_liminid.txt | 10 - res/cardsfolder/lull.txt | 16 - res/cardsfolder/lumbering_satyr.txt | 10 - res/cardsfolder/lumengrid_drake.txt | 12 - res/cardsfolder/lumengrid_gargoyle.txt | 10 - res/cardsfolder/lumengrid_warden.txt | 11 - res/cardsfolder/luminous_angel.txt | 12 - res/cardsfolder/luminous_wake.txt | 12 - res/cardsfolder/lunar_avenger.txt | 14 - res/cardsfolder/lunge.txt | 10 - res/cardsfolder/lunk_errant.txt | 11 - res/cardsfolder/lure.txt | 23 - res/cardsfolder/lurking_informant.txt | 10 - res/cardsfolder/lurking_nightstalker.txt | 11 - res/cardsfolder/lurking_predators.txt | 8 - res/cardsfolder/lurking_skirge.txt | 10 - res/cardsfolder/lush_growth.txt | 11 - res/cardsfolder/lust_for_war.txt | 11 - res/cardsfolder/lux_cannon.txt | 10 - res/cardsfolder/lymph_sliver.txt | 10 - res/cardsfolder/lynx.txt | 11 - res/cardsfolder/lys_alana_bowmaster.txt | 13 - res/cardsfolder/lys_alana_huntmaster.txt | 11 - res/cardsfolder/lyzolda_the_blood_witch.txt | 14 - res/cardsfolder/ma_chao_western_warrior.txt | 12 - res/cardsfolder/macabre_waltz.txt | 11 - res/cardsfolder/macetail_hystrodon.txt | 12 - res/cardsfolder/machinate.txt | 11 - res/cardsfolder/mad_auntie.txt | 12 - res/cardsfolder/maddening_wind.txt | 12 - res/cardsfolder/madrush_cyclops.txt | 12 - res/cardsfolder/maelstrom_nexus.txt | 8 - res/cardsfolder/maelstrom_pulse.txt | 8 - res/cardsfolder/maga_traitor_to_mortals.txt | 15 - res/cardsfolder/mage_il_vec.txt | 11 - res/cardsfolder/mage_slayer.txt | 12 - res/cardsfolder/magefire_wings.txt | 10 - res/cardsfolder/mages_guile.txt | 11 - res/cardsfolder/mageta_the_lion.txt | 11 - res/cardsfolder/magetas_boon.txt | 11 - res/cardsfolder/maggot_carrier.txt | 12 - res/cardsfolder/maggot_therapy.txt | 11 - res/cardsfolder/magister_sphinx.txt | 12 - res/cardsfolder/magistrates_scepter.txt | 10 - res/cardsfolder/magistrates_veto.txt | 10 - res/cardsfolder/magma_giant.txt | 13 - res/cardsfolder/magma_jet.txt | 10 - res/cardsfolder/magma_mine.txt | 12 - res/cardsfolder/magma_phoenix.txt | 15 - res/cardsfolder/magma_rift.txt | 9 - res/cardsfolder/magma_sliver.txt | 14 - res/cardsfolder/magma_spray.txt | 10 - res/cardsfolder/magma_vein.txt | 10 - res/cardsfolder/magmaw.txt | 11 - res/cardsfolder/magnetic_flux.txt | 10 - res/cardsfolder/magnetic_mine.txt | 11 - res/cardsfolder/magnify.txt | 10 - res/cardsfolder/magnigoth_treefolk.txt | 16 - res/cardsfolder/magnivore.txt | 13 - res/cardsfolder/magosi_the_waterveil.txt | 15 - res/cardsfolder/magus_of_the_abyss.txt | 10 - res/cardsfolder/magus_of_the_bazaar.txt | 12 - res/cardsfolder/magus_of_the_candelabra.txt | 14 - res/cardsfolder/magus_of_the_coffers.txt | 12 - res/cardsfolder/magus_of_the_disk.txt | 11 - res/cardsfolder/magus_of_the_library.txt | 12 - res/cardsfolder/magus_of_the_moat.txt | 11 - res/cardsfolder/magus_of_the_moon.txt | 11 - res/cardsfolder/magus_of_the_tabernacle.txt | 11 - res/cardsfolder/magus_of_the_unseen.txt | 12 - res/cardsfolder/magus_of_the_vineyard.txt | 11 - res/cardsfolder/mahamoti_djinn.txt | 18 - res/cardsfolder/major_teroh.txt | 12 - res/cardsfolder/makindi_griffin.txt | 10 - res/cardsfolder/makindi_shieldmate.txt | 15 - res/cardsfolder/malach_of_the_dawn.txt | 11 - res/cardsfolder/malachite_golem.txt | 10 - res/cardsfolder/malachite_talisman.txt | 11 - res/cardsfolder/malakir_bloodwitch.txt | 16 - res/cardsfolder/malevolent_awakening.txt | 10 - res/cardsfolder/malicious_advice.txt | 14 - res/cardsfolder/malignant_growth.txt | 16 - res/cardsfolder/mammoth_umbra.txt | 11 - res/cardsfolder/man_o_war.txt | 13 - res/cardsfolder/mana_breach.txt | 14 - res/cardsfolder/mana_crypt.txt | 10 - res/cardsfolder/mana_cylix.txt | 15 - res/cardsfolder/mana_drain.txt | 12 - res/cardsfolder/mana_geyser.txt | 11 - res/cardsfolder/mana_leak.txt | 12 - res/cardsfolder/mana_matrix.txt | 10 - res/cardsfolder/mana_prism.txt | 16 - res/cardsfolder/mana_severance.txt | 11 - res/cardsfolder/mana_short.txt | 15 - res/cardsfolder/mana_tithe.txt | 9 - res/cardsfolder/mana_vault.txt | 20 - res/cardsfolder/mana_vortex.txt | 10 - res/cardsfolder/manabarbs.txt | 19 - res/cardsfolder/manabond.txt | 13 - res/cardsfolder/manacles_of_decay.txt | 12 - res/cardsfolder/manaforce_mace.txt | 13 - res/cardsfolder/manakin.txt | 10 - res/cardsfolder/manaplasm.txt | 13 - res/cardsfolder/mangara_of_corondor.txt | 12 - res/cardsfolder/maniacal_rage.txt | 12 - res/cardsfolder/manic_vandal.txt | 11 - res/cardsfolder/manipulate_fate.txt | 11 - .../mannichi_the_fevered_dream.txt | 11 - res/cardsfolder/manta_ray.txt | 13 - res/cardsfolder/manta_riders.txt | 10 - res/cardsfolder/mantis_engine.txt | 12 - res/cardsfolder/mantle_of_leadership.txt | 14 - res/cardsfolder/marauding_knight.txt | 13 - res/cardsfolder/maraxus_of_keld.txt | 11 - res/cardsfolder/marble_chalice.txt | 9 - res/cardsfolder/marble_diamond.txt | 12 - res/cardsfolder/marble_titan.txt | 12 - res/cardsfolder/march_of_souls.txt | 15 - res/cardsfolder/march_of_the_machines.txt | 11 - res/cardsfolder/marhault_elsdragon.txt | 10 - res/cardsfolder/marisis_twinclaws.txt | 10 - res/cardsfolder/maritime_guard.txt | 9 - res/cardsfolder/marjhan.txt | 17 - res/cardsfolder/mark_of_asylum.txt | 8 - res/cardsfolder/mark_of_fury.txt | 13 - res/cardsfolder/mark_of_mutiny.txt | 10 - res/cardsfolder/mark_of_the_oni.txt | 14 - res/cardsfolder/marker_beetles.txt | 13 - res/cardsfolder/maro.txt | 15 - res/cardsfolder/marrow_gnawer.txt | 13 - res/cardsfolder/marrow_shards.txt | 9 - res/cardsfolder/marsh_boa.txt | 10 - res/cardsfolder/marsh_crocodile.txt | 14 - res/cardsfolder/marsh_flats.txt | 9 - res/cardsfolder/marsh_gas.txt | 10 - res/cardsfolder/marsh_goblins.txt | 10 - res/cardsfolder/marsh_lurker.txt | 11 - res/cardsfolder/marsh_threader.txt | 10 - res/cardsfolder/marsh_viper.txt | 13 - res/cardsfolder/marshaling_cry.txt | 11 - res/cardsfolder/marshals_anthem.txt | 14 - res/cardsfolder/marshdrinker_giant.txt | 11 - res/cardsfolder/martial_coup.txt | 8 - res/cardsfolder/marton_stromgald.txt | 15 - res/cardsfolder/martyred_rusalka.txt | 11 - res/cardsfolder/martyrs_tomb.txt | 10 - res/cardsfolder/masako_the_humorless.txt | 10 - res/cardsfolder/mask_of_intolerance.txt | 14 - res/cardsfolder/mask_of_law_and_grace.txt | 10 - res/cardsfolder/mask_of_memory.txt | 12 - res/cardsfolder/mask_of_riddles.txt | 11 - res/cardsfolder/masked_admirers.txt | 13 - res/cardsfolder/masked_gorgon.txt | 11 - res/cardsfolder/mass_calcify.txt | 9 - res/cardsfolder/mass_hysteria.txt | 12 - res/cardsfolder/mass_of_ghouls.txt | 10 - res/cardsfolder/massacre_wurm.txt | 13 - res/cardsfolder/master_decoy.txt | 12 - res/cardsfolder/master_healer.txt | 13 - res/cardsfolder/master_of_etherium.txt | 14 - res/cardsfolder/master_of_the_wild_hunt.txt | 11 - res/cardsfolder/master_splicer.txt | 12 - res/cardsfolder/master_transmuter.txt | 11 - res/cardsfolder/masters_call.txt | 9 - res/cardsfolder/masticore.txt | 12 - res/cardsfolder/masumaro_first_to_live.txt | 11 - res/cardsfolder/matca_rioters.txt | 12 - res/cardsfolder/matsu_tribe_birdstalker.txt | 14 - res/cardsfolder/matsu_tribe_sniper.txt | 13 - res/cardsfolder/maul_splicer.txt | 12 - res/cardsfolder/mawcor.txt | 12 - res/cardsfolder/mayael_the_anima.txt | 11 - res/cardsfolder/mayaels_aria.txt | 12 - res/cardsfolder/maze_of_ith.txt | 11 - res/cardsfolder/maze_of_shadows.txt | 12 - res/cardsfolder/meadowboon.txt | 14 - res/cardsfolder/meddling_mage.txt | 11 - res/cardsfolder/medicine_bag.txt | 10 - res/cardsfolder/meditate.txt | 10 - res/cardsfolder/meekstone.txt | 17 - res/cardsfolder/megatog.txt | 10 - res/cardsfolder/meglonoth.txt | 14 - res/cardsfolder/megrim.txt | 15 - res/cardsfolder/meishin_the_mind_cage.txt | 11 - res/cardsfolder/melancholy.txt | 11 - res/cardsfolder/melesse_spirit.txt | 11 - res/cardsfolder/meliras_keepers.txt | 10 - res/cardsfolder/meloku_the_clouded_mirror.txt | 12 - res/cardsfolder/melt_terrain.txt | 10 - res/cardsfolder/meltdown.txt | 11 - res/cardsfolder/memnarch.txt | 11 - res/cardsfolder/memnite.txt | 9 - res/cardsfolder/memory_erosion.txt | 10 - res/cardsfolder/memory_lapse.txt | 13 - res/cardsfolder/mending_hands.txt | 10 - res/cardsfolder/meng_huo_barbarian_king.txt | 11 - res/cardsfolder/meng_huos_horde.txt | 9 - res/cardsfolder/mental_discipline.txt | 10 - res/cardsfolder/mental_misstep.txt | 9 - res/cardsfolder/mental_note.txt | 11 - res/cardsfolder/mephidross_vampire.txt | 14 - res/cardsfolder/mephitic_ooze.txt | 14 - res/cardsfolder/mercenary_informer.txt | 11 - res/cardsfolder/merchant_of_secrets.txt | 12 - res/cardsfolder/merchant_scroll.txt | 11 - res/cardsfolder/merchant_ship.txt | 14 - res/cardsfolder/mercurial_kite.txt | 13 - res/cardsfolder/merfolk_assassin.txt | 11 - res/cardsfolder/merfolk_looter.txt | 13 - res/cardsfolder/merfolk_observer.txt | 12 - .../merfolk_of_the_pearl_trident.txt | 17 - res/cardsfolder/merfolk_seastalkers.txt | 11 - res/cardsfolder/merfolk_seer.txt | 11 - res/cardsfolder/merfolk_skyscout.txt | 13 - res/cardsfolder/merfolk_sovereign.txt | 13 - res/cardsfolder/merfolk_thaumaturgist.txt | 11 - res/cardsfolder/merfolk_traders.txt | 12 - res/cardsfolder/merieke_ri_berit.txt | 12 - res/cardsfolder/merrow_commerce.txt | 11 - res/cardsfolder/merrow_grimeblotter.txt | 11 - res/cardsfolder/merrow_harbinger.txt | 13 - res/cardsfolder/merrow_levitator.txt | 12 - res/cardsfolder/merrow_reejerey.txt | 13 - res/cardsfolder/merrow_wavebreakers.txt | 11 - res/cardsfolder/merrow_witsniper.txt | 11 - res/cardsfolder/mesa_enchantress.txt | 13 - res/cardsfolder/mesa_falcon.txt | 13 - res/cardsfolder/mesmeric_orb.txt | 11 - res/cardsfolder/mesmeric_trance.txt | 11 - res/cardsfolder/messenger_falcons.txt | 12 - res/cardsfolder/metal_fatigue.txt | 10 - res/cardsfolder/metallic_mastery.txt | 10 - res/cardsfolder/metallic_sliver.txt | 10 - res/cardsfolder/metallurgeon.txt | 10 - res/cardsfolder/metalworker.txt | 10 - res/cardsfolder/metamorphic_wurm.txt | 10 - res/cardsfolder/metathran_elite.txt | 11 - res/cardsfolder/metathran_soldier.txt | 10 - res/cardsfolder/metathran_transport.txt | 13 - res/cardsfolder/metathran_zombie.txt | 10 - res/cardsfolder/meteor_crater.txt | 10 - res/cardsfolder/meteor_storm.txt | 10 - res/cardsfolder/midnight_banshee.txt | 13 - res/cardsfolder/midnight_covenant.txt | 12 - res/cardsfolder/midsummer_revel.txt | 13 - res/cardsfolder/might_of_alara.txt | 11 - res/cardsfolder/might_of_oaks.txt | 14 - res/cardsfolder/might_of_the_masses.txt | 10 - res/cardsfolder/might_sliver.txt | 11 - res/cardsfolder/might_weaver.txt | 12 - res/cardsfolder/mightstone.txt | 11 - res/cardsfolder/mighty_emergence.txt | 11 - res/cardsfolder/mighty_leap.txt | 9 - res/cardsfolder/mijae_djinn.txt | 10 - .../mikokoro_center_of_the_sea.txt | 11 - res/cardsfolder/militant_monk.txt | 11 - res/cardsfolder/millikin.txt | 12 - res/cardsfolder/millstone.txt | 17 - .../minamo_school_at_waters_edge.txt | 11 - res/cardsfolder/minamo_scrollkeeper.txt | 11 - res/cardsfolder/minamo_sightbender.txt | 12 - res/cardsfolder/mind_burst.txt | 10 - res/cardsfolder/mind_control.txt | 11 - res/cardsfolder/mind_funeral.txt | 8 - res/cardsfolder/mind_games.txt | 11 - res/cardsfolder/mind_harness.txt | 11 - res/cardsfolder/mind_knives.txt | 9 - res/cardsfolder/mind_over_matter.txt | 11 - res/cardsfolder/mind_peel.txt | 10 - res/cardsfolder/mind_ravel.txt | 11 - res/cardsfolder/mind_rot.txt | 17 - res/cardsfolder/mind_shatter.txt | 12 - res/cardsfolder/mind_slash.txt | 11 - res/cardsfolder/mind_sludge.txt | 12 - res/cardsfolder/mind_spring.txt | 12 - res/cardsfolder/mind_stone.txt | 11 - res/cardsfolder/mind_swords.txt | 12 - res/cardsfolder/mind_twist.txt | 15 - res/cardsfolder/mind_warp.txt | 13 - res/cardsfolder/mindcrank.txt | 12 - res/cardsfolder/mindculling.txt | 10 - res/cardsfolder/mindlash_sliver.txt | 11 - res/cardsfolder/mindless_automaton.txt | 13 - res/cardsfolder/minds_desire.txt | 12 - res/cardsfolder/minds_eye.txt | 10 - res/cardsfolder/mindslicer.txt | 13 - res/cardsfolder/mindstab.txt | 10 - res/cardsfolder/mindstab_thrull.txt | 13 - res/cardsfolder/mindwarper.txt | 11 - res/cardsfolder/mindwhip_sliver.txt | 11 - res/cardsfolder/mindwrack_liege.txt | 13 - res/cardsfolder/mine_bearer.txt | 11 - res/cardsfolder/minion_of_tevesh_szat.txt | 11 - res/cardsfolder/minions_murmurs.txt | 12 - res/cardsfolder/minister_of_impediments.txt | 10 - res/cardsfolder/minotaur_explorer.txt | 9 - res/cardsfolder/minotaur_illusionist.txt | 12 - res/cardsfolder/minotaur_tactician.txt | 14 - res/cardsfolder/minotaur_warrior.txt | 9 - res/cardsfolder/miraculous_recovery.txt | 10 - res/cardsfolder/mirari.txt | 11 - res/cardsfolder/miraris_wake.txt | 11 - res/cardsfolder/mire_blight.txt | 10 - res/cardsfolder/mire_boa.txt | 11 - res/cardsfolder/mire_kavu.txt | 11 - res/cardsfolder/mire_shade.txt | 11 - res/cardsfolder/miren_the_moaning_well.txt | 11 - res/cardsfolder/mirozel.txt | 12 - res/cardsfolder/mirran_crusader.txt | 12 - res/cardsfolder/mirran_mettle.txt | 10 - res/cardsfolder/mirran_spy.txt | 12 - res/cardsfolder/mirri_cat_warrior.txt | 13 - res/cardsfolder/mirri_the_cursed.txt | 14 - res/cardsfolder/mirris_guile.txt | 11 - res/cardsfolder/mirrodins_core.txt | 15 - res/cardsfolder/mirror_entity.txt | 12 - res/cardsfolder/mirror_gallery.txt | 9 - res/cardsfolder/mirror_sigil_sergeant.txt | 11 - res/cardsfolder/mirror_universe.txt | 8 - res/cardsfolder/mirror_wall.txt | 11 - res/cardsfolder/mirrorworks.txt | 11 - res/cardsfolder/miscalculation.txt | 11 - res/cardsfolder/mischievous_poltergeist.txt | 12 - res/cardsfolder/misers_cage.txt | 10 - res/cardsfolder/misery_charm.txt | 13 - res/cardsfolder/misfortunes_gain.txt | 10 - res/cardsfolder/misguided_rage.txt | 9 - res/cardsfolder/mishra_artificer_prodigy.txt | 11 - res/cardsfolder/mishras_factory.txt | 12 - res/cardsfolder/mishras_groundbreaker.txt | 10 - res/cardsfolder/mishras_helix.txt | 13 - res/cardsfolder/misinformation.txt | 10 - res/cardsfolder/misshapen_fiend.txt | 10 - res/cardsfolder/mist_leopard.txt | 10 - res/cardsfolder/mistbind_clique.txt | 13 - res/cardsfolder/mistblade_shinobi.txt | 13 - res/cardsfolder/mistfolk.txt | 10 - res/cardsfolder/mistform_dreamer.txt | 13 - res/cardsfolder/mistform_mutant.txt | 12 - res/cardsfolder/mistform_shrieker.txt | 14 - res/cardsfolder/mistform_skyreaver.txt | 13 - res/cardsfolder/mistform_stalker.txt | 14 - res/cardsfolder/mistform_ultimus.txt | 11 - res/cardsfolder/mistmeadow_skulk.txt | 12 - res/cardsfolder/mistral_charger.txt | 10 - res/cardsfolder/mistveil_plains.txt | 10 - res/cardsfolder/mistvein_borderpost.txt | 12 - res/cardsfolder/misty_rainforest.txt | 9 - res/cardsfolder/mitotic_manipulation.txt | 10 - res/cardsfolder/mitotic_slime.txt | 13 - res/cardsfolder/mnemonic_nexus.txt | 10 - res/cardsfolder/mnemonic_sliver.txt | 11 - res/cardsfolder/mnemonic_wall.txt | 12 - res/cardsfolder/moaning_spirit.txt | 10 - res/cardsfolder/moat.txt | 10 - res/cardsfolder/mob_justice.txt | 10 - res/cardsfolder/mobile_fort.txt | 11 - res/cardsfolder/mobilization.txt | 11 - res/cardsfolder/mobilize.txt | 9 - res/cardsfolder/mogg_alarm.txt | 10 - res/cardsfolder/mogg_fanatic.txt | 11 - res/cardsfolder/mogg_hollows.txt | 12 - res/cardsfolder/mogg_jailer.txt | 10 - res/cardsfolder/mogg_maniac.txt | 12 - res/cardsfolder/mogg_raider.txt | 11 - res/cardsfolder/mogg_sentry.txt | 13 - res/cardsfolder/mogg_squad.txt | 13 - res/cardsfolder/mogg_war_marshal.txt | 13 - res/cardsfolder/moggcatcher.txt | 11 - res/cardsfolder/mold_adder.txt | 11 - res/cardsfolder/mold_shambler.txt | 12 - res/cardsfolder/molder_beast.txt | 12 - res/cardsfolder/molder_slug.txt | 12 - res/cardsfolder/moldervine_cloak.txt | 11 - res/cardsfolder/molimo_maro_sorcerer.txt | 12 - res/cardsfolder/molten_frame.txt | 10 - res/cardsfolder/molten_hydra.txt | 10 - res/cardsfolder/molten_psyche.txt | 8 - res/cardsfolder/molten_rain.txt | 10 - res/cardsfolder/molten_ravager.txt | 10 - res/cardsfolder/molten_slagheap.txt | 11 - res/cardsfolder/moltensteel_dragon.txt | 11 - res/cardsfolder/molting_harpy.txt | 11 - res/cardsfolder/molting_skin.txt | 9 - res/cardsfolder/momentary_blink.txt | 12 - res/cardsfolder/momentous_fall.txt | 13 - res/cardsfolder/moments_peace.txt | 10 - res/cardsfolder/momentum.txt | 13 - res/cardsfolder/momir_vig_simic_visionary.txt | 13 - res/cardsfolder/mongrel_pack.txt | 11 - res/cardsfolder/monk_idealist.txt | 11 - res/cardsfolder/monk_realist.txt | 11 - res/cardsfolder/monss_goblin_raiders.txt | 14 - res/cardsfolder/monstrify.txt | 10 - res/cardsfolder/monstrous_carabid.txt | 11 - res/cardsfolder/monstrous_growth.txt | 13 - res/cardsfolder/monstrous_hound.txt | 10 - res/cardsfolder/moon_sprite.txt | 11 - res/cardsfolder/moonglove_changeling.txt | 11 - res/cardsfolder/moonglove_extract.txt | 9 - res/cardsfolder/moonglove_winnower.txt | 10 - res/cardsfolder/moonlit_strider.txt | 16 - res/cardsfolder/moonlit_wake.txt | 10 - res/cardsfolder/moonwing_moth.txt | 11 - res/cardsfolder/moor_fiend.txt | 10 - res/cardsfolder/moorish_cavalry.txt | 11 - res/cardsfolder/morale.txt | 11 - res/cardsfolder/morbid_bloom.txt | 11 - res/cardsfolder/morbid_hunger.txt | 11 - res/cardsfolder/morbid_plunder.txt | 9 - res/cardsfolder/mordant_dragon.txt | 14 - res/cardsfolder/morgue_theft.txt | 10 - res/cardsfolder/morgue_thrull.txt | 11 - res/cardsfolder/morgue_toad.txt | 11 - res/cardsfolder/moriok_reaver.txt | 9 - res/cardsfolder/moriok_replica.txt | 12 - res/cardsfolder/moriok_rigger.txt | 11 - res/cardsfolder/moriok_scavenger.txt | 11 - res/cardsfolder/morningtide.txt | 10 - res/cardsfolder/moroii.txt | 12 - res/cardsfolder/morphling.txt | 14 - res/cardsfolder/morsel_theft.txt | 10 - res/cardsfolder/morselhoarder.txt | 15 - res/cardsfolder/mortal_combat.txt | 9 - res/cardsfolder/mortal_wound.txt | 10 - res/cardsfolder/mortarpod.txt | 12 - res/cardsfolder/mortician_beetle.txt | 11 - res/cardsfolder/mortify.txt | 9 - res/cardsfolder/mortipede.txt | 11 - res/cardsfolder/mortiphobia.txt | 11 - res/cardsfolder/mortis_dogs.txt | 14 - res/cardsfolder/mortivore.txt | 14 - res/cardsfolder/mortuary.txt | 11 - res/cardsfolder/mosquito_guard.txt | 12 - res/cardsfolder/moss_diamond.txt | 12 - res/cardsfolder/moss_kami.txt | 10 - res/cardsfolder/moss_monster.txt | 10 - res/cardsfolder/mossdog.txt | 11 - res/cardsfolder/mossfire_egg.txt | 11 - res/cardsfolder/mossfire_valley.txt | 10 - res/cardsfolder/mosstodon.txt | 10 - res/cardsfolder/mother_of_runes.txt | 15 - res/cardsfolder/mothrider_samurai.txt | 11 - res/cardsfolder/mountain.txt | 45 - res/cardsfolder/mountain_bandit.txt | 10 - res/cardsfolder/mountain_goat.txt | 13 - res/cardsfolder/mountain_valley.txt | 10 - res/cardsfolder/mountain_yeti.txt | 11 - res/cardsfolder/mournful_zombie.txt | 10 - res/cardsfolder/mourning.txt | 12 - res/cardsfolder/mourning_thrull.txt | 13 - res/cardsfolder/mournwhelk.txt | 14 - res/cardsfolder/mouth_of_ronom.txt | 12 - res/cardsfolder/mox_diamond.txt | 14 - res/cardsfolder/mox_emerald.txt | 12 - res/cardsfolder/mox_jet.txt | 12 - res/cardsfolder/mox_opal.txt | 14 - res/cardsfolder/mox_pearl.txt | 12 - res/cardsfolder/mox_ruby.txt | 12 - res/cardsfolder/mox_sapphire.txt | 12 - res/cardsfolder/mtenda_griffin.txt | 13 - res/cardsfolder/mtenda_herder.txt | 10 - res/cardsfolder/muck_rats.txt | 11 - res/cardsfolder/mudbrawler_cohort.txt | 12 - res/cardsfolder/mudbrawler_raiders.txt | 10 - res/cardsfolder/mudbutton_clanger.txt | 10 - res/cardsfolder/mudbutton_torchrunner.txt | 11 - res/cardsfolder/muddle_the_mixture.txt | 10 - res/cardsfolder/mul_daya_channelers.txt | 11 - res/cardsfolder/mulch.txt | 9 - res/cardsfolder/mulldrifter.txt | 15 - res/cardsfolder/multani_maro_sorcerer.txt | 11 - res/cardsfolder/multanis_acolyte.txt | 12 - res/cardsfolder/multanis_decree.txt | 10 - res/cardsfolder/mungha_wurm.txt | 9 - res/cardsfolder/muraganda_petroglyphs.txt | 8 - res/cardsfolder/murasa_pyromancer.txt | 16 - res/cardsfolder/murderous_redcap.txt | 14 - res/cardsfolder/murk_dwellers.txt | 13 - res/cardsfolder/murkfiend_liege.txt | 13 - res/cardsfolder/murmuring_bosk.txt | 12 - res/cardsfolder/muscle_burst.txt | 11 - res/cardsfolder/muscle_sliver.txt | 11 - res/cardsfolder/mutagenic_growth.txt | 9 - res/cardsfolder/mutavault.txt | 10 - res/cardsfolder/mutilate.txt | 11 - res/cardsfolder/muzzle.txt | 10 - res/cardsfolder/mwonvuli_acid_moss.txt | 10 - res/cardsfolder/mwonvuli_ooze.txt | 12 - res/cardsfolder/mycoid_shepherd.txt | 12 - res/cardsfolder/mycologist.txt | 13 - res/cardsfolder/mycoloth.txt | 13 - res/cardsfolder/mycosynth_fiend.txt | 12 - res/cardsfolder/mycosynth_golem.txt | 11 - res/cardsfolder/mycosynth_wellspring.txt | 12 - res/cardsfolder/myr_adapter.txt | 12 - res/cardsfolder/myr_enforcer.txt | 10 - res/cardsfolder/myr_galvanizer.txt | 12 - res/cardsfolder/myr_landshaper.txt | 11 - res/cardsfolder/myr_matrix.txt | 11 - res/cardsfolder/myr_moonvessel.txt | 11 - res/cardsfolder/myr_propagator.txt | 10 - res/cardsfolder/myr_quadropod.txt | 11 - res/cardsfolder/myr_retriever.txt | 12 - res/cardsfolder/myr_sire.txt | 12 - res/cardsfolder/myr_turbine.txt | 10 - res/cardsfolder/myrsmith.txt | 11 - res/cardsfolder/mystic_crusader.txt | 12 - res/cardsfolder/mystic_denial.txt | 11 - res/cardsfolder/mystic_enforcer.txt | 12 - res/cardsfolder/mystic_familiar.txt | 11 - res/cardsfolder/mystic_gate.txt | 13 - res/cardsfolder/mystic_melting.txt | 10 - res/cardsfolder/mystic_penitent.txt | 11 - res/cardsfolder/mystic_restraints.txt | 11 - res/cardsfolder/mystic_snake.txt | 14 - res/cardsfolder/mystic_speculation.txt | 11 - res/cardsfolder/mystic_visionary.txt | 10 - res/cardsfolder/mystic_zealot.txt | 10 - res/cardsfolder/mystical_tutor.txt | 11 - res/cardsfolder/mythic_proportions.txt | 10 - res/cardsfolder/nacatl_outlander.txt | 10 - res/cardsfolder/nacatl_savage.txt | 10 - res/cardsfolder/nacre_talisman.txt | 11 - res/cardsfolder/nagao_bound_by_honor.txt | 13 - res/cardsfolder/nameless_inversion.txt | 10 - res/cardsfolder/nameless_one.txt | 13 - res/cardsfolder/nameless_race.txt | 11 - res/cardsfolder/nantuko_blightcutter.txt | 12 - res/cardsfolder/nantuko_calmer.txt | 12 - res/cardsfolder/nantuko_disciple.txt | 11 - res/cardsfolder/nantuko_elder.txt | 11 - res/cardsfolder/nantuko_husk.txt | 13 - res/cardsfolder/nantuko_monastery.txt | 11 - res/cardsfolder/nantuko_shade.txt | 11 - res/cardsfolder/nantuko_tracer.txt | 11 - res/cardsfolder/nantuko_vigilante.txt | 12 - res/cardsfolder/narcissism.txt | 11 - res/cardsfolder/narcolepsy.txt | 12 - res/cardsfolder/narcomoeba.txt | 12 - res/cardsfolder/narrow_escape.txt | 11 - res/cardsfolder/narwhal.txt | 11 - res/cardsfolder/nath_of_the_gilt_leaf.txt | 13 - res/cardsfolder/naths_buffoon.txt | 10 - res/cardsfolder/naths_elite.txt | 13 - res/cardsfolder/natural_affinity.txt | 12 - res/cardsfolder/natural_order.txt | 10 - res/cardsfolder/natural_selection.txt | 12 - res/cardsfolder/natural_spring.txt | 14 - res/cardsfolder/naturalize.txt | 16 - res/cardsfolder/natures_chosen.txt | 13 - res/cardsfolder/natures_claim.txt | 10 - res/cardsfolder/natures_cloak.txt | 14 - res/cardsfolder/natures_lore.txt | 13 - res/cardsfolder/natures_resurgence.txt | 14 - res/cardsfolder/natures_revolt.txt | 11 - res/cardsfolder/natures_ruin.txt | 10 - res/cardsfolder/natures_spiral.txt | 10 - res/cardsfolder/natures_wrath.txt | 14 - res/cardsfolder/nausea.txt | 11 - res/cardsfolder/naya_battlemage.txt | 11 - res/cardsfolder/naya_hushblade.txt | 11 - res/cardsfolder/naya_panorama.txt | 10 - res/cardsfolder/naya_sojourners.txt | 13 - res/cardsfolder/near_death_experience.txt | 9 - res/cardsfolder/nebuchadnezzar.txt | 12 - res/cardsfolder/neck_snap.txt | 10 - res/cardsfolder/necra_disciple.txt | 15 - res/cardsfolder/necratog.txt | 10 - res/cardsfolder/necrite.txt | 13 - res/cardsfolder/necrogen_censer.txt | 10 - res/cardsfolder/necrogen_mists.txt | 11 - res/cardsfolder/necrogen_scudder.txt | 12 - res/cardsfolder/necrogen_spellbomb.txt | 10 - res/cardsfolder/necrogenesis.txt | 9 - res/cardsfolder/necromantic_thirst.txt | 11 - res/cardsfolder/necropede.txt | 12 - res/cardsfolder/necroplasm.txt | 16 - res/cardsfolder/necropolis.txt | 12 - res/cardsfolder/necropotence.txt | 10 - res/cardsfolder/necropouncer.txt | 10 - res/cardsfolder/necrosavant.txt | 12 - res/cardsfolder/necroskitter.txt | 12 - res/cardsfolder/necrotic_sliver.txt | 13 - res/cardsfolder/need_for_speed.txt | 10 - res/cardsfolder/needle_specter.txt | 14 - res/cardsfolder/needle_storm.txt | 11 - res/cardsfolder/needlebug.txt | 11 - res/cardsfolder/needlepeak_spider.txt | 10 - res/cardsfolder/needleshot_gourna.txt | 10 - res/cardsfolder/nefashu.txt | 11 - res/cardsfolder/negate.txt | 11 - res/cardsfolder/nekrataal.txt | 15 - res/cardsfolder/nema_siltlurker.txt | 9 - res/cardsfolder/nemata_grove_guardian.txt | 12 - res/cardsfolder/nemesis_mask.txt | 9 - res/cardsfolder/nemesis_of_reason.txt | 11 - res/cardsfolder/nessian_courser.txt | 9 - res/cardsfolder/nest_invader.txt | 12 - res/cardsfolder/nested_ghoul.txt | 11 - res/cardsfolder/nesting_wurm.txt | 12 - res/cardsfolder/nether_horror.txt | 9 - res/cardsfolder/nether_spirit.txt | 11 - res/cardsfolder/nether_traitor.txt | 13 - res/cardsfolder/nether_void.txt | 11 - res/cardsfolder/netherborn_phalanx.txt | 13 - res/cardsfolder/netter_en_dal.txt | 11 - res/cardsfolder/nettle_sentinel.txt | 12 - res/cardsfolder/nettletooth_djinn.txt | 11 - res/cardsfolder/nettling_curse.txt | 16 - res/cardsfolder/neurok_commando.txt | 12 - res/cardsfolder/neurok_familiar.txt | 12 - res/cardsfolder/neurok_hoversail.txt | 9 - res/cardsfolder/neurok_invisimancer.txt | 13 - res/cardsfolder/neurok_prodigy.txt | 12 - res/cardsfolder/neurok_replica.txt | 11 - res/cardsfolder/neurok_spy.txt | 10 - res/cardsfolder/nevermaker.txt | 15 - res/cardsfolder/nevinyrrals_disk.txt | 15 - res/cardsfolder/new_benalia.txt | 13 - res/cardsfolder/nezumi_bone_reader.txt | 11 - res/cardsfolder/nezumi_cutthroat.txt | 11 - res/cardsfolder/nezumi_ronin.txt | 10 - res/cardsfolder/nezumi_shadow_watcher.txt | 11 - res/cardsfolder/niall_silvain.txt | 11 - res/cardsfolder/nicol_bolas.txt | 14 - res/cardsfolder/nicol_bolas_planeswalker.txt | 14 - res/cardsfolder/night_of_souls_betrayal.txt | 10 - res/cardsfolder/night_soil.txt | 9 - res/cardsfolder/nightcreep.txt | 11 - res/cardsfolder/nightguard_patrol.txt | 11 - res/cardsfolder/nighthaze.txt | 10 - res/cardsfolder/nightmare.txt | 23 - res/cardsfolder/nightmare_incursion.txt | 10 - res/cardsfolder/nightmare_lash.txt | 12 - res/cardsfolder/nightmare_void.txt | 10 - res/cardsfolder/nights_whisper.txt | 10 - res/cardsfolder/nightscape_apprentice.txt | 12 - res/cardsfolder/nightscape_familiar.txt | 11 - res/cardsfolder/nightscape_master.txt | 11 - res/cardsfolder/nightshade_schemers.txt | 11 - res/cardsfolder/nightshade_stinger.txt | 11 - res/cardsfolder/nightsky_mimic.txt | 12 - res/cardsfolder/nightsoil_kami.txt | 10 - res/cardsfolder/nightstalker_engine.txt | 10 - res/cardsfolder/nightwind_glider.txt | 11 - res/cardsfolder/nightwing_shade.txt | 11 - res/cardsfolder/nihil_spellbomb.txt | 12 - res/cardsfolder/nihilistic_glee.txt | 12 - res/cardsfolder/nihilith.txt | 13 - res/cardsfolder/nikko_onna.txt | 14 - res/cardsfolder/nim_abomination.txt | 11 - res/cardsfolder/nim_devourer.txt | 15 - res/cardsfolder/nim_grotesque.txt | 13 - res/cardsfolder/nim_lasher.txt | 13 - res/cardsfolder/nim_replica.txt | 11 - res/cardsfolder/nim_shambler.txt | 14 - res/cardsfolder/nim_shrieker.txt | 14 - res/cardsfolder/nimana_sell_sword.txt | 13 - res/cardsfolder/nimble_mongoose.txt | 11 - res/cardsfolder/nimbus_maze.txt | 11 - res/cardsfolder/nimbus_wings.txt | 10 - res/cardsfolder/nine_ringed_bo.txt | 11 - res/cardsfolder/ninja_of_the_deep_hours.txt | 13 - res/cardsfolder/nip_gwyllion.txt | 10 - res/cardsfolder/nirkana_cutthroat.txt | 14 - res/cardsfolder/nirkana_revenant.txt | 13 - res/cardsfolder/nissa_revane.txt | 15 - res/cardsfolder/nissas_chosen.txt | 9 - res/cardsfolder/niv_mizzet_the_firemind.txt | 13 - res/cardsfolder/niveous_wisps.txt | 12 - res/cardsfolder/no_dachi.txt | 9 - res/cardsfolder/no_mercy.txt | 10 - res/cardsfolder/nobilis_of_war.txt | 12 - res/cardsfolder/noble_benefactor.txt | 11 - res/cardsfolder/noble_hierarch.txt | 13 - res/cardsfolder/noble_panther.txt | 10 - res/cardsfolder/noble_purpose.txt | 12 - res/cardsfolder/noble_stand.txt | 10 - res/cardsfolder/noble_steeds.txt | 9 - res/cardsfolder/noble_templar.txt | 11 - res/cardsfolder/noble_vestige.txt | 11 - res/cardsfolder/nocturnal_raid.txt | 12 - res/cardsfolder/noggle_bandit.txt | 10 - res/cardsfolder/noggle_bridgebreaker.txt | 11 - res/cardsfolder/noggle_hedge_mage.txt | 13 - res/cardsfolder/noggle_ransacker.txt | 12 - res/cardsfolder/nomad_stadium.txt | 12 - res/cardsfolder/nomadic_elf.txt | 15 - res/cardsfolder/northern_paladin.txt | 16 - res/cardsfolder/norwood_archers.txt | 11 - res/cardsfolder/norwood_priestess.txt | 10 - res/cardsfolder/norwood_ranger.txt | 12 - res/cardsfolder/norwood_riders.txt | 10 - res/cardsfolder/norwood_warrior.txt | 11 - res/cardsfolder/nosy_goblin.txt | 11 - res/cardsfolder/notorious_assassin.txt | 10 - res/cardsfolder/nourish.txt | 9 - res/cardsfolder/nourishing_shoal.txt | 13 - res/cardsfolder/nova_chaser.txt | 12 - res/cardsfolder/nova_cleric.txt | 11 - res/cardsfolder/novablast_wurm.txt | 11 - res/cardsfolder/novijen_heart_of_progress.txt | 9 - res/cardsfolder/noxious_field.txt | 11 - res/cardsfolder/noxious_ghoul.txt | 13 - res/cardsfolder/noxious_hatchling.txt | 15 - res/cardsfolder/noxious_revival.txt | 10 - res/cardsfolder/noxious_toad.txt | 12 - res/cardsfolder/nucklavee.txt | 13 - res/cardsfolder/null_brooch.txt | 10 - res/cardsfolder/null_champion.txt | 14 - res/cardsfolder/null_profusion.txt | 14 - res/cardsfolder/null_rod.txt | 10 - res/cardsfolder/nullmage_advocate.txt | 12 - res/cardsfolder/nullmage_shepherd.txt | 11 - res/cardsfolder/nulltread_gargantuan.txt | 12 - res/cardsfolder/numai_outcast.txt | 12 - res/cardsfolder/numot_the_devastator.txt | 12 - res/cardsfolder/nurturer_initiate.txt | 11 - res/cardsfolder/nut_collector.txt | 12 - res/cardsfolder/nyxathid.txt | 11 - res/cardsfolder/oaken_brawler.txt | 12 - res/cardsfolder/oakenform.txt | 10 - res/cardsfolder/oakgnarl_warrior.txt | 11 - res/cardsfolder/oasis.txt | 11 - res/cardsfolder/oath_of_druids.txt | 8 - res/cardsfolder/oath_of_ghouls.txt | 8 - res/cardsfolder/oathsworn_giant.txt | 12 - res/cardsfolder/ob_nixilis_the_fallen.txt | 13 - res/cardsfolder/obelisk_of_alara.txt | 14 - res/cardsfolder/obelisk_of_bant.txt | 11 - res/cardsfolder/obelisk_of_esper.txt | 11 - res/cardsfolder/obelisk_of_grixis.txt | 11 - res/cardsfolder/obelisk_of_jund.txt | 11 - res/cardsfolder/obelisk_of_naya.txt | 11 - res/cardsfolder/obelisk_of_undoing.txt | 11 - res/cardsfolder/oblation.txt | 10 - res/cardsfolder/obliterate.txt | 11 - res/cardsfolder/oblivion_crown.txt | 13 - res/cardsfolder/oblivion_ring.txt | 14 - res/cardsfolder/oboro_breezecaller.txt | 12 - .../oboro_palace_in_the_clouds.txt | 11 - res/cardsfolder/obsessive_search.txt | 10 - res/cardsfolder/obsianus_golem.txt | 14 - res/cardsfolder/obsidian_acolyte.txt | 11 - res/cardsfolder/obsidian_fireheart.txt | 10 - res/cardsfolder/obsidian_giant.txt | 9 - res/cardsfolder/obstinate_baloth.txt | 12 - res/cardsfolder/ocular_halo.txt | 13 - res/cardsfolder/oculus.txt | 12 - res/cardsfolder/odious_trow.txt | 10 - res/cardsfolder/odylic_wraith.txt | 12 - res/cardsfolder/off_balance.txt | 10 - res/cardsfolder/offalsnout.txt | 16 - res/cardsfolder/offering_to_asha.txt | 10 - res/cardsfolder/ogre_arsonist.txt | 11 - res/cardsfolder/ogre_berserker.txt | 10 - res/cardsfolder/ogre_gatecrasher.txt | 11 - res/cardsfolder/ogre_menial.txt | 11 - res/cardsfolder/ogre_recluse.txt | 13 - res/cardsfolder/ogre_resister.txt | 9 - res/cardsfolder/ogre_sentry.txt | 10 - res/cardsfolder/ogre_shaman.txt | 10 - res/cardsfolder/ogre_taskmaster.txt | 14 - res/cardsfolder/ogre_warrior.txt | 10 - res/cardsfolder/ogres_cleaver.txt | 9 - res/cardsfolder/ohran_viper.txt | 14 - res/cardsfolder/okiba_gang_shinobi.txt | 13 - .../okina_temple_to_the_grandfathers.txt | 10 - res/cardsfolder/old_ghastbark.txt | 9 - res/cardsfolder/old_man_of_the_sea.txt | 12 - res/cardsfolder/omega_myr.txt | 9 - res/cardsfolder/omen.txt | 11 - res/cardsfolder/omen_of_fire.txt | 14 - res/cardsfolder/omnath_locus_of_mana.txt | 13 - res/cardsfolder/omnibian.txt | 11 - res/cardsfolder/ondu_cleric.txt | 15 - res/cardsfolder/ondu_giant.txt | 11 - res/cardsfolder/one_dozen_eyes.txt | 13 - res/cardsfolder/one_with_nature.txt | 12 - res/cardsfolder/one_with_nothing.txt | 10 - res/cardsfolder/oni_of_wild_places.txt | 13 - res/cardsfolder/onslaught.txt | 11 - res/cardsfolder/onulet.txt | 13 - res/cardsfolder/onyx_goblet.txt | 9 - res/cardsfolder/onyx_talisman.txt | 11 - res/cardsfolder/oonas_gatewarden.txt | 12 - res/cardsfolder/oonas_grace.txt | 10 - res/cardsfolder/ooze_garden.txt | 10 - res/cardsfolder/opal_acrolith.txt | 12 - res/cardsfolder/opal_archangel.txt | 10 - res/cardsfolder/opal_caryatid.txt | 10 - res/cardsfolder/opal_champion.txt | 10 - res/cardsfolder/opal_gargoyle.txt | 10 - res/cardsfolder/opal_guardian.txt | 10 - res/cardsfolder/opalescence.txt | 10 - res/cardsfolder/opaline_bracers.txt | 13 - res/cardsfolder/ophidian.txt | 13 - res/cardsfolder/ophidian_eye.txt | 13 - res/cardsfolder/opportunist.txt | 10 - res/cardsfolder/opportunity.txt | 9 - res/cardsfolder/opposition.txt | 11 - res/cardsfolder/oppression.txt | 12 - res/cardsfolder/oppressive_will.txt | 11 - res/cardsfolder/opt.txt | 11 - res/cardsfolder/oracle_of_mul_daya.txt | 10 - res/cardsfolder/oracle_of_nectars.txt | 12 - res/cardsfolder/oran_rief_recluse.txt | 14 - res/cardsfolder/oran_rief_survivalist.txt | 13 - res/cardsfolder/oran_rief_the_vastwood.txt | 11 - res/cardsfolder/oraxid.txt | 10 - res/cardsfolder/orb_of_dreams.txt | 9 - res/cardsfolder/orbweaver_kumo.txt | 14 - res/cardsfolder/orc_general.txt | 11 - res/cardsfolder/orchard_warden.txt | 12 - res/cardsfolder/orcish_artillery.txt | 22 - res/cardsfolder/orcish_bloodpainter.txt | 11 - res/cardsfolder/orcish_cannonade.txt | 12 - res/cardsfolder/orcish_cannoneers.txt | 12 - res/cardsfolder/orcish_captain.txt | 11 - res/cardsfolder/orcish_healer.txt | 13 - res/cardsfolder/orcish_lumberjack.txt | 14 - res/cardsfolder/orcish_mechanics.txt | 11 - res/cardsfolder/orcish_oriflamme.txt | 17 - res/cardsfolder/orcish_settlers.txt | 13 - res/cardsfolder/orcish_spy.txt | 11 - res/cardsfolder/orcish_veteran.txt | 11 - res/cardsfolder/order_of_leitbur.txt | 12 - res/cardsfolder/order_of_the_ebon_hand.txt | 12 - .../order_of_the_golden_cricket.txt | 11 - res/cardsfolder/order_of_the_sacred_bell.txt | 10 - res/cardsfolder/order_of_the_sacred_torch.txt | 13 - res/cardsfolder/order_of_the_white_shield.txt | 13 - res/cardsfolder/order_of_whiteclay.txt | 10 - res/cardsfolder/order_of_yawgmoth.txt | 12 - res/cardsfolder/ordered_migration.txt | 11 - res/cardsfolder/ordruun_commando.txt | 11 - res/cardsfolder/ore_gorger .txt | 12 - res/cardsfolder/organ_grinder.txt | 10 - res/cardsfolder/orgg.txt | 14 - res/cardsfolder/origin_spellbomb.txt | 11 - res/cardsfolder/orim_samite_healer.txt | 10 - res/cardsfolder/orims_prayer.txt | 10 - res/cardsfolder/orims_thunder.txt | 12 - res/cardsfolder/ornithopter.txt | 20 - res/cardsfolder/orochi_hatchery.txt | 13 - res/cardsfolder/orochi_leafcaller.txt | 15 - res/cardsfolder/orochi_ranger.txt | 12 - res/cardsfolder/orochi_sustainer.txt | 10 - res/cardsfolder/oros_the_avenger.txt | 12 - res/cardsfolder/orzhov_basilica.txt | 13 - res/cardsfolder/orzhov_guildmage.txt | 11 - res/cardsfolder/orzhov_signet.txt | 10 - .../orzhova_the_church_of_deals.txt | 11 - res/cardsfolder/ostiary_thrull.txt | 10 - res/cardsfolder/ostracize.txt | 10 - res/cardsfolder/otarian_juggernaut.txt | 11 - res/cardsfolder/otherworldly_journey.txt | 13 - res/cardsfolder/oubliette.txt | 14 - res/cardsfolder/oust.txt | 11 - res/cardsfolder/outbreak.txt | 12 - res/cardsfolder/outrage_shaman.txt | 13 - res/cardsfolder/outrider_of_jhess.txt | 10 - res/cardsfolder/overbeing_of_myth.txt | 12 - res/cardsfolder/overburden.txt | 13 - res/cardsfolder/overgrown_battlement.txt | 13 - res/cardsfolder/overgrown_estate.txt | 10 - res/cardsfolder/overgrown_tomb.txt | 8 - res/cardsfolder/overgrowth.txt | 14 - res/cardsfolder/override.txt | 12 - res/cardsfolder/overrule.txt | 12 - res/cardsfolder/overrun.txt | 12 - res/cardsfolder/oversold_cemetery.txt | 8 - res/cardsfolder/oversoul_of_dusk.txt | 12 - res/cardsfolder/overtaker.txt | 11 - res/cardsfolder/overwhelming_forces.txt | 11 - res/cardsfolder/overwhelming_intellect.txt | 11 - res/cardsfolder/overwhelming_stampede.txt | 8 - res/cardsfolder/owl_familiar.txt | 15 - res/cardsfolder/oxidda_daredevil.txt | 12 - res/cardsfolder/oxidda_golem.txt | 11 - res/cardsfolder/oxidda_scrapmelter.txt | 11 - res/cardsfolder/oxidize.txt | 9 - .../oyobi_who_split_the_heavens.txt | 13 - res/cardsfolder/pacifism.txt | 20 - res/cardsfolder/pact_of_negation.txt | 13 - res/cardsfolder/pain_kami.txt | 12 - res/cardsfolder/pain_magnification.txt | 10 - res/cardsfolder/painful_memories.txt | 10 - res/cardsfolder/painsmith.txt | 12 - res/cardsfolder/painters_servant.txt | 9 - res/cardsfolder/painwracker_oni.txt | 14 - res/cardsfolder/paladin_en_vec.txt | 14 - res/cardsfolder/pale_bears.txt | 10 - res/cardsfolder/pale_recluse.txt | 12 - res/cardsfolder/paleoloth.txt | 11 - res/cardsfolder/palinchron.txt | 14 - res/cardsfolder/palladia_mors.txt | 12 - res/cardsfolder/palladium_myr.txt | 11 - res/cardsfolder/palliation_accord.txt | 11 - res/cardsfolder/pallid_mycoderm.txt | 13 - res/cardsfolder/pallimud.txt | 10 - res/cardsfolder/pang_tong_young_phoenix.txt | 10 - res/cardsfolder/pangosaur.txt | 12 - res/cardsfolder/panic.txt | 12 - res/cardsfolder/panic_attack.txt | 13 - res/cardsfolder/panic_spellbomb.txt | 11 - res/cardsfolder/panther_warriors.txt | 11 - res/cardsfolder/paperfin_rascal.txt | 12 - res/cardsfolder/paradigm_shift.txt | 11 - res/cardsfolder/paradise_mantle.txt | 15 - res/cardsfolder/paragon_of_the_amesha.txt | 12 - res/cardsfolder/parallax_dementia.txt | 15 - res/cardsfolder/parallax_inhibitor.txt | 10 - res/cardsfolder/parallax_tide.txt | 14 - res/cardsfolder/parallax_wave.txt | 14 - res/cardsfolder/parallel_evolution.txt | 9 - res/cardsfolder/paralyzing_grasp.txt | 10 - res/cardsfolder/parapet_watchers.txt | 10 - res/cardsfolder/parasitic_bond.txt | 11 - res/cardsfolder/parasitic_implant.txt | 12 - res/cardsfolder/parasitic_strix.txt | 13 - res/cardsfolder/parch.txt | 11 - res/cardsfolder/pardic_arsonist.txt | 11 - res/cardsfolder/pardic_collaborator.txt | 11 - res/cardsfolder/pardic_dragon.txt | 14 - res/cardsfolder/pardic_firecat.txt | 10 - res/cardsfolder/pardic_lancer.txt | 11 - res/cardsfolder/pardic_swordsmith.txt | 11 - res/cardsfolder/part_the_veil.txt | 10 - res/cardsfolder/part_water.txt | 13 - res/cardsfolder/patagia_golem.txt | 13 - res/cardsfolder/path_of_angers_flame.txt | 9 - res/cardsfolder/path_of_peace.txt | 13 - res/cardsfolder/path_to_exile.txt | 10 - res/cardsfolder/patriarchs_bidding.txt | 8 - res/cardsfolder/patrol_signaler.txt | 10 - res/cardsfolder/patron_of_the_wild.txt | 12 - res/cardsfolder/patron_wizard.txt | 11 - res/cardsfolder/pattern_of_rebirth.txt | 12 - res/cardsfolder/paupers_cage.txt | 10 - res/cardsfolder/pavel_maliki.txt | 10 - res/cardsfolder/pawn_of_ulamog.txt | 13 - res/cardsfolder/peace_and_quiet.txt | 9 - res/cardsfolder/peace_of_mind.txt | 11 - res/cardsfolder/peace_strider.txt | 11 - res/cardsfolder/peacekeeper.txt | 10 - res/cardsfolder/peach_garden_oath.txt | 11 - res/cardsfolder/pearl_dragon.txt | 12 - res/cardsfolder/pearl_medallion.txt | 10 - res/cardsfolder/pearled_unicorn.txt | 14 - res/cardsfolder/peat_bog.txt | 13 - res/cardsfolder/peek.txt | 12 - res/cardsfolder/peel_from_reality.txt | 11 - res/cardsfolder/peer_through_depths.txt | 10 - res/cardsfolder/pegasus_charger.txt | 12 - res/cardsfolder/pegasus_refuge.txt | 10 - res/cardsfolder/pegasus_stampede.txt | 11 - res/cardsfolder/pelakka_wurm.txt | 14 - res/cardsfolder/pemmins_aura.txt | 16 - res/cardsfolder/pendelhaven.txt | 12 - res/cardsfolder/pendrell_drake.txt | 11 - res/cardsfolder/pendrell_mists.txt | 10 - res/cardsfolder/pennon_blade.txt | 12 - res/cardsfolder/pentad_prism.txt | 15 - res/cardsfolder/pentavus.txt | 12 - res/cardsfolder/penumbra_bobcat.txt | 11 - res/cardsfolder/penumbra_kavu.txt | 11 - res/cardsfolder/penumbra_spider.txt | 12 - res/cardsfolder/penumbra_wurm.txt | 12 - res/cardsfolder/people_of_the_woods.txt | 11 - res/cardsfolder/peppersmoke.txt | 11 - res/cardsfolder/peregrine_drake.txt | 12 - res/cardsfolder/peregrine_mask.txt | 9 - res/cardsfolder/perilous_forays.txt | 10 - res/cardsfolder/perilous_myr.txt | 11 - res/cardsfolder/perilous_research.txt | 11 - res/cardsfolder/perimeter_captain.txt | 12 - res/cardsfolder/perish.txt | 11 - res/cardsfolder/perish_the_thought.txt | 9 - res/cardsfolder/pernicious_deed.txt | 11 - res/cardsfolder/personal_tutor.txt | 10 - res/cardsfolder/persuasion.txt | 11 - res/cardsfolder/pestermite.txt | 14 - res/cardsfolder/pestilence.txt | 18 - res/cardsfolder/pestilence_demon.txt | 11 - res/cardsfolder/pestilence_rats.txt | 12 - res/cardsfolder/pestilent_kathari.txt | 12 - res/cardsfolder/pestilent_souleater.txt | 10 - res/cardsfolder/petradon.txt | 15 - res/cardsfolder/petrahydrox.txt | 11 - res/cardsfolder/petravark.txt | 13 - res/cardsfolder/petrified_field.txt | 11 - res/cardsfolder/pewter_golem.txt | 10 - res/cardsfolder/phantasmal_abomination.txt | 12 - res/cardsfolder/phantasmal_fiend.txt | 11 - res/cardsfolder/phantasmal_forces.txt | 16 - res/cardsfolder/phantasmal_terrain.txt | 16 - res/cardsfolder/phantatog.txt | 12 - res/cardsfolder/phantom_beast.txt | 11 - res/cardsfolder/phantom_centaur.txt | 12 - res/cardsfolder/phantom_flock.txt | 12 - res/cardsfolder/phantom_monster.txt | 15 - res/cardsfolder/phantom_nantuko.txt | 13 - res/cardsfolder/phantom_nishoba.txt | 15 - res/cardsfolder/phantom_nomad.txt | 11 - res/cardsfolder/phantom_tiger.txt | 11 - res/cardsfolder/phantom_warrior.txt | 18 - res/cardsfolder/phantom_whelp.txt | 13 - res/cardsfolder/phantom_wings.txt | 14 - res/cardsfolder/phantom_wurm.txt | 11 - res/cardsfolder/phelddagrif.txt | 16 - res/cardsfolder/phobian_phantasm.txt | 12 - res/cardsfolder/phylactery_lich.txt | 11 - res/cardsfolder/phyresis.txt | 10 - res/cardsfolder/phyrexian_altar.txt | 14 - res/cardsfolder/phyrexian_arena.txt | 13 - res/cardsfolder/phyrexian_battleflies.txt | 11 - res/cardsfolder/phyrexian_bloodstock.txt | 12 - res/cardsfolder/phyrexian_boon.txt | 13 - res/cardsfolder/phyrexian_broodlings.txt | 10 - res/cardsfolder/phyrexian_crusader.txt | 13 - res/cardsfolder/phyrexian_debaser.txt | 12 - res/cardsfolder/phyrexian_defiler.txt | 11 - res/cardsfolder/phyrexian_delver.txt | 14 - res/cardsfolder/phyrexian_denouncer.txt | 11 - res/cardsfolder/phyrexian_digester.txt | 10 - res/cardsfolder/phyrexian_dreadnought.txt | 11 - res/cardsfolder/phyrexian_driver.txt | 11 - res/cardsfolder/phyrexian_gargantua.txt | 13 - res/cardsfolder/phyrexian_ghoul.txt | 11 - res/cardsfolder/phyrexian_hulk.txt | 12 - res/cardsfolder/phyrexian_hydra.txt | 10 - res/cardsfolder/phyrexian_ingester.txt | 15 - res/cardsfolder/phyrexian_ironfoot.txt | 13 - res/cardsfolder/phyrexian_juggernaut.txt | 11 - res/cardsfolder/phyrexian_lens.txt | 14 - res/cardsfolder/phyrexian_metamorph.txt | 9 - res/cardsfolder/phyrexian_monitor.txt | 10 - res/cardsfolder/phyrexian_negator.txt | 14 - res/cardsfolder/phyrexian_obliterator.txt | 14 - res/cardsfolder/phyrexian_plaguelord.txt | 13 - res/cardsfolder/phyrexian_processor.txt | 11 - res/cardsfolder/phyrexian_prowler.txt | 11 - res/cardsfolder/phyrexian_rager.txt | 14 - res/cardsfolder/phyrexian_rebirth.txt | 12 - res/cardsfolder/phyrexian_reclamation.txt | 10 - res/cardsfolder/phyrexian_scuta.txt | 10 - res/cardsfolder/phyrexian_snowcrusher.txt | 13 - res/cardsfolder/phyrexian_swarmlord.txt | 13 - res/cardsfolder/phyrexian_tower.txt | 11 - res/cardsfolder/phyrexian_tribute.txt | 10 - res/cardsfolder/phyrexian_tyranny.txt | 11 - res/cardsfolder/phyrexian_vatmother.txt | 13 - res/cardsfolder/phyrexian_vault.txt | 12 - res/cardsfolder/phyrexian_walker.txt | 9 - res/cardsfolder/phyrexian_war_beast.txt | 12 - res/cardsfolder/phyrexias_core.txt | 10 - res/cardsfolder/phytohydra.txt | 9 - res/cardsfolder/pianna_nomad_captain.txt | 11 - res/cardsfolder/pierce_strider.txt | 11 - res/cardsfolder/piety.txt | 11 - res/cardsfolder/pilgrims_eye.txt | 12 - res/cardsfolder/pili_pala.txt | 16 - res/cardsfolder/pillage.txt | 11 - res/cardsfolder/pillaging_horde.txt | 10 - res/cardsfolder/pillarfield_ox.txt | 9 - res/cardsfolder/pillory_of_the_sleepless.txt | 9 - res/cardsfolder/pincer_spider.txt | 12 - res/cardsfolder/pincher_beetles.txt | 11 - res/cardsfolder/pine_barrens.txt | 14 - res/cardsfolder/pinecrest_ridge.txt | 12 - res/cardsfolder/pinpoint_avalanche.txt | 9 - res/cardsfolder/pipers_melody.txt | 11 - res/cardsfolder/piracy_charm.txt | 12 - res/cardsfolder/piranha_marsh.txt | 12 - res/cardsfolder/pirate_ship.txt | 19 - res/cardsfolder/piston_sledge.txt | 10 - res/cardsfolder/pistus_strike.txt | 10 - res/cardsfolder/pit_imp.txt | 11 - res/cardsfolder/pit_keeper.txt | 11 - res/cardsfolder/pit_raptor.txt | 12 - res/cardsfolder/pit_scorpion.txt | 13 - res/cardsfolder/pit_trap.txt | 12 - res/cardsfolder/pitfall_trap.txt | 10 - res/cardsfolder/pith_driller.txt | 11 - res/cardsfolder/pithing_needle.txt | 11 - res/cardsfolder/pixie_queen.txt | 11 - res/cardsfolder/plague_beetle.txt | 14 - res/cardsfolder/plague_dogs.txt | 13 - res/cardsfolder/plague_fiend.txt | 11 - res/cardsfolder/plague_myr.txt | 11 - res/cardsfolder/plague_rats.txt | 17 - res/cardsfolder/plague_spitter.txt | 12 - res/cardsfolder/plague_spores.txt | 10 - res/cardsfolder/plague_stinger.txt | 11 - res/cardsfolder/plague_wind.txt | 12 - res/cardsfolder/plague_witch.txt | 11 - res/cardsfolder/plaguebearer.txt | 13 - res/cardsfolder/plagued_rusalka.txt | 11 - res/cardsfolder/plaguemaw_beast.txt | 11 - res/cardsfolder/plains.txt | 44 - res/cardsfolder/planar_birth.txt | 10 - res/cardsfolder/planar_cleansing.txt | 9 - res/cardsfolder/planar_collapse.txt | 12 - res/cardsfolder/planar_despair.txt | 11 - res/cardsfolder/planar_gate.txt | 9 - res/cardsfolder/planar_guide.txt | 11 - res/cardsfolder/planar_portal.txt | 10 - res/cardsfolder/planar_void.txt | 9 - res/cardsfolder/plasma_elemental.txt | 10 - res/cardsfolder/plateau.txt | 11 - res/cardsfolder/plated_geopede.txt | 13 - res/cardsfolder/plated_pegasus.txt | 13 - res/cardsfolder/plated_rootwalla.txt | 10 - res/cardsfolder/plated_seastrider.txt | 9 - res/cardsfolder/plated_slagwurm.txt | 10 - res/cardsfolder/plated_sliver.txt | 11 - res/cardsfolder/plated_spider.txt | 10 - res/cardsfolder/plated_wurm.txt | 9 - res/cardsfolder/platinum_angel.txt | 15 - res/cardsfolder/platinum_emperion.txt | 10 - res/cardsfolder/plover_knights.txt | 11 - res/cardsfolder/plow_under.txt | 10 - res/cardsfolder/plumes_of_peace.txt | 12 - res/cardsfolder/plumeveil.txt | 12 - res/cardsfolder/plummet.txt | 9 - res/cardsfolder/plunder.txt | 10 - res/cardsfolder/poison_arrow.txt | 10 - res/cardsfolder/poison_the_well.txt | 10 - res/cardsfolder/poisonbelly_ogre.txt | 11 - res/cardsfolder/political_trickery.txt | 9 - res/cardsfolder/pollen_lullaby.txt | 11 - res/cardsfolder/pollenbright_wings.txt | 13 - res/cardsfolder/polluted_bonds.txt | 11 - res/cardsfolder/polluted_delta.txt | 9 - res/cardsfolder/polluted_mire.txt | 12 - res/cardsfolder/ponder.txt | 12 - res/cardsfolder/pongify.txt | 11 - res/cardsfolder/pooling_venom.txt | 12 - res/cardsfolder/porcelain_legionnaire.txt | 10 - res/cardsfolder/porphyry_nodes.txt | 9 - res/cardsfolder/port_inspector.txt | 11 - res/cardsfolder/portcullis.txt | 12 - res/cardsfolder/portent.txt | 12 - res/cardsfolder/possessed_aven.txt | 13 - res/cardsfolder/possessed_barbarian.txt | 13 - res/cardsfolder/possessed_centaur.txt | 13 - res/cardsfolder/possessed_nomad.txt | 13 - res/cardsfolder/postmortem_lunge.txt | 12 - res/cardsfolder/poultice_sliver.txt | 12 - res/cardsfolder/pouncing_jaguar.txt | 10 - res/cardsfolder/powder_keg.txt | 13 - res/cardsfolder/power_armor.txt | 12 - res/cardsfolder/power_artifact.txt | 11 - res/cardsfolder/power_matrix.txt | 9 - res/cardsfolder/power_of_fire.txt | 12 - res/cardsfolder/power_sink.txt | 21 - res/cardsfolder/power_surge.txt | 13 - res/cardsfolder/powerstone_minefield.txt | 13 - res/cardsfolder/pradesh_gypsies.txt | 14 - res/cardsfolder/praetors_counsel.txt | 8 - res/cardsfolder/precognition.txt | 11 - res/cardsfolder/predator_dragon.txt | 12 - res/cardsfolder/predator_flagship.txt | 10 - res/cardsfolder/predators_strike.txt | 9 - res/cardsfolder/predatory_advantage.txt | 8 - res/cardsfolder/predatory_hunger.txt | 12 - res/cardsfolder/predatory_nightstalker.txt | 11 - res/cardsfolder/preeminent_captain.txt | 10 - res/cardsfolder/preemptive_strike.txt | 9 - res/cardsfolder/preordain.txt | 11 - res/cardsfolder/presence_of_gond.txt | 12 - res/cardsfolder/presence_of_the_master.txt | 12 - res/cardsfolder/presence_of_the_wise.txt | 10 - res/cardsfolder/pretenders_claim.txt | 12 - res/cardsfolder/price_of_progress.txt | 13 - res/cardsfolder/prickly_boggart.txt | 10 - res/cardsfolder/pride_of_the_clouds.txt | 14 - res/cardsfolder/priest_of_gix.txt | 11 - res/cardsfolder/priest_of_titania.txt | 12 - res/cardsfolder/priest_of_urabrask.txt | 11 - res/cardsfolder/priest_of_yawgmoth.txt | 12 - res/cardsfolder/priests_of_norn.txt | 11 - res/cardsfolder/primal_bellow.txt | 10 - res/cardsfolder/primal_boost.txt | 12 - res/cardsfolder/primal_clay.txt | 13 - res/cardsfolder/primal_cocoon.txt | 15 - res/cardsfolder/primal_frenzy.txt | 10 - res/cardsfolder/primal_order.txt | 15 - res/cardsfolder/primal_plasma.txt | 9 - res/cardsfolder/primal_rage.txt | 11 - res/cardsfolder/primal_whisperer.txt | 13 - res/cardsfolder/primalcrux.txt | 12 - res/cardsfolder/primeval_shambler.txt | 11 - res/cardsfolder/primeval_titan.txt | 13 - res/cardsfolder/primoc_escapee.txt | 11 - res/cardsfolder/primordial_sage.txt | 11 - res/cardsfolder/princess_lucrezia.txt | 10 - res/cardsfolder/prismatic_lens.txt | 15 - res/cardsfolder/prismatic_omen.txt | 10 - res/cardsfolder/pristine_angel.txt | 13 - res/cardsfolder/pristine_talisman.txt | 11 - res/cardsfolder/privileged_position.txt | 9 - res/cardsfolder/prized_unicorn.txt | 11 - res/cardsfolder/proclamation_of_rebirth.txt | 11 - res/cardsfolder/prodigal_pyromancer.txt | 13 - res/cardsfolder/prodigal_sorcerer.txt | 18 - res/cardsfolder/profane_command.txt | 9 - res/cardsfolder/profane_prayers.txt | 11 - res/cardsfolder/progenitus.txt | 11 - res/cardsfolder/promise_of_power.txt | 16 - res/cardsfolder/promised_kannushi.txt | 10 - res/cardsfolder/propaganda.txt | 8 - res/cardsfolder/proper_burial.txt | 11 - res/cardsfolder/prophetic_bolt.txt | 10 - res/cardsfolder/prophetic_prism.txt | 16 - res/cardsfolder/prosperity.txt | 13 - res/cardsfolder/protective_bubble.txt | 10 - res/cardsfolder/protomatter_powder.txt | 10 - res/cardsfolder/prototype_portal.txt | 13 - res/cardsfolder/provoke.txt | 12 - res/cardsfolder/prowess_of_the_fair.txt | 11 - res/cardsfolder/prowling_nightstalker.txt | 10 - res/cardsfolder/psionic_blast.txt | 13 - res/cardsfolder/psionic_entity.txt | 13 - res/cardsfolder/psionic_gift.txt | 12 - res/cardsfolder/psionic_sliver.txt | 13 - res/cardsfolder/psychatog.txt | 12 - res/cardsfolder/psychic_barrier.txt | 10 - res/cardsfolder/psychic_drain.txt | 12 - res/cardsfolder/psychic_membrane.txt | 12 - res/cardsfolder/psychic_purge.txt | 9 - res/cardsfolder/psychic_spear.txt | 10 - res/cardsfolder/psychic_surgery.txt | 11 - res/cardsfolder/psychic_venom.txt | 17 - res/cardsfolder/psychosis_crawler.txt | 13 - res/cardsfolder/psychotic_fury.txt | 11 - res/cardsfolder/psychotic_haze.txt | 11 - res/cardsfolder/psychotrope_thallid.txt | 13 - res/cardsfolder/pteron_ghost.txt | 12 - res/cardsfolder/puffer_extract.txt | 11 - res/cardsfolder/pull_under.txt | 9 - res/cardsfolder/pulling_teeth.txt | 11 - res/cardsfolder/pulsating_illusion.txt | 12 - res/cardsfolder/pulse_of_the_tangle.txt | 8 - res/cardsfolder/pulse_tracker.txt | 11 - res/cardsfolder/pulsemage_advocate.txt | 12 - res/cardsfolder/pulverize.txt | 10 - res/cardsfolder/puncture_blast.txt | 10 - res/cardsfolder/puncture_bolt.txt | 10 - res/cardsfolder/puncturing_light.txt | 10 - res/cardsfolder/punish_ignorance.txt | 11 - res/cardsfolder/punishing_fire.txt | 11 - res/cardsfolder/puppet_conjurer.txt | 12 - res/cardsfolder/puppet_strings.txt | 10 - res/cardsfolder/puppeteer.txt | 14 - res/cardsfolder/puppeteer_clique.txt | 15 - res/cardsfolder/purge.txt | 10 - res/cardsfolder/purify.txt | 10 - res/cardsfolder/purity.txt | 11 - res/cardsfolder/purraj_of_urborg.txt | 12 - res/cardsfolder/pus_kami.txt | 12 - res/cardsfolder/put_away.txt | 10 - res/cardsfolder/putrefaction.txt | 11 - res/cardsfolder/putrefax.txt | 14 - res/cardsfolder/putrefy.txt | 9 - res/cardsfolder/putrid_imp.txt | 12 - res/cardsfolder/putrid_leech.txt | 11 - res/cardsfolder/putrid_raptor.txt | 10 - res/cardsfolder/pygmy_allosaurus.txt | 10 - res/cardsfolder/pygmy_kavu.txt | 13 - res/cardsfolder/pygmy_pyrosaur.txt | 12 - res/cardsfolder/pygmy_razorback.txt | 10 - res/cardsfolder/pygmy_troll.txt | 12 - res/cardsfolder/pyknite.txt | 11 - res/cardsfolder/pyre_charger.txt | 11 - res/cardsfolder/pyre_zombie.txt | 13 - res/cardsfolder/pyretic_ritual.txt | 10 - res/cardsfolder/pyric_salamander.txt | 11 - res/cardsfolder/pyrite_spellbomb.txt | 10 - res/cardsfolder/pyroclasm.txt | 16 - res/cardsfolder/pyroclast_consul.txt | 10 - res/cardsfolder/pyrohemia.txt | 11 - res/cardsfolder/pyrokinesis.txt | 14 - res/cardsfolder/pyromancy.txt | 11 - res/cardsfolder/pyromania.txt | 11 - res/cardsfolder/pyromatics.txt | 10 - res/cardsfolder/pyrostatic_pillar.txt | 11 - res/cardsfolder/pyrotechnics.txt | 17 - res/cardsfolder/python.txt | 11 - res/cardsfolder/qasali_pridemage.txt | 12 - res/cardsfolder/quag_sickness.txt | 13 - res/cardsfolder/quag_vampires.txt | 11 - res/cardsfolder/quagmire.txt | 9 - res/cardsfolder/quagmire_druid.txt | 11 - res/cardsfolder/quagmire_lamprey.txt | 11 - res/cardsfolder/quagnoth.txt | 12 - res/cardsfolder/quest_for_ancient_secrets.txt | 12 - res/cardsfolder/quest_for_renewal.txt | 11 - res/cardsfolder/quest_for_the_gemblades.txt | 11 - res/cardsfolder/quest_for_the_goblin_lord.txt | 12 - res/cardsfolder/quest_for_the_gravelord.txt | 11 - res/cardsfolder/quest_for_the_nihil_stone.txt | 14 - res/cardsfolder/questing_phelddagrif.txt | 16 - res/cardsfolder/quick_sliver.txt | 12 - res/cardsfolder/quicksand.txt | 14 - res/cardsfolder/quicksilver_amulet.txt | 9 - res/cardsfolder/quicksilver_behemoth.txt | 14 - res/cardsfolder/quicksilver_dagger.txt | 13 - res/cardsfolder/quicksilver_gargantuan.txt | 9 - res/cardsfolder/quicksilver_geyser.txt | 9 - res/cardsfolder/quicksilver_wall.txt | 12 - res/cardsfolder/quiet_purity.txt | 9 - res/cardsfolder/quietus_spike.txt | 9 - res/cardsfolder/quill_slinger_boggart.txt | 11 - res/cardsfolder/quilled_slagwurm.txt | 9 - res/cardsfolder/quilled_sliver.txt | 11 - res/cardsfolder/quirion_druid.txt | 10 - res/cardsfolder/quirion_dryad.txt | 14 - res/cardsfolder/quirion_explorer.txt | 11 - res/cardsfolder/quirion_ranger.txt | 11 - res/cardsfolder/quirion_trailblazer.txt | 11 - res/cardsfolder/qumulox.txt | 11 - res/cardsfolder/rabble_rouser.txt | 12 - res/cardsfolder/rabid_elephant.txt | 12 - res/cardsfolder/rabid_rats.txt | 10 - res/cardsfolder/rabid_wolverines.txt | 11 - res/cardsfolder/rabid_wombat.txt | 14 - res/cardsfolder/rack_and_ruin.txt | 9 - res/cardsfolder/rackling.txt | 12 - res/cardsfolder/radha_heir_to_keld.txt | 12 - res/cardsfolder/radiant_archangel.txt | 14 - res/cardsfolder/radiant_essence.txt | 11 - res/cardsfolder/radiants_dragoons.txt | 12 - res/cardsfolder/radiants_judgment.txt | 10 - res/cardsfolder/radjan_spirit.txt | 14 - res/cardsfolder/rafiq_of_the_many.txt | 12 - res/cardsfolder/ragamuffyn.txt | 11 - res/cardsfolder/rage_extractor.txt | 12 - res/cardsfolder/rage_nimbus.txt | 13 - res/cardsfolder/rage_reflection.txt | 10 - res/cardsfolder/rage_weaver.txt | 12 - res/cardsfolder/ragged_veins.txt | 13 - res/cardsfolder/raging_bull.txt | 9 - res/cardsfolder/raging_cougar.txt | 10 - res/cardsfolder/raging_goblin.txt | 19 - res/cardsfolder/raging_gorilla.txt | 12 - res/cardsfolder/raging_kavu.txt | 11 - res/cardsfolder/raging_minotaur.txt | 10 - res/cardsfolder/raging_ravine.txt | 14 - res/cardsfolder/ragnar.txt | 11 - res/cardsfolder/raid_bombardment.txt | 11 - res/cardsfolder/raiding_nightstalker.txt | 10 - res/cardsfolder/rain_of_blades.txt | 11 - res/cardsfolder/rain_of_embers.txt | 9 - res/cardsfolder/rain_of_salt.txt | 10 - res/cardsfolder/rain_of_tears.txt | 12 - res/cardsfolder/rainbow_vale.txt | 14 - res/cardsfolder/raise_dead.txt | 21 - res/cardsfolder/raise_the_alarm.txt | 9 - res/cardsfolder/raka_disciple.txt | 11 - res/cardsfolder/rakdos_augermage.txt | 13 - res/cardsfolder/rakdos_carnarium.txt | 13 - res/cardsfolder/rakdos_guildmage.txt | 11 - res/cardsfolder/rakdos_ickspitter.txt | 11 - res/cardsfolder/rakdos_pit_dragon.txt | 12 - res/cardsfolder/rakdos_signet.txt | 10 - res/cardsfolder/rakdos_the_defiler.txt | 18 - res/cardsfolder/rakeclaw_gargantuan.txt | 10 - res/cardsfolder/raking_canopy.txt | 10 - res/cardsfolder/rakka_mar.txt | 11 - res/cardsfolder/raksha_golden_cub.txt | 13 - res/cardsfolder/rally.txt | 10 - res/cardsfolder/rally_the_forces.txt | 9 - res/cardsfolder/ramirez_depietro.txt | 10 - res/cardsfolder/ramosian_captain.txt | 12 - res/cardsfolder/ramosian_commander.txt | 11 - res/cardsfolder/ramosian_lieutenant.txt | 11 - res/cardsfolder/ramosian_rally.txt | 10 - res/cardsfolder/ramosian_revivalist.txt | 10 - res/cardsfolder/ramosian_sergeant.txt | 11 - res/cardsfolder/ramosian_sky_marshal.txt | 12 - res/cardsfolder/rampaging_baloths.txt | 12 - res/cardsfolder/rampant_growth.txt | 16 - res/cardsfolder/rampart_crawler.txt | 10 - res/cardsfolder/ramses_overdark.txt | 10 - res/cardsfolder/rancor.txt | 12 - res/cardsfolder/ranger_en_vec.txt | 11 - res/cardsfolder/ranger_of_eos.txt | 11 - res/cardsfolder/rank_and_file.txt | 13 - res/cardsfolder/ransack.txt | 11 - res/cardsfolder/rapacious_one.txt | 14 - res/cardsfolder/rappelling_scouts.txt | 15 - res/cardsfolder/rashida_scalebane.txt | 13 - res/cardsfolder/rashka_the_slayer.txt | 12 - res/cardsfolder/ratcatcher.txt | 13 - res/cardsfolder/ratchet_bomb.txt | 11 - res/cardsfolder/rathi_assassin.txt | 12 - res/cardsfolder/rathi_fiend.txt | 13 - res/cardsfolder/rathi_intimidator.txt | 12 - res/cardsfolder/rathi_trapper.txt | 10 - res/cardsfolder/raths_edge.txt | 11 - res/cardsfolder/rats_of_rath.txt | 10 - res/cardsfolder/rattleblaze_scarecrow.txt | 12 - res/cardsfolder/ravaged_highlands.txt | 15 - res/cardsfolder/ravages_of_war.txt | 9 - res/cardsfolder/ravaging_horde.txt | 11 - res/cardsfolder/ravaging_riftwurm.txt | 12 - res/cardsfolder/raven_familiar.txt | 13 - res/cardsfolder/raven_guild_initiate.txt | 11 - res/cardsfolder/raven_guild_master.txt | 12 - res/cardsfolder/ravenous_baboons.txt | 11 - res/cardsfolder/ravenous_baloth.txt | 11 - res/cardsfolder/ravenous_rats.txt | 17 - res/cardsfolder/ravenous_skirge.txt | 12 - res/cardsfolder/ravens_crime.txt | 10 - res/cardsfolder/ravens_run_dragoon.txt | 10 - res/cardsfolder/raving_oni_slave.txt | 13 - res/cardsfolder/ray_of_command.txt | 11 - res/cardsfolder/ray_of_distortion.txt | 10 - res/cardsfolder/ray_of_erasure.txt | 10 - res/cardsfolder/ray_of_revelation.txt | 10 - res/cardsfolder/raze.txt | 10 - res/cardsfolder/razing_snidd.txt | 14 - res/cardsfolder/razor_golem.txt | 12 - res/cardsfolder/razor_hippogriff.txt | 14 - res/cardsfolder/razor_pendulum.txt | 13 - res/cardsfolder/razor_swine.txt | 11 - res/cardsfolder/razorclaw_bear.txt | 11 - res/cardsfolder/razorfield_rhino.txt | 11 - res/cardsfolder/razorfield_thresher.txt | 9 - res/cardsfolder/razorfin_hunter.txt | 10 - res/cardsfolder/razorfoot_griffin.txt | 14 - res/cardsfolder/razorgrass_screen.txt | 11 - res/cardsfolder/razorjaw_oni.txt | 11 - res/cardsfolder/razortooth_rats.txt | 13 - res/cardsfolder/razorverge_thicket.txt | 11 - res/cardsfolder/reach_of_branches.txt | 11 - res/cardsfolder/reach_through_mists.txt | 9 - res/cardsfolder/reality_spasm.txt | 14 - res/cardsfolder/reality_strobe.txt | 12 - res/cardsfolder/reanimate.txt | 11 - res/cardsfolder/reap_and_sow.txt | 13 - res/cardsfolder/reaper_king.txt | 14 - res/cardsfolder/reaper_of_sheoldred.txt | 12 - res/cardsfolder/reaping_the_graves.txt | 10 - res/cardsfolder/reaping_the_rewards.txt | 12 - res/cardsfolder/reassembling_skeleton.txt | 10 - res/cardsfolder/rebel_informer.txt | 11 - res/cardsfolder/rebellion_of_the_flamekin.txt | 13 - res/cardsfolder/reborn_hope.txt | 10 - res/cardsfolder/rebuff_the_wicked.txt | 9 - res/cardsfolder/rebuild.txt | 11 - res/cardsfolder/rebuking_ceremony.txt | 9 - res/cardsfolder/recall.txt | 11 - res/cardsfolder/recantation.txt | 13 - res/cardsfolder/reciprocate.txt | 10 - res/cardsfolder/reckless_abandon.txt | 10 - res/cardsfolder/reckless_assault.txt | 10 - res/cardsfolder/reckless_charge.txt | 10 - res/cardsfolder/reckless_embermage.txt | 13 - res/cardsfolder/reckless_ogre.txt | 11 - res/cardsfolder/reckless_one.txt | 13 - res/cardsfolder/reckless_scholar.txt | 11 - res/cardsfolder/reckless_spite.txt | 11 - res/cardsfolder/reckless_wurm.txt | 11 - res/cardsfolder/reclaim.txt | 11 - res/cardsfolder/reclusive_wight.txt | 12 - res/cardsfolder/recoil.txt | 10 - res/cardsfolder/recollect.txt | 9 - res/cardsfolder/reconstruction.txt | 10 - res/cardsfolder/recover.txt | 10 - res/cardsfolder/recumbent_bliss.txt | 12 - res/cardsfolder/recuperate.txt | 11 - res/cardsfolder/recurring_nightmare.txt | 10 - res/cardsfolder/recycle.txt | 14 - res/cardsfolder/red_cliffs_armada.txt | 10 - res/cardsfolder/red_elemental_blast.txt | 16 - res/cardsfolder/red_mana_battery.txt | 11 - res/cardsfolder/red_scarab.txt | 12 - res/cardsfolder/red_suns_zenith.txt | 12 - res/cardsfolder/red_ward.txt | 15 - res/cardsfolder/redeem.txt | 11 - res/cardsfolder/reduce_to_dreams.txt | 10 - res/cardsfolder/redwood_treefolk.txt | 12 - res/cardsfolder/reef_pirates.txt | 12 - res/cardsfolder/reflecting_pool.txt | 11 - res/cardsfolder/reflex_sliver.txt | 12 - res/cardsfolder/reflexes.txt | 13 - res/cardsfolder/refresh.txt | 10 - res/cardsfolder/regal_force.txt | 13 - res/cardsfolder/regal_unicorn.txt | 10 - res/cardsfolder/regenerate.txt | 9 - res/cardsfolder/regeneration.txt | 23 - res/cardsfolder/regress.txt | 10 - res/cardsfolder/regrowth.txt | 12 - res/cardsfolder/reign_of_chaos.txt | 13 - res/cardsfolder/reinforced_bulwark.txt | 11 - res/cardsfolder/reinforcements.txt | 10 - res/cardsfolder/reiterate.txt | 10 - res/cardsfolder/reito_lantern.txt | 10 - res/cardsfolder/rejuvenate.txt | 10 - res/cardsfolder/rejuvenation_chamber.txt | 10 - .../reki_the_history_of_kamigawa.txt | 11 - res/cardsfolder/rekindled_flame.txt | 11 - res/cardsfolder/reknit.txt | 9 - res/cardsfolder/relearn.txt | 11 - res/cardsfolder/release_the_ants.txt | 11 - res/cardsfolder/relentless_rats.txt | 16 - res/cardsfolder/relic_barrier.txt | 11 - res/cardsfolder/relic_crush.txt | 10 - res/cardsfolder/relic_of_progenitus.txt | 12 - res/cardsfolder/relic_putrescence.txt | 11 - res/cardsfolder/reliquary_monk.txt | 11 - res/cardsfolder/reliquary_tower.txt | 10 - res/cardsfolder/remand.txt | 10 - res/cardsfolder/reminisce.txt | 12 - res/cardsfolder/remote_farm.txt | 13 - res/cardsfolder/remote_isle.txt | 12 - res/cardsfolder/remove.txt | 10 - res/cardsfolder/remove_enchantments.txt | 9 - res/cardsfolder/remove_soul.txt | 16 - res/cardsfolder/rend_flesh.txt | 9 - res/cardsfolder/rend_spirit.txt | 10 - res/cardsfolder/rendclaw_trow.txt | 11 - res/cardsfolder/renegade_troops.txt | 10 - res/cardsfolder/renewal.txt | 10 - res/cardsfolder/renewed_faith.txt | 12 - res/cardsfolder/renewing_dawn.txt | 11 - res/cardsfolder/renewing_touch.txt | 11 - res/cardsfolder/reparations.txt | 10 - res/cardsfolder/repay_in_kind.txt | 10 - res/cardsfolder/repeal.txt | 12 - res/cardsfolder/repel.txt | 9 - res/cardsfolder/repel_the_darkness.txt | 11 - res/cardsfolder/repentance.txt | 11 - res/cardsfolder/repentant_blacksmith.txt | 11 - res/cardsfolder/repentant_vampire.txt | 14 - res/cardsfolder/repercussion.txt | 14 - res/cardsfolder/repopulate.txt | 11 - res/cardsfolder/reprisal.txt | 11 - res/cardsfolder/repulse.txt | 10 - res/cardsfolder/rescind.txt | 10 - res/cardsfolder/rescue.txt | 10 - res/cardsfolder/research_the_deep.txt | 11 - res/cardsfolder/reset.txt | 10 - res/cardsfolder/resilient_wanderer.txt | 16 - res/cardsfolder/resistance_fighter.txt | 12 - res/cardsfolder/resize.txt | 10 - res/cardsfolder/resounding_roar.txt | 13 - res/cardsfolder/resounding_scream.txt | 13 - res/cardsfolder/resounding_silence.txt | 13 - res/cardsfolder/resounding_thunder.txt | 13 - res/cardsfolder/resounding_wave.txt | 13 - res/cardsfolder/respite.txt | 11 - res/cardsfolder/resplendent_mentor.txt | 12 - res/cardsfolder/restless_apparition.txt | 11 - res/cardsfolder/restless_bones.txt | 11 - res/cardsfolder/restless_dead.txt | 10 - res/cardsfolder/resurrection.txt | 13 - res/cardsfolder/resuscitate.txt | 10 - res/cardsfolder/retaliate.txt | 10 - res/cardsfolder/retract.txt | 10 - res/cardsfolder/retribution_of_the_meek.txt | 9 - res/cardsfolder/retromancer.txt | 11 - res/cardsfolder/return_to_battle.txt | 9 - res/cardsfolder/return_to_dust.txt | 10 - res/cardsfolder/reveillark.txt | 15 - res/cardsfolder/reveille_squad.txt | 11 - res/cardsfolder/reveka_wizard_savant.txt | 11 - res/cardsfolder/revelsong_horn.txt | 10 - res/cardsfolder/revenant.txt | 14 - res/cardsfolder/reverberate.txt | 9 - res/cardsfolder/revered_dead.txt | 10 - res/cardsfolder/reverence.txt | 8 - res/cardsfolder/revive.txt | 9 - res/cardsfolder/revive_the_fallen.txt | 11 - res/cardsfolder/reviving_dose.txt | 11 - res/cardsfolder/revoke_existence.txt | 9 - res/cardsfolder/reward_the_faithful.txt | 10 - res/cardsfolder/rewind.txt | 12 - res/cardsfolder/reya_dawnbringer.txt | 13 - res/cardsfolder/rhox_bodyguard.txt | 12 - res/cardsfolder/rhox_brute.txt | 9 - res/cardsfolder/rhox_charger.txt | 11 - res/cardsfolder/rhox_meditant.txt | 12 - res/cardsfolder/rhox_pikemaster.txt | 13 - res/cardsfolder/rhox_war_monk.txt | 10 - res/cardsfolder/rhys_the_exiled.txt | 14 - res/cardsfolder/rhys_the_redeemed.txt | 10 - res/cardsfolder/rhystic_deluge.txt | 10 - res/cardsfolder/rhystic_study.txt | 10 - res/cardsfolder/rib_cage_spider.txt | 10 - res/cardsfolder/ribbons_of_the_reikai.txt | 11 - res/cardsfolder/riddlesmith.txt | 13 - res/cardsfolder/ridge_rannet.txt | 10 - res/cardsfolder/ridged_kusite.txt | 11 - res/cardsfolder/ridgeline_rager.txt | 11 - res/cardsfolder/ridgetop_raptor.txt | 10 - res/cardsfolder/riding_red_hare.txt | 9 - res/cardsfolder/riding_the_dilu_horse.txt | 9 - res/cardsfolder/rift_bolt.txt | 10 - res/cardsfolder/riftwing_cloudskate.txt | 13 - res/cardsfolder/righteous_avengers.txt | 10 - res/cardsfolder/righteous_cause.txt | 10 - res/cardsfolder/righteous_charge.txt | 10 - res/cardsfolder/righteous_fury.txt | 12 - res/cardsfolder/righteous_war.txt | 11 - res/cardsfolder/righteousness.txt | 18 - res/cardsfolder/rime_dryad.txt | 11 - res/cardsfolder/rimebound_dead.txt | 12 - res/cardsfolder/rimescale_dragon.txt | 15 - res/cardsfolder/rimewind_cryomancer.txt | 11 - res/cardsfolder/rimewind_taskmage.txt | 11 - res/cardsfolder/ring_of_gix.txt | 11 - res/cardsfolder/ring_of_immortals.txt | 9 - res/cardsfolder/ring_of_renewal.txt | 11 - res/cardsfolder/ringskipper.txt | 13 - res/cardsfolder/riot_spikes.txt | 10 - res/cardsfolder/rip_clan_crasher.txt | 10 - res/cardsfolder/riptide.txt | 10 - res/cardsfolder/riptide_biologist.txt | 11 - res/cardsfolder/riptide_crab.txt | 12 - res/cardsfolder/riptide_director.txt | 12 - res/cardsfolder/riptide_laboratory.txt | 10 - res/cardsfolder/riptide_pilferer.txt | 12 - res/cardsfolder/riptide_survivor.txt | 14 - res/cardsfolder/rise_from_the_grave.txt | 11 - res/cardsfolder/rise_of_the_hobgoblins.txt | 12 - res/cardsfolder/rishadan_airship.txt | 11 - res/cardsfolder/rishadan_brigand.txt | 14 - res/cardsfolder/rishadan_cutpurse.txt | 12 - res/cardsfolder/rishadan_footpad.txt | 12 - res/cardsfolder/rishadan_pawnshop.txt | 10 - res/cardsfolder/rishadan_port.txt | 11 - res/cardsfolder/rite_of_flame.txt | 11 - res/cardsfolder/rite_of_passage.txt | 10 - res/cardsfolder/rite_of_replication.txt | 10 - res/cardsfolder/rites_of_flourishing.txt | 10 - res/cardsfolder/rith_the_awakener.txt | 10 - res/cardsfolder/riths_attendant.txt | 11 - res/cardsfolder/riths_grove.txt | 12 - res/cardsfolder/ritual_of_restoration.txt | 9 - res/cardsfolder/ritual_of_steel.txt | 12 - res/cardsfolder/ritual_of_the_machine.txt | 10 - res/cardsfolder/riven_turnbull.txt | 10 - res/cardsfolder/river_bear.txt | 11 - res/cardsfolder/river_boa.txt | 13 - res/cardsfolder/river_delta.txt | 14 - res/cardsfolder/river_kaijin.txt | 9 - res/cardsfolder/river_merfolk.txt | 10 - res/cardsfolder/riverfall_mimic.txt | 12 - res/cardsfolder/rix_maadi_dungeon_palace.txt | 10 - res/cardsfolder/roar_of_reclamation.txt | 10 - res/cardsfolder/roar_of_the_wurm.txt | 10 - res/cardsfolder/roaring_slagwurm.txt | 11 - res/cardsfolder/robber_fly.txt | 10 - res/cardsfolder/robe_of_mirrors.txt | 11 - res/cardsfolder/roc_egg.txt | 13 - res/cardsfolder/roc_hatchling.txt | 13 - res/cardsfolder/roc_of_kher_ridges.txt | 13 - res/cardsfolder/rock_badger.txt | 11 - res/cardsfolder/rock_basilisk.txt | 15 - res/cardsfolder/rockcaster_platoon.txt | 10 - res/cardsfolder/rockshard_elemental.txt | 11 - res/cardsfolder/rockslide_ambush.txt | 10 - res/cardsfolder/rockslide_elemental.txt | 12 - res/cardsfolder/rocky_tar_pit.txt | 10 - res/cardsfolder/rod_of_ruin.txt | 20 - .../rofellos_llanowar_emissary.txt | 12 - res/cardsfolder/rogue_kavu.txt | 12 - res/cardsfolder/roil_elemental.txt | 12 - res/cardsfolder/roiling_terrain.txt | 9 - res/cardsfolder/rolling_earthquake.txt | 11 - res/cardsfolder/rolling_stones.txt | 13 - res/cardsfolder/ronin_cavekeeper.txt | 10 - res/cardsfolder/ronin_cliffrider.txt | 12 - res/cardsfolder/ronin_houndmaster.txt | 11 - res/cardsfolder/ronom_hulk.txt | 12 - res/cardsfolder/ronom_unicorn.txt | 10 - res/cardsfolder/roofstalker_wight.txt | 10 - res/cardsfolder/root_cage.txt | 10 - res/cardsfolder/root_elemental.txt | 12 - res/cardsfolder/root_maze.txt | 10 - res/cardsfolder/root_sliver.txt | 11 - res/cardsfolder/root_spider.txt | 11 - res/cardsfolder/rootbound_crag.txt | 12 - res/cardsfolder/rootbreaker_wurm.txt | 11 - res/cardsfolder/rootgrapple.txt | 11 - res/cardsfolder/rootrunner.txt | 12 - res/cardsfolder/roots.txt | 10 - res/cardsfolder/rootwalla.txt | 12 - res/cardsfolder/rootwater_alligator.txt | 11 - res/cardsfolder/rootwater_commando.txt | 11 - res/cardsfolder/rootwater_depths.txt | 12 - res/cardsfolder/rootwater_diver.txt | 11 - res/cardsfolder/rootwater_hunter.txt | 10 - res/cardsfolder/rootwater_mystic.txt | 11 - res/cardsfolder/rootwater_thief.txt | 12 - res/cardsfolder/rorix_bladewing.txt | 11 - res/cardsfolder/rot_wolf.txt | 12 - res/cardsfolder/roterothopter.txt | 11 - res/cardsfolder/rotlung_reanimator.txt | 12 - res/cardsfolder/rotted_hystrix.txt | 9 - res/cardsfolder/rotting_legion.txt | 10 - res/cardsfolder/rotting_rats.txt | 12 - res/cardsfolder/roughshod_mentor.txt | 11 - res/cardsfolder/rouse.txt | 11 - res/cardsfolder/rowan_treefolk.txt | 9 - res/cardsfolder/royal_assassin.txt | 19 - res/cardsfolder/royal_decree.txt | 12 - res/cardsfolder/royal_falcon.txt | 11 - res/cardsfolder/royal_herbalist.txt | 10 - res/cardsfolder/royal_trooper.txt | 11 - res/cardsfolder/rubinia_soulsinger.txt | 11 - res/cardsfolder/ruby_leech.txt | 11 - res/cardsfolder/ruby_medallion.txt | 10 - res/cardsfolder/rugged_prairie.txt | 13 - res/cardsfolder/ruin_ghost.txt | 12 - res/cardsfolder/ruination.txt | 9 - res/cardsfolder/ruinous_minotaur.txt | 11 - res/cardsfolder/ruins_of_trokair.txt | 14 - res/cardsfolder/rukh_egg.txt | 15 - res/cardsfolder/rumbling_crescendo.txt | 13 - res/cardsfolder/rumbling_slum.txt | 11 - res/cardsfolder/rummaging_wizard.txt | 11 - res/cardsfolder/rune_cervin_rider.txt | 11 - res/cardsfolder/runeboggle.txt | 10 - res/cardsfolder/runeclaw_bear.txt | 10 - res/cardsfolder/runed_arch.txt | 13 - res/cardsfolder/runed_servitor.txt | 11 - res/cardsfolder/runed_stalactite.txt | 9 - res/cardsfolder/runes_of_the_deus.txt | 13 - res/cardsfolder/rupture.txt | 11 - res/cardsfolder/rush_of_knowledge.txt | 11 - res/cardsfolder/rushwood_dryad.txt | 12 - res/cardsfolder/rushwood_elemental.txt | 12 - res/cardsfolder/rushwood_herbalist.txt | 11 - res/cardsfolder/rusted_slasher.txt | 11 - res/cardsfolder/rustic_clachan.txt | 10 - res/cardsfolder/rusting_golem.txt | 11 - res/cardsfolder/rustrazor_butcher.txt | 11 - res/cardsfolder/rustspore_ram.txt | 11 - res/cardsfolder/ruthless_cullblade.txt | 10 - res/cardsfolder/ruthless_invasion.txt | 10 - res/cardsfolder/ryusei_the_falling_star.txt | 12 - res/cardsfolder/saber_ants.txt | 12 - res/cardsfolder/saberclaw_golem.txt | 10 - res/cardsfolder/sabertooth_alley_cat.txt | 11 - res/cardsfolder/sabertooth_nishoba.txt | 12 - res/cardsfolder/sabertooth_wyvern.txt | 11 - res/cardsfolder/sabretooth_tiger.txt | 14 - res/cardsfolder/sacellum_archers.txt | 11 - res/cardsfolder/sachi_daughter_of_seshiro.txt | 13 - res/cardsfolder/sacred_foundry.txt | 8 - res/cardsfolder/sacred_knight.txt | 10 - res/cardsfolder/sacred_nectar.txt | 13 - res/cardsfolder/sacred_prey.txt | 11 - res/cardsfolder/sacred_wolf.txt | 10 - res/cardsfolder/sacrifice.txt | 14 - res/cardsfolder/sadistic_augermage.txt | 11 - res/cardsfolder/sadistic_glee.txt | 12 - res/cardsfolder/sadistic_hypnotist.txt | 10 - res/cardsfolder/safehold_duo.txt | 14 - res/cardsfolder/safehold_elite.txt | 10 - res/cardsfolder/safehold_sentry.txt | 11 - res/cardsfolder/safewright_quest.txt | 9 - res/cardsfolder/sage_aven.txt | 13 - res/cardsfolder/sage_of_epityr.txt | 11 - res/cardsfolder/sage_of_lat_nam.txt | 12 - res/cardsfolder/sage_owl.txt | 17 - res/cardsfolder/sages_dousing.txt | 11 - res/cardsfolder/sages_knowledge.txt | 9 - res/cardsfolder/sailmonger.txt | 10 - res/cardsfolder/sakura_tribe_elder.txt | 10 - res/cardsfolder/sakura_tribe_scout.txt | 10 - res/cardsfolder/salt_flats.txt | 14 - res/cardsfolder/salt_marsh.txt | 12 - res/cardsfolder/saltblast.txt | 9 - res/cardsfolder/saltcrusted_steppe.txt | 11 - res/cardsfolder/saltfield_recluse.txt | 11 - res/cardsfolder/salvage.txt | 10 - res/cardsfolder/salvage_scout.txt | 11 - res/cardsfolder/salvage_slasher.txt | 11 - res/cardsfolder/salvage_titan.txt | 11 - res/cardsfolder/samite_archer.txt | 11 - res/cardsfolder/samite_healer.txt | 20 - res/cardsfolder/samurai_enforcers.txt | 10 - res/cardsfolder/sanctimony.txt | 13 - res/cardsfolder/sanctum_custodian.txt | 10 - res/cardsfolder/sanctum_gargoyle.txt | 12 - res/cardsfolder/sanctum_plowbeast.txt | 12 - res/cardsfolder/sand_silos.txt | 12 - res/cardsfolder/sandbar_merfolk.txt | 10 - res/cardsfolder/sandbar_serpent.txt | 10 - res/cardsfolder/sandskin.txt | 10 - res/cardsfolder/sandsower.txt | 11 - res/cardsfolder/sandstone_needle.txt | 13 - res/cardsfolder/sandstone_warrior.txt | 12 - res/cardsfolder/sandstorm.txt | 12 - res/cardsfolder/sandstorm_eidolon.txt | 13 - res/cardsfolder/sangrite_backlash.txt | 10 - res/cardsfolder/sangrite_surge.txt | 9 - res/cardsfolder/sangromancer.txt | 13 - res/cardsfolder/sangrophage.txt | 9 - res/cardsfolder/sanguine_bond.txt | 12 - res/cardsfolder/sanguine_guard.txt | 11 - res/cardsfolder/sanguine_praetor.txt | 12 - res/cardsfolder/sanity_gnawers.txt | 11 - res/cardsfolder/sanity_grinding.txt | 8 - res/cardsfolder/sapling_of_colfenor.txt | 10 - res/cardsfolder/sapphire_leech.txt | 11 - res/cardsfolder/sapphire_medallion.txt | 10 - res/cardsfolder/saprazzan_bailiff.txt | 14 - res/cardsfolder/saprazzan_heir.txt | 11 - res/cardsfolder/saprazzan_raider.txt | 11 - res/cardsfolder/saprazzan_skerry.txt | 13 - res/cardsfolder/sapseep_forest.txt | 10 - res/cardsfolder/sarcatog.txt | 11 - res/cardsfolder/sarcomancy.txt | 13 - res/cardsfolder/sarcomite_myr.txt | 12 - res/cardsfolder/sarkhan_the_mad.txt | 9 - res/cardsfolder/sarkhan_vol.txt | 13 - res/cardsfolder/sarpadian_empires_vol_vii.txt | 8 - res/cardsfolder/savage_conception.txt | 10 - res/cardsfolder/savage_firecat.txt | 14 - res/cardsfolder/savage_gorilla.txt | 11 - res/cardsfolder/savage_hunger.txt | 11 - res/cardsfolder/savage_lands.txt | 12 - res/cardsfolder/savage_silhouette.txt | 12 - res/cardsfolder/savage_thallid.txt | 13 - res/cardsfolder/savage_twister.txt | 12 - res/cardsfolder/savannah.txt | 11 - res/cardsfolder/savannah_lions.txt | 15 - .../savra_queen_of_the_golgari.txt | 14 - res/cardsfolder/sawback_manticore.txt | 11 - res/cardsfolder/sawtooth_loon.txt | 16 - res/cardsfolder/sawtooth_thresher.txt | 12 - res/cardsfolder/scab_clan_mauler.txt | 11 - res/cardsfolder/scabland.txt | 14 - res/cardsfolder/scald.txt | 11 - res/cardsfolder/scalding_salamander.txt | 11 - res/cardsfolder/scalding_tarn.txt | 9 - res/cardsfolder/scale_of_chiss_goria.txt | 11 - res/cardsfolder/scalebanes_elite.txt | 10 - res/cardsfolder/scaled_hulk.txt | 12 - res/cardsfolder/scaled_wurm.txt | 12 - res/cardsfolder/scalpelexis.txt | 11 - res/cardsfolder/scandalmonger.txt | 11 - res/cardsfolder/scapegoat.txt | 11 - res/cardsfolder/scar.txt | 9 - res/cardsfolder/scarblade_elite.txt | 11 - res/cardsfolder/scare_tactics.txt | 9 - res/cardsfolder/scarecrone.txt | 12 - res/cardsfolder/scarland_thrinax.txt | 10 - res/cardsfolder/scarred_vinebreeder.txt | 12 - res/cardsfolder/scarscale_ritual.txt | 11 - res/cardsfolder/scarwood_bandits.txt | 12 - res/cardsfolder/scarwood_goblins.txt | 9 - res/cardsfolder/scarwood_hag.txt | 11 - res/cardsfolder/scarwood_treefolk.txt | 10 - res/cardsfolder/scathe_zombies.txt | 19 - res/cardsfolder/scattershot.txt | 10 - res/cardsfolder/scattershot_archer.txt | 11 - res/cardsfolder/scavenged_weaponry.txt | 12 - res/cardsfolder/scavenger_drake.txt | 12 - res/cardsfolder/scavenger_folk.txt | 12 - res/cardsfolder/scavenging_ghoul.txt | 17 - res/cardsfolder/scavenging_scarab.txt | 10 - res/cardsfolder/scepter_of_dominance.txt | 10 - res/cardsfolder/scepter_of_fugue.txt | 9 - res/cardsfolder/scepter_of_insight.txt | 9 - res/cardsfolder/school_of_piranha.txt | 10 - res/cardsfolder/school_of_the_unseen.txt | 15 - res/cardsfolder/scion_of_darkness.txt | 13 - res/cardsfolder/scion_of_oona.txt | 14 - res/cardsfolder/scion_of_the_wild.txt | 12 - res/cardsfolder/scorched_ruins.txt | 9 - res/cardsfolder/scorched_rusalka.txt | 11 - res/cardsfolder/scorching_missile.txt | 10 - res/cardsfolder/scorching_spear.txt | 10 - res/cardsfolder/scorching_winds.txt | 10 - res/cardsfolder/scoria_cat.txt | 11 - res/cardsfolder/scoria_elemental.txt | 9 - res/cardsfolder/scoria_wurm.txt | 13 - res/cardsfolder/scornful_aether_lich.txt | 10 - res/cardsfolder/scornful_egotist.txt | 10 - res/cardsfolder/scourge_devil.txt | 13 - res/cardsfolder/scourge_of_kher_ridges.txt | 12 - res/cardsfolder/scourge_of_numai.txt | 12 - res/cardsfolder/scourge_of_the_nobilis.txt | 13 - res/cardsfolder/scourge_servant.txt | 10 - res/cardsfolder/scourglass.txt | 10 - res/cardsfolder/scragnoth.txt | 12 - res/cardsfolder/scrap.txt | 10 - res/cardsfolder/scrapbasket.txt | 10 - res/cardsfolder/scrapdiver_serpent.txt | 10 - res/cardsfolder/scrapheap.txt | 10 - res/cardsfolder/scrapyard_salvo.txt | 11 - res/cardsfolder/screaming_fury.txt | 9 - res/cardsfolder/screaming_seahawk.txt | 12 - res/cardsfolder/screams_of_the_damned.txt | 9 - res/cardsfolder/screeching_buzzard.txt | 13 - res/cardsfolder/screeching_drake.txt | 13 - res/cardsfolder/screeching_harpy.txt | 11 - res/cardsfolder/screeching_silcaw.txt | 12 - res/cardsfolder/screeching_sliver.txt | 11 - res/cardsfolder/scrivener.txt | 12 - res/cardsfolder/scroll_rack.txt | 9 - res/cardsfolder/scroll_thief.txt | 11 - res/cardsfolder/scrubland.txt | 11 - res/cardsfolder/scryb_ranger.txt | 14 - res/cardsfolder/scryb_sprites.txt | 15 - res/cardsfolder/scrying_sheets.txt | 12 - res/cardsfolder/sculpting_steel.txt | 9 - res/cardsfolder/scute_mob.txt | 11 - res/cardsfolder/scuttling_death.txt | 11 - res/cardsfolder/scuzzback_marauders.txt | 11 - res/cardsfolder/scuzzback_scrapper.txt | 10 - res/cardsfolder/sea_drake.txt | 13 - res/cardsfolder/sea_eagle.txt | 11 - res/cardsfolder/sea_gate_loremaster.txt | 12 - res/cardsfolder/sea_gate_oracle.txt | 12 - res/cardsfolder/sea_kings_blessing.txt | 11 - res/cardsfolder/sea_monster.txt | 15 - res/cardsfolder/sea_scryer.txt | 12 - res/cardsfolder/sea_serpent.txt | 17 - res/cardsfolder/sea_spirit.txt | 11 - res/cardsfolder/sea_sprite.txt | 12 - res/cardsfolder/seachrome_coast.txt | 11 - res/cardsfolder/seafloor_debris.txt | 16 - res/cardsfolder/seahunter.txt | 11 - res/cardsfolder/seal_of_cleansing.txt | 9 - res/cardsfolder/seal_of_doom.txt | 10 - res/cardsfolder/seal_of_fire.txt | 10 - res/cardsfolder/seal_of_primordium.txt | 9 - res/cardsfolder/seal_of_removal.txt | 9 - res/cardsfolder/seal_of_strength.txt | 9 - res/cardsfolder/search_for_tomorrow.txt | 10 - res/cardsfolder/searing_flesh.txt | 9 - res/cardsfolder/searing_meditation.txt | 11 - res/cardsfolder/searing_touch.txt | 10 - res/cardsfolder/searing_wind.txt | 10 - res/cardsfolder/seas_claim.txt | 10 - res/cardsfolder/seascape_aerialist.txt | 15 - res/cardsfolder/seashell_cameo.txt | 10 - res/cardsfolder/seaside_citadel.txt | 12 - res/cardsfolder/seaside_haven.txt | 11 - res/cardsfolder/seasinger.txt | 14 - res/cardsfolder/seasoned_marshal.txt | 15 - res/cardsfolder/seat_of_the_synod.txt | 9 - res/cardsfolder/secluded_glen.txt | 10 - res/cardsfolder/secluded_steppe.txt | 12 - res/cardsfolder/second_chance.txt | 11 - res/cardsfolder/second_sight.txt | 12 - res/cardsfolder/second_thoughts.txt | 11 - res/cardsfolder/second_wind.txt | 13 - res/cardsfolder/security_detail.txt | 10 - res/cardsfolder/sedge_troll.txt | 14 - res/cardsfolder/sedraxis_alchemist.txt | 12 - res/cardsfolder/sedraxis_specter.txt | 13 - res/cardsfolder/see_beyond.txt | 11 - res/cardsfolder/seed_the_land.txt | 10 - res/cardsfolder/seedborn_muse.txt | 12 - res/cardsfolder/seedcradle_witch.txt | 11 - res/cardsfolder/seedguide_ash.txt | 11 - res/cardsfolder/seeds_of_strength.txt | 11 - res/cardsfolder/seek_the_horizon.txt | 9 - res/cardsfolder/seeker.txt | 11 - res/cardsfolder/seeker_of_skybreak.txt | 12 - res/cardsfolder/seers_sundial.txt | 10 - res/cardsfolder/seething_anger.txt | 10 - res/cardsfolder/seething_pathblazer.txt | 11 - res/cardsfolder/seething_song.txt | 11 - res/cardsfolder/segmented_wurm.txt | 12 - res/cardsfolder/segovian_leviathan.txt | 13 - res/cardsfolder/seismic_assault.txt | 12 - res/cardsfolder/seismic_mage.txt | 10 - res/cardsfolder/seismic_shudder.txt | 9 - res/cardsfolder/seismic_spike.txt | 10 - res/cardsfolder/seismic_strike.txt | 10 - res/cardsfolder/seizan_perverter_of_truth.txt | 12 - res/cardsfolder/seize_the_initiative.txt | 9 - res/cardsfolder/seizures.txt | 11 - res/cardsfolder/sejiri_merfolk.txt | 10 - res/cardsfolder/sejiri_refuge.txt | 13 - res/cardsfolder/sejiri_steppe.txt | 10 - res/cardsfolder/sekkuar_deathkeeper.txt | 11 - res/cardsfolder/selenia_dark_angel.txt | 12 - res/cardsfolder/selesnya_evangel.txt | 10 - res/cardsfolder/selesnya_guildmage.txt | 11 - res/cardsfolder/selesnya_sanctuary.txt | 13 - res/cardsfolder/selesnya_signet.txt | 10 - res/cardsfolder/selfless_exorcist.txt | 13 - res/cardsfolder/selkie_hedge_mage.txt | 13 - res/cardsfolder/sell_sword_brute.txt | 11 - res/cardsfolder/sengir_autocrat.txt | 16 - res/cardsfolder/sengir_bats.txt | 11 - res/cardsfolder/sengir_vampire.txt | 18 - res/cardsfolder/sensation_gorger.txt | 10 - res/cardsfolder/sensei_golden_tail.txt | 12 - res/cardsfolder/senseis_divining_top.txt | 12 - res/cardsfolder/sensor_splicer.txt | 12 - res/cardsfolder/sentinels_of_glen_elendra.txt | 11 - res/cardsfolder/septic_rats.txt | 12 - res/cardsfolder/serendib_efreet.txt | 13 - res/cardsfolder/serendib_sorcerer.txt | 9 - res/cardsfolder/serene_heart.txt | 9 - res/cardsfolder/serene_offering.txt | 12 - res/cardsfolder/serene_sunset.txt | 12 - res/cardsfolder/serenity.txt | 13 - res/cardsfolder/serpent_assassin.txt | 11 - res/cardsfolder/serpent_generator.txt | 12 - .../serpent_of_the_endless_sea.txt | 12 - res/cardsfolder/serpent_skin.txt | 12 - res/cardsfolder/serpent_warrior.txt | 16 - res/cardsfolder/serpentine_basilisk.txt | 13 - res/cardsfolder/serpentine_kavu.txt | 10 - res/cardsfolder/serra_advocate.txt | 12 - res/cardsfolder/serra_angel.txt | 21 - res/cardsfolder/serra_ascendant.txt | 12 - res/cardsfolder/serra_avatar.txt | 12 - res/cardsfolder/serra_avenger.txt | 11 - res/cardsfolder/serra_aviary.txt | 11 - res/cardsfolder/serra_inquisitors.txt | 12 - res/cardsfolder/serra_sphinx.txt | 11 - res/cardsfolder/serra_zealot.txt | 10 - res/cardsfolder/serras_blessing.txt | 12 - res/cardsfolder/serras_boon.txt | 13 - res/cardsfolder/serras_embrace.txt | 12 - res/cardsfolder/serras_liturgy.txt | 12 - res/cardsfolder/serras_sanctum.txt | 11 - res/cardsfolder/serrated_arrows.txt | 12 - res/cardsfolder/serrated_biskelion.txt | 11 - res/cardsfolder/serum_raker.txt | 12 - res/cardsfolder/serum_tank.txt | 13 - res/cardsfolder/serum_visions.txt | 10 - res/cardsfolder/servant_of_volrath.txt | 11 - res/cardsfolder/seshiro_the_anointed.txt | 12 - res/cardsfolder/seton_krosan_protector.txt | 10 - res/cardsfolder/setons_desire.txt | 11 - res/cardsfolder/setons_scout.txt | 11 - res/cardsfolder/sever_soul.txt | 12 - res/cardsfolder/severed_legion.txt | 12 - res/cardsfolder/sewer_rats.txt | 10 - res/cardsfolder/sewerdreg.txt | 12 - res/cardsfolder/sewn_eye_drake.txt | 11 - res/cardsfolder/shackles.txt | 11 - res/cardsfolder/shade_of_trokair.txt | 11 - res/cardsfolder/shades_form.txt | 14 - res/cardsfolder/shadow_guildmage.txt | 13 - res/cardsfolder/shadow_lance.txt | 11 - res/cardsfolder/shadow_rider.txt | 10 - res/cardsfolder/shadow_rift.txt | 10 - res/cardsfolder/shadow_sliver.txt | 11 - res/cardsfolder/shadowblood_egg.txt | 11 - res/cardsfolder/shadowblood_ridge.txt | 10 - res/cardsfolder/shadowfeed.txt | 10 - res/cardsfolder/shadowmage_infiltrator.txt | 13 - res/cardsfolder/shadowstorm.txt | 10 - res/cardsfolder/shaleskin_bruiser.txt | 13 - res/cardsfolder/shaleskin_plower.txt | 12 - res/cardsfolder/shambling_remains.txt | 11 - res/cardsfolder/shambling_shell.txt | 11 - res/cardsfolder/shambling_strider.txt | 10 - res/cardsfolder/shanodin_dryads.txt | 17 - res/cardsfolder/shaper_guildmage.txt | 11 - res/cardsfolder/shapeshifter.txt | 11 - res/cardsfolder/shard_convergence.txt | 12 - res/cardsfolder/shard_phoenix.txt | 14 - res/cardsfolder/shard_volley.txt | 9 - res/cardsfolder/sharding_sphinx.txt | 12 - res/cardsfolder/shared_discovery.txt | 9 - res/cardsfolder/shared_triumph.txt | 10 - res/cardsfolder/sharuum_the_hegemon.txt | 12 - res/cardsfolder/shatter.txt | 23 - res/cardsfolder/shattered_angel.txt | 12 - res/cardsfolder/shattered_crypt.txt | 13 - res/cardsfolder/shattered_dreams.txt | 9 - res/cardsfolder/shattering_pulse.txt | 10 - res/cardsfolder/shattering_spree.txt | 10 - res/cardsfolder/shatterskull_giant.txt | 9 - res/cardsfolder/shatterstorm.txt | 13 - res/cardsfolder/shauku_endbringer.txt | 16 - res/cardsfolder/shaukus_minion.txt | 11 - res/cardsfolder/shell_skulkin.txt | 10 - res/cardsfolder/sheltered_valley.txt | 11 - res/cardsfolder/sheltering_prayers.txt | 11 - res/cardsfolder/sheoldred_whispering_one.txt | 14 - res/cardsfolder/shepherd_of_rot.txt | 12 - res/cardsfolder/shepherd_of_the_lost.txt | 12 - res/cardsfolder/shield_mate.txt | 10 - res/cardsfolder/shield_of_duty_and_reason.txt | 10 - res/cardsfolder/shield_of_kaldra.txt | 10 - res/cardsfolder/shield_of_the_ages.txt | 9 - res/cardsfolder/shield_of_the_oversoul.txt | 13 - res/cardsfolder/shield_sphere.txt | 12 - res/cardsfolder/shield_wall.txt | 11 - res/cardsfolder/shielding_plax.txt | 12 - res/cardsfolder/shieldmates_blessing.txt | 9 - res/cardsfolder/shifting_sliver.txt | 10 - res/cardsfolder/shifting_wall.txt | 12 - res/cardsfolder/shimmer_myr.txt | 11 - res/cardsfolder/shimmering_barrier.txt | 12 - res/cardsfolder/shimmering_grotto.txt | 15 - res/cardsfolder/shimmering_wings.txt | 11 - res/cardsfolder/shinen_of_fears_chill.txt | 11 - res/cardsfolder/shinen_of_lifes_roar.txt | 12 - res/cardsfolder/shinen_of_stars_light.txt | 11 - res/cardsfolder/shinka_gatekeeper.txt | 11 - .../shinka_the_bloodsoaked_keep.txt | 10 - res/cardsfolder/shivan_dragon.txt | 21 - res/cardsfolder/shivan_emissary.txt | 12 - res/cardsfolder/shivan_gorge.txt | 10 - res/cardsfolder/shivan_harvest.txt | 9 - res/cardsfolder/shivan_hellkite.txt | 12 - res/cardsfolder/shivan_meteor.txt | 10 - res/cardsfolder/shivan_oasis.txt | 12 - res/cardsfolder/shivan_phoenix.txt | 12 - res/cardsfolder/shivan_raptor.txt | 12 - res/cardsfolder/shivan_reef.txt | 15 - res/cardsfolder/shivan_wurm.txt | 13 - res/cardsfolder/shivan_zombie.txt | 10 - res/cardsfolder/shivs_embrace.txt | 12 - res/cardsfolder/shizo_deaths_storehouse.txt | 10 - res/cardsfolder/shock.txt | 15 - res/cardsfolder/shock_troops.txt | 11 - res/cardsfolder/shore_snapper.txt | 10 - res/cardsfolder/shorecrasher_mimic.txt | 12 - res/cardsfolder/shoreline_raider.txt | 10 - res/cardsfolder/shoreline_ranger.txt | 11 - res/cardsfolder/shoreline_salvager.txt | 11 - res/cardsfolder/show_and_tell.txt | 9 - res/cardsfolder/shower_of_sparks.txt | 10 - res/cardsfolder/shrapnel_blast.txt | 9 - res/cardsfolder/shriek_of_dread.txt | 9 - res/cardsfolder/shriek_raptor.txt | 11 - res/cardsfolder/shriekhorn.txt | 10 - res/cardsfolder/shrieking_drake.txt | 13 - res/cardsfolder/shrieking_mogg.txt | 13 - res/cardsfolder/shrieking_specter.txt | 12 - res/cardsfolder/shriekmaw.txt | 15 - .../shrine_of_boundless_growth.txt | 14 - res/cardsfolder/shrine_of_burning_rage.txt | 13 - res/cardsfolder/shrine_of_limitless_power.txt | 14 - res/cardsfolder/shrine_of_loyal_legions.txt | 13 - res/cardsfolder/shrine_of_piercing_vision.txt | 14 - res/cardsfolder/shrink.txt | 11 - res/cardsfolder/shrivel.txt | 9 - res/cardsfolder/shriveling_rot.txt | 17 - res/cardsfolder/shu_cavalry.txt | 10 - res/cardsfolder/shu_elite_companions.txt | 10 - res/cardsfolder/shu_elite_infantry.txt | 9 - res/cardsfolder/shu_farmer.txt | 10 - res/cardsfolder/shu_foot_soldiers.txt | 9 - res/cardsfolder/shu_general.txt | 11 - res/cardsfolder/shu_grain_caravan.txt | 11 - res/cardsfolder/shu_soldier_farmers.txt | 11 - res/cardsfolder/shuko.txt | 9 - res/cardsfolder/sibilant_spirit.txt | 14 - res/cardsfolder/sick_and_tired.txt | 9 - res/cardsfolder/sicken.txt | 11 - res/cardsfolder/sickening_shoal.txt | 13 - res/cardsfolder/sickle_ripper.txt | 10 - res/cardsfolder/sickleslicer.txt | 10 - res/cardsfolder/sidar_jabari.txt | 12 - res/cardsfolder/sidewinder_sliver.txt | 11 - res/cardsfolder/siege_gang_commander.txt | 13 - res/cardsfolder/siege_mastodon.txt | 10 - res/cardsfolder/siege_of_towers.txt | 10 - res/cardsfolder/sift.txt | 11 - res/cardsfolder/sighted_caste_sorcerer.txt | 11 - res/cardsfolder/sigil_blessing.txt | 10 - res/cardsfolder/sigil_captain.txt | 11 - res/cardsfolder/sigil_of_the_empty_throne.txt | 8 - res/cardsfolder/sigil_of_the_nayan_gods.txt | 14 - res/cardsfolder/sigil_of_the_new_dawn.txt | 10 - res/cardsfolder/sigil_tracer.txt | 11 - res/cardsfolder/sigiled_behemoth.txt | 10 - res/cardsfolder/sigiled_paladin.txt | 11 - res/cardsfolder/sign_in_blood.txt | 10 - res/cardsfolder/signal_pest.txt | 13 - res/cardsfolder/silent_arbiter.txt | 9 - res/cardsfolder/silent_attendant.txt | 10 - res/cardsfolder/silent_chant_zubera.txt | 12 - res/cardsfolder/silent_specter.txt | 13 - res/cardsfolder/silhana_ledgewalker.txt | 11 - res/cardsfolder/silk_net.txt | 9 - res/cardsfolder/silkbind_faerie.txt | 11 - res/cardsfolder/silkenfist_fighter.txt | 11 - res/cardsfolder/silkenfist_order.txt | 11 - res/cardsfolder/silklash_spider.txt | 14 - res/cardsfolder/silkwing_scout.txt | 11 - res/cardsfolder/silt_crawler.txt | 11 - res/cardsfolder/silver_drake.txt | 13 - res/cardsfolder/silver_erne.txt | 11 - res/cardsfolder/silver_knight.txt | 11 - res/cardsfolder/silver_myr.txt | 11 - res/cardsfolder/silver_seraph.txt | 11 - res/cardsfolder/silverback_ape.txt | 9 - res/cardsfolder/silvercoat_lion.txt | 10 - res/cardsfolder/silverglade_elemental.txt | 11 - res/cardsfolder/silverglade_pathfinder.txt | 11 - res/cardsfolder/silverskin_armor.txt | 10 - res/cardsfolder/silverstorm_samurai.txt | 11 - res/cardsfolder/silvos_rogue_elemental.txt | 11 - res/cardsfolder/sima_yi_wei_field_marshal.txt | 10 - res/cardsfolder/simian_grunts.txt | 11 - res/cardsfolder/simian_spirit_guide.txt | 11 - res/cardsfolder/simic_growth_chamber.txt | 13 - res/cardsfolder/simic_ragworm.txt | 10 - res/cardsfolder/simic_signet.txt | 10 - res/cardsfolder/simic_sky_swallower.txt | 13 - res/cardsfolder/simplify.txt | 9 - res/cardsfolder/sinew_sliver.txt | 11 - res/cardsfolder/singe_mind_ogre.txt | 9 - res/cardsfolder/singing_tree.txt | 11 - res/cardsfolder/sinkhole.txt | 11 - res/cardsfolder/sinking_feeling.txt | 12 - res/cardsfolder/sir_shandlar_of_eberyn.txt | 9 - res/cardsfolder/sire_of_the_storm.txt | 13 - res/cardsfolder/sirens_call.txt | 13 - res/cardsfolder/sisays_ring.txt | 11 - res/cardsfolder/sisters_of_the_flame.txt | 11 - res/cardsfolder/sivitri_scarzam.txt | 9 - res/cardsfolder/sizzle.txt | 10 - res/cardsfolder/skarrg_the_rage_pits.txt | 10 - res/cardsfolder/skarrgan_pit_skulk.txt | 11 - res/cardsfolder/skarrgan_skybreaker.txt | 12 - res/cardsfolder/skeletal_changeling.txt | 11 - res/cardsfolder/skeletal_crocodile.txt | 9 - res/cardsfolder/skeletal_kathari.txt | 12 - res/cardsfolder/skeletal_snake.txt | 9 - res/cardsfolder/skeletal_vampire.txt | 14 - res/cardsfolder/skeletal_wurm.txt | 10 - res/cardsfolder/skeleton_ship.txt | 12 - res/cardsfolder/skinrender.txt | 11 - res/cardsfolder/skinthinner.txt | 12 - res/cardsfolder/skinwing.txt | 10 - res/cardsfolder/skirge_familiar.txt | 12 - res/cardsfolder/skirk_fire_marshal.txt | 12 - res/cardsfolder/skirk_marauder.txt | 12 - res/cardsfolder/skirk_outrider.txt | 12 - res/cardsfolder/skirk_prospector.txt | 11 - res/cardsfolder/skirk_ridge_exhumer.txt | 12 - res/cardsfolder/skirk_shaman.txt | 10 - res/cardsfolder/skirk_volcanist.txt | 15 - .../skithiryx_the_blight_dragon.txt | 13 - res/cardsfolder/skitter_of_lizards.txt | 11 - res/cardsfolder/skittering_horror.txt | 12 - res/cardsfolder/skittering_invasion.txt | 10 - res/cardsfolder/skittering_skirge.txt | 13 - res/cardsfolder/skittish_kavu.txt | 12 - res/cardsfolder/skizzik.txt | 16 - res/cardsfolder/skred.txt | 11 - res/cardsfolder/skulking_fugitive.txt | 11 - res/cardsfolder/skulking_ghost.txt | 12 - res/cardsfolder/skulking_knight.txt | 12 - res/cardsfolder/skull_catapult.txt | 12 - res/cardsfolder/skull_collector.txt | 13 - res/cardsfolder/skull_fracture.txt | 10 - res/cardsfolder/skull_of_orm.txt | 10 - res/cardsfolder/skull_of_ramos.txt | 11 - res/cardsfolder/skullclamp.txt | 11 - res/cardsfolder/skullmead_cauldron.txt | 11 - res/cardsfolder/skullmulcher.txt | 10 - res/cardsfolder/skullsnatcher.txt | 13 - res/cardsfolder/skulltap.txt | 10 - res/cardsfolder/sky_diamond.txt | 12 - res/cardsfolder/sky_eel_school.txt | 14 - res/cardsfolder/sky_hussar.txt | 13 - res/cardsfolder/sky_ruin_drake.txt | 10 - res/cardsfolder/sky_spirit.txt | 11 - res/cardsfolder/sky_swallower.txt | 11 - res/cardsfolder/sky_weaver.txt | 12 - res/cardsfolder/skycloud_egg.txt | 11 - res/cardsfolder/skycloud_expanse.txt | 10 - res/cardsfolder/skyhunter_cub.txt | 11 - res/cardsfolder/skyhunter_patrol.txt | 12 - res/cardsfolder/skyhunter_prowler.txt | 13 - res/cardsfolder/skyhunter_skirmisher.txt | 12 - res/cardsfolder/skyknight_legionnaire.txt | 11 - res/cardsfolder/skyreach_manta.txt | 12 - res/cardsfolder/skyrider_trainee.txt | 11 - res/cardsfolder/skyscribing.txt | 12 - res/cardsfolder/skyshaper.txt | 9 - res/cardsfolder/skyshooter.txt | 12 - res/cardsfolder/skyshroud_archer.txt | 10 - res/cardsfolder/skyshroud_behemoth.txt | 11 - res/cardsfolder/skyshroud_claim.txt | 9 - res/cardsfolder/skyshroud_elf.txt | 13 - res/cardsfolder/skyshroud_elite.txt | 10 - res/cardsfolder/skyshroud_falcon.txt | 12 - res/cardsfolder/skyshroud_forest.txt | 14 - res/cardsfolder/skyshroud_poacher.txt | 11 - res/cardsfolder/skyshroud_ridgeback.txt | 10 - res/cardsfolder/skyshroud_sentinel.txt | 11 - res/cardsfolder/skyshroud_troll.txt | 10 - res/cardsfolder/skyshroud_troopers.txt | 10 - res/cardsfolder/skyshroud_vampire.txt | 12 - res/cardsfolder/skyshroud_war_beast.txt | 12 - res/cardsfolder/skyward_eye_prophets.txt | 11 - res/cardsfolder/skywatcher_adept.txt | 13 - res/cardsfolder/skywing_aven.txt | 12 - res/cardsfolder/slag_fiend.txt | 11 - res/cardsfolder/slagstorm.txt | 11 - res/cardsfolder/slagwurm_armor.txt | 9 - res/cardsfolder/slash_panther.txt | 10 - res/cardsfolder/slashing_tiger.txt | 11 - res/cardsfolder/slate_of_ancestry.txt | 12 - res/cardsfolder/slaughter.txt | 12 - res/cardsfolder/slaughter_cry.txt | 9 - res/cardsfolder/slaughterhouse_bouncer.txt | 11 - res/cardsfolder/slave_of_bolas.txt | 10 - res/cardsfolder/slavering_nulls.txt | 12 - res/cardsfolder/slay.txt | 13 - res/cardsfolder/sleeper_agent.txt | 11 - res/cardsfolder/sleepers_guile.txt | 13 - res/cardsfolder/sleepers_robe.txt | 12 - res/cardsfolder/sleeping_potion.txt | 14 - res/cardsfolder/sleight_of_hand.txt | 13 - res/cardsfolder/slice_and_dice.txt | 12 - res/cardsfolder/slice_in_twain.txt | 10 - res/cardsfolder/slingbow_trap.txt | 11 - res/cardsfolder/slingshot_goblin.txt | 11 - res/cardsfolder/slinking_giant.txt | 13 - res/cardsfolder/slinking_serpent.txt | 10 - res/cardsfolder/slinking_skirge.txt | 12 - res/cardsfolder/slippery_bogle.txt | 10 - res/cardsfolder/slippery_karst.txt | 12 - res/cardsfolder/slipstream_eel.txt | 11 - res/cardsfolder/slipstream_serpent.txt | 13 - res/cardsfolder/sliptide_serpent.txt | 11 - res/cardsfolder/slith_ascendant.txt | 12 - res/cardsfolder/slith_bloodletter.txt | 12 - res/cardsfolder/slith_firewalker.txt | 12 - res/cardsfolder/slith_predator.txt | 12 - res/cardsfolder/slith_strider.txt | 13 - res/cardsfolder/slithering_shade.txt | 13 - res/cardsfolder/slithery_stalker.txt | 15 - res/cardsfolder/sliver_legion.txt | 12 - res/cardsfolder/sliver_overlord.txt | 12 - res/cardsfolder/sliver_queen.txt | 11 - res/cardsfolder/sliversmith.txt | 11 - res/cardsfolder/slobad_goblin_tinkerer.txt | 11 - res/cardsfolder/slow_motion.txt | 13 - res/cardsfolder/sludge_strider.txt | 13 - res/cardsfolder/sluggishness.txt | 12 - res/cardsfolder/slumbering_tora.txt | 12 - res/cardsfolder/smallpox.txt | 12 - res/cardsfolder/smash.txt | 12 - res/cardsfolder/smash_to_smithereens.txt | 10 - res/cardsfolder/smite.txt | 11 - res/cardsfolder/smogsteed_rider.txt | 11 - res/cardsfolder/smoke.txt | 14 - res/cardsfolder/smokespew_invoker.txt | 11 - res/cardsfolder/smokestack.txt | 16 - res/cardsfolder/smolder_initiate.txt | 11 - res/cardsfolder/smoldering_butcher.txt | 10 - res/cardsfolder/smoldering_crater.txt | 12 - res/cardsfolder/smoldering_spires.txt | 13 - res/cardsfolder/smother.txt | 10 - res/cardsfolder/snake_basket.txt | 12 - res/cardsfolder/snake_cult_initiation.txt | 10 - res/cardsfolder/snake_pit.txt | 10 - res/cardsfolder/snake_umbra.txt | 13 - res/cardsfolder/snap.txt | 10 - res/cardsfolder/snapback.txt | 10 - res/cardsfolder/snapping_creeper.txt | 11 - res/cardsfolder/snapping_drake.txt | 13 - res/cardsfolder/snapsail_glider.txt | 11 - res/cardsfolder/snarling_undorak.txt | 11 - res/cardsfolder/sneaky_homunculus.txt | 12 - res/cardsfolder/snorting_gahr.txt | 11 - res/cardsfolder/snow_covered_forest.txt | 9 - res/cardsfolder/snow_covered_island.txt | 9 - res/cardsfolder/snow_covered_mountain.txt | 9 - res/cardsfolder/snow_covered_plains.txt | 9 - res/cardsfolder/snow_covered_swamp.txt | 9 - res/cardsfolder/snow_devil.txt | 12 - res/cardsfolder/snow_fortress.txt | 14 - res/cardsfolder/snow_hound.txt | 12 - res/cardsfolder/snuff_out.txt | 10 - res/cardsfolder/soaring_hope.txt | 13 - res/cardsfolder/soaring_seacliff.txt | 13 - res/cardsfolder/soilshaper.txt | 13 - res/cardsfolder/sokenzan_bruiser.txt | 10 - res/cardsfolder/sol_ring.txt | 13 - res/cardsfolder/solar_blast.txt | 12 - res/cardsfolder/solar_tide.txt | 12 - res/cardsfolder/solarion.txt | 12 - res/cardsfolder/soldevi_adnate.txt | 12 - res/cardsfolder/soldevi_digger.txt | 10 - res/cardsfolder/soldevi_excavations.txt | 11 - res/cardsfolder/soldevi_heretic.txt | 11 - res/cardsfolder/soldevi_sage.txt | 13 - res/cardsfolder/soldevi_simulacrum.txt | 11 - res/cardsfolder/soldevi_steam_beast.txt | 12 - res/cardsfolder/soldier_of_fortune.txt | 11 - res/cardsfolder/soldier_replica.txt | 11 - res/cardsfolder/solemn_offering.txt | 11 - res/cardsfolder/solemn_simulacrum.txt | 14 - res/cardsfolder/solidarity.txt | 14 - res/cardsfolder/soliton.txt | 10 - res/cardsfolder/solkanar_the_swamp_king.txt | 13 - res/cardsfolder/soltari_champion.txt | 12 - res/cardsfolder/soltari_crusader.txt | 11 - res/cardsfolder/soltari_emissary.txt | 10 - res/cardsfolder/soltari_foot_soldier.txt | 10 - res/cardsfolder/soltari_lancer.txt | 11 - res/cardsfolder/soltari_monk.txt | 11 - res/cardsfolder/soltari_priest.txt | 12 - res/cardsfolder/soltari_trooper.txt | 12 - res/cardsfolder/somber_hoverguard.txt | 11 - res/cardsfolder/somnomancer.txt | 12 - res/cardsfolder/song_of_serenity.txt | 10 - res/cardsfolder/songs_of_the_damned.txt | 11 - res/cardsfolder/songstitcher.txt | 11 - res/cardsfolder/sonic_burst.txt | 9 - res/cardsfolder/sonic_seizure.txt | 9 - res/cardsfolder/soot_imp.txt | 13 - res/cardsfolder/sootfeather_flock.txt | 11 - res/cardsfolder/soothing_balm.txt | 9 - res/cardsfolder/sootstoke_kindler.txt | 11 - res/cardsfolder/sootwalkers.txt | 10 - res/cardsfolder/soratami_cloudskater.txt | 13 - res/cardsfolder/soratami_mindsweeper.txt | 12 - res/cardsfolder/soratami_mirror_guard.txt | 12 - res/cardsfolder/soratami_mirror_mage.txt | 12 - res/cardsfolder/soratami_rainshaper.txt | 12 - res/cardsfolder/soratami_savant.txt | 11 - res/cardsfolder/sorcerers_strongbox.txt | 11 - res/cardsfolder/sorceress_queen.txt | 12 - res/cardsfolder/sorcerous_sight.txt | 11 - res/cardsfolder/sosuke_son_of_seshiro.txt | 13 - res/cardsfolder/sosukes_summons.txt | 11 - res/cardsfolder/soul_barrier.txt | 11 - res/cardsfolder/soul_bleed.txt | 11 - res/cardsfolder/soul_channeling.txt | 12 - res/cardsfolder/soul_collector.txt | 14 - res/cardsfolder/soul_exchange.txt | 12 - res/cardsfolder/soul_feast.txt | 15 - res/cardsfolder/soul_foundry.txt | 13 - res/cardsfolder/soul_kiss.txt | 12 - res/cardsfolder/soul_link.txt | 14 - res/cardsfolder/soul_manipulation.txt | 13 - res/cardsfolder/soul_net.txt | 17 - res/cardsfolder/soul_of_magma.txt | 13 - res/cardsfolder/soul_parry.txt | 9 - res/cardsfolder/soul_rend.txt | 12 - res/cardsfolder/soul_scourge.txt | 14 - res/cardsfolder/soul_shepherd.txt | 10 - res/cardsfolder/soul_shred.txt | 10 - res/cardsfolder/soul_snuffers.txt | 12 - res/cardsfolder/soul_spike.txt | 11 - res/cardsfolder/soul_stair_expedition.txt | 12 - res/cardsfolder/soul_warden.txt | 14 - res/cardsfolder/soulbound_guardians.txt | 11 - res/cardsfolder/soulcatcher.txt | 12 - res/cardsfolder/soulcatchers_aerie.txt | 13 - res/cardsfolder/souldrinker.txt | 11 - res/cardsfolder/soulless_one.txt | 12 - res/cardsfolder/soulquake.txt | 11 - res/cardsfolder/souls_attendant.txt | 11 - res/cardsfolder/souls_might.txt | 11 - res/cardsfolder/souls_of_the_faultless.txt | 14 - res/cardsfolder/soulscour.txt | 9 - res/cardsfolder/soulsurge_elemental.txt | 11 - res/cardsfolder/soulsworn_jury.txt | 12 - res/cardsfolder/soultether_golem.txt | 13 - res/cardsfolder/sound_the_call.txt | 9 - res/cardsfolder/southern_elephant.txt | 10 - res/cardsfolder/southern_paladin.txt | 12 - res/cardsfolder/sovereigns_of_lost_alara.txt | 11 - res/cardsfolder/sower_of_temptation.txt | 13 - res/cardsfolder/spark_elemental.txt | 13 - res/cardsfolder/spark_spray.txt | 10 - res/cardsfolder/sparkcaster.txt | 14 - res/cardsfolder/sparkmage_apprentice.txt | 12 - res/cardsfolder/sparksmith.txt | 13 - res/cardsfolder/sparkspitter.txt | 11 - res/cardsfolder/sparring_golem.txt | 12 - res/cardsfolder/spawning_breath.txt | 11 - res/cardsfolder/spawning_pit.txt | 11 - res/cardsfolder/spawning_pool.txt | 13 - res/cardsfolder/spawnwrithe.txt | 10 - res/cardsfolder/spearbreaker_behemoth.txt | 11 - res/cardsfolder/specters_shroud.txt | 11 - res/cardsfolder/specters_wail.txt | 9 - res/cardsfolder/spectral_bears.txt | 9 - res/cardsfolder/spectral_cloak.txt | 12 - res/cardsfolder/spectral_force.txt | 11 - res/cardsfolder/spectral_guardian.txt | 11 - res/cardsfolder/spectral_lynx.txt | 11 - res/cardsfolder/spectral_procession.txt | 9 - res/cardsfolder/spectral_searchlight.txt | 14 - res/cardsfolder/spectral_shield.txt | 10 - res/cardsfolder/spectral_sliver.txt | 13 - res/cardsfolder/spell_blast.txt | 17 - res/cardsfolder/spell_burst.txt | 12 - res/cardsfolder/spell_contortion.txt | 13 - res/cardsfolder/spell_pierce.txt | 9 - res/cardsfolder/spell_snare.txt | 9 - res/cardsfolder/spell_snip.txt | 11 - res/cardsfolder/spell_syphon.txt | 11 - res/cardsfolder/spellbane_centaur.txt | 10 - res/cardsfolder/spellbook.txt | 15 - res/cardsfolder/spellbreaker_behemoth.txt | 11 - res/cardsfolder/spellgorger_barbarian.txt | 13 - res/cardsfolder/spellshock.txt | 12 - res/cardsfolder/spellstutter_sprite.txt | 14 - res/cardsfolder/sphere_of_duty.txt | 10 - res/cardsfolder/sphere_of_grace.txt | 10 - res/cardsfolder/sphere_of_law.txt | 10 - res/cardsfolder/sphere_of_purity.txt | 10 - res/cardsfolder/sphere_of_reason.txt | 10 - res/cardsfolder/sphere_of_resistance.txt | 10 - res/cardsfolder/sphere_of_the_suns.txt | 15 - res/cardsfolder/sphere_of_truth.txt | 10 - res/cardsfolder/sphinx_bone_wand.txt | 12 - res/cardsfolder/sphinx_of_jwar_isle.txt | 11 - res/cardsfolder/sphinx_of_lost_truths.txt | 16 - res/cardsfolder/sphinx_of_magosi.txt | 12 - res/cardsfolder/sphinx_of_the_steel_wind.txt | 15 - res/cardsfolder/sphinx_sovereign.txt | 13 - res/cardsfolder/sphinx_summoner.txt | 12 - res/cardsfolder/spider_umbra.txt | 11 - res/cardsfolder/spidersilk_armor.txt | 10 - res/cardsfolder/spidersilk_net.txt | 9 - res/cardsfolder/spiderwig_boggart.txt | 12 - res/cardsfolder/spike_breeder.txt | 12 - res/cardsfolder/spike_colony.txt | 11 - res/cardsfolder/spike_drone.txt | 11 - res/cardsfolder/spike_feeder.txt | 13 - res/cardsfolder/spike_hatcher.txt | 12 - res/cardsfolder/spike_soldier.txt | 12 - res/cardsfolder/spike_tiller.txt | 13 - res/cardsfolder/spike_weaver.txt | 12 - res/cardsfolder/spike_worker.txt | 11 - res/cardsfolder/spikeshot_elder.txt | 11 - res/cardsfolder/spikeshot_goblin.txt | 11 - res/cardsfolder/spiketail_drake.txt | 12 - res/cardsfolder/spiketail_drakeling.txt | 12 - res/cardsfolder/spiketail_hatchling.txt | 14 - res/cardsfolder/spin_into_myth.txt | 10 - res/cardsfolder/spinal_graft.txt | 11 - res/cardsfolder/spinal_villain.txt | 11 - res/cardsfolder/spincrusher.txt | 13 - res/cardsfolder/spindrift_drake.txt | 11 - res/cardsfolder/spine_of_ish_sah.txt | 13 - res/cardsfolder/spined_basher.txt | 10 - res/cardsfolder/spined_fluke.txt | 13 - res/cardsfolder/spined_sliver.txt | 13 - res/cardsfolder/spined_thopter.txt | 10 - res/cardsfolder/spined_wurm.txt | 15 - res/cardsfolder/spineless_thug.txt | 14 - res/cardsfolder/spinneret_sliver.txt | 11 - res/cardsfolder/spiraling_duelist.txt | 11 - res/cardsfolder/spiraling_embers.txt | 10 - res/cardsfolder/spire_barrage.txt | 10 - res/cardsfolder/spire_golem.txt | 11 - res/cardsfolder/spire_monitor.txt | 11 - res/cardsfolder/spire_owl.txt | 13 - res/cardsfolder/spire_serpent.txt | 12 - res/cardsfolder/spirit_cairn.txt | 10 - res/cardsfolder/spirit_en_dal.txt | 11 - res/cardsfolder/spirit_link.txt | 20 - res/cardsfolder/spirit_loop.txt | 15 - res/cardsfolder/spirit_of_resistance.txt | 9 - res/cardsfolder/spirit_of_the_night.txt | 14 - res/cardsfolder/spirit_shackle.txt | 12 - res/cardsfolder/spirit_weaver.txt | 12 - res/cardsfolder/spiritmonger.txt | 10 - res/cardsfolder/spiritual_asylum.txt | 12 - res/cardsfolder/spiritual_guardian.txt | 11 - res/cardsfolder/spitebellows.txt | 14 - res/cardsfolder/spiteflame_witch.txt | 11 - res/cardsfolder/spiteful_bully.txt | 12 - res/cardsfolder/spiteful_visions.txt | 13 - res/cardsfolder/spitemare.txt | 12 - res/cardsfolder/spitfire_handler.txt | 11 - res/cardsfolder/spitting_drake.txt | 12 - res/cardsfolder/spitting_earth.txt | 16 - res/cardsfolder/spitting_gourna.txt | 11 - res/cardsfolder/spitting_hydra.txt | 11 - res/cardsfolder/spitting_image.txt | 10 - res/cardsfolder/spitting_sliver.txt | 11 - res/cardsfolder/spitting_spider.txt | 13 - res/cardsfolder/splinter_twin.txt | 12 - res/cardsfolder/split_tail_miko.txt | 10 - res/cardsfolder/splitting_headache.txt | 11 - res/cardsfolder/spoils_of_victory.txt | 9 - res/cardsfolder/spontaneous_combustion.txt | 9 - res/cardsfolder/spontaneous_generation.txt | 10 - res/cardsfolder/spore_burst.txt | 11 - res/cardsfolder/spore_cloud.txt | 11 - res/cardsfolder/spore_flower.txt | 12 - res/cardsfolder/spore_frog.txt | 10 - res/cardsfolder/sporecap_spider.txt | 10 - res/cardsfolder/sporesower_thallid.txt | 12 - res/cardsfolder/sporoloth_ancient.txt | 13 - res/cardsfolder/spotted_griffin.txt | 10 - res/cardsfolder/spread_the_sickness.txt | 10 - res/cardsfolder/spreading_seas.txt | 11 - res/cardsfolder/spring_cleaning.txt | 11 - res/cardsfolder/spring_of_eternal_peace.txt | 9 - res/cardsfolder/springing_tiger.txt | 10 - res/cardsfolder/springjack_knight.txt | 12 - res/cardsfolder/springjack_shepherd.txt | 12 - res/cardsfolder/springleaf_drum.txt | 14 - res/cardsfolder/sprite_noble.txt | 13 - res/cardsfolder/sprout.txt | 9 - res/cardsfolder/sprout_swarm.txt | 9 - res/cardsfolder/sprouting_phytohydra.txt | 12 - res/cardsfolder/sprouting_thrinax.txt | 11 - res/cardsfolder/sprouting_vines.txt | 10 - res/cardsfolder/spur_grappler.txt | 11 - res/cardsfolder/spurnmage_advocate.txt | 11 - res/cardsfolder/spurred_wolverine.txt | 11 - res/cardsfolder/squadron_hawk.txt | 12 - res/cardsfolder/squall.txt | 11 - res/cardsfolder/squall_drifter.txt | 11 - res/cardsfolder/squall_line.txt | 10 - res/cardsfolder/squallmonger.txt | 11 - res/cardsfolder/squandered_resources.txt | 10 - res/cardsfolder/squeaking_pie_grubfellows.txt | 10 - res/cardsfolder/squee_goblin_nabob.txt | 13 - res/cardsfolder/squees_embrace.txt | 12 - res/cardsfolder/squees_toy.txt | 9 - res/cardsfolder/squeeze.txt | 10 - res/cardsfolder/squelch.txt | 10 - res/cardsfolder/squire.txt | 10 - res/cardsfolder/squirming_mass.txt | 10 - res/cardsfolder/squirrel_mob.txt | 11 - res/cardsfolder/squirrel_nest.txt | 11 - res/cardsfolder/squirrel_wrangler.txt | 12 - res/cardsfolder/stabbing_pain.txt | 10 - res/cardsfolder/stabilizer.txt | 9 - res/cardsfolder/staff_of_domination.txt | 13 - res/cardsfolder/staff_of_the_ages.txt | 9 - res/cardsfolder/staff_of_zegon.txt | 9 - res/cardsfolder/stag_beetle.txt | 11 - res/cardsfolder/stalker_hag.txt | 11 - res/cardsfolder/stalking_assassin.txt | 11 - res/cardsfolder/stalking_bloodsucker.txt | 12 - res/cardsfolder/stalking_stones.txt | 11 - res/cardsfolder/stalking_tiger.txt | 14 - res/cardsfolder/stalking_vengeance.txt | 13 - res/cardsfolder/stalwart_shield_bearers.txt | 11 - res/cardsfolder/stampede.txt | 10 - res/cardsfolder/stampede_driver.txt | 10 - res/cardsfolder/stampeding_rhino.txt | 10 - res/cardsfolder/stampeding_serow.txt | 13 - res/cardsfolder/stampeding_wildebeests.txt | 14 - res/cardsfolder/stand_firm.txt | 10 - res/cardsfolder/standing_stones.txt | 14 - res/cardsfolder/standing_troops.txt | 13 - res/cardsfolder/standstill.txt | 9 - res/cardsfolder/stangg.txt | 9 - res/cardsfolder/star_compass.txt | 12 - res/cardsfolder/starlight.txt | 12 - res/cardsfolder/starlight_invoker.txt | 11 - res/cardsfolder/starlit_angel.txt | 10 - res/cardsfolder/starlit_sanctum.txt | 13 - res/cardsfolder/starstorm.txt | 12 - res/cardsfolder/starved_rusalka.txt | 11 - res/cardsfolder/stasis.txt | 15 - res/cardsfolder/statecraft.txt | 10 - res/cardsfolder/staunch_defenders.txt | 14 - res/cardsfolder/steadfast_guard.txt | 11 - res/cardsfolder/steadfastness.txt | 11 - res/cardsfolder/steady_progress.txt | 10 - res/cardsfolder/steal_artifact.txt | 17 - res/cardsfolder/steam_blast.txt | 9 - res/cardsfolder/steam_catapult.txt | 10 - res/cardsfolder/steam_frigate.txt | 10 - res/cardsfolder/steam_spitter.txt | 11 - res/cardsfolder/steam_vents.txt | 8 - res/cardsfolder/steamclaw.txt | 11 - res/cardsfolder/steel_leaf_paladin.txt | 13 - res/cardsfolder/steel_of_the_godhead.txt | 12 - res/cardsfolder/steel_overseer.txt | 10 - res/cardsfolder/steel_sabotage.txt | 11 - res/cardsfolder/steel_wall.txt | 10 - res/cardsfolder/steelclad_serpent.txt | 11 - res/cardsfolder/steelshaper_apprentice.txt | 10 - res/cardsfolder/steelshapers_gift.txt | 10 - res/cardsfolder/steely_resolve.txt | 9 - res/cardsfolder/stench_of_decay.txt | 10 - res/cardsfolder/stenchskipper.txt | 13 - res/cardsfolder/steppe_lynx.txt | 12 - res/cardsfolder/sterling_grove.txt | 11 - res/cardsfolder/stern_judge.txt | 14 - res/cardsfolder/stern_marshal.txt | 10 - res/cardsfolder/stern_proctor.txt | 12 - res/cardsfolder/steward_of_valeron.txt | 11 - res/cardsfolder/stifle.txt | 9 - res/cardsfolder/still_life.txt | 10 - res/cardsfolder/stillmoon_cavalier.txt | 14 - res/cardsfolder/stinging_barrier.txt | 11 - res/cardsfolder/stingscourger.txt | 12 - res/cardsfolder/stinkdrinker_daredevil.txt | 11 - res/cardsfolder/stinkweed_imp.txt | 13 - res/cardsfolder/stir_the_grave.txt | 11 - res/cardsfolder/stirring_wildwood.txt | 12 - res/cardsfolder/stitch_in_time.txt | 10 - res/cardsfolder/stitch_together.txt | 8 - res/cardsfolder/stoic_angel.txt | 11 - res/cardsfolder/stoic_champion.txt | 12 - res/cardsfolder/stoic_ephemera.txt | 13 - res/cardsfolder/stoic_rebuttal.txt | 10 - res/cardsfolder/stolen_grain.txt | 10 - res/cardsfolder/stomp_and_howl.txt | 10 - res/cardsfolder/stomper_cub.txt | 10 - res/cardsfolder/stomping_ground.txt | 8 - res/cardsfolder/stone_calendar.txt | 9 - res/cardsfolder/stone_catapult.txt | 10 - res/cardsfolder/stone_giant.txt | 18 - res/cardsfolder/stone_golem.txt | 9 - res/cardsfolder/stone_kavu.txt | 11 - res/cardsfolder/stone_rain.txt | 27 - res/cardsfolder/stone_seeder_hierophant.txt | 13 - res/cardsfolder/stone_spirit.txt | 11 - res/cardsfolder/stone_throwing_devils.txt | 10 - res/cardsfolder/stone_tongue_basilisk.txt | 13 - res/cardsfolder/stonebrow_krosan_hero.txt | 12 - res/cardsfolder/stonecloaker.txt | 16 - res/cardsfolder/stoneforge_mystic.txt | 12 - res/cardsfolder/stonehands.txt | 11 - res/cardsfolder/stonewood_invocation.txt | 10 - res/cardsfolder/stonewood_invoker.txt | 10 - res/cardsfolder/stonework_puma.txt | 9 - res/cardsfolder/stonybrook_angler.txt | 11 - res/cardsfolder/stonybrook_banneret.txt | 12 - res/cardsfolder/stonybrook_schoolmaster.txt | 11 - res/cardsfolder/storm_cauldron.txt | 13 - res/cardsfolder/storm_crow.txt | 15 - res/cardsfolder/storm_elemental.txt | 13 - res/cardsfolder/storm_entity.txt | 10 - res/cardsfolder/storm_front.txt | 9 - res/cardsfolder/storm_herd.txt | 10 - res/cardsfolder/storm_seeker.txt | 11 - res/cardsfolder/storm_shaman.txt | 11 - res/cardsfolder/storm_spirit.txt | 11 - res/cardsfolder/storm_world.txt | 15 - res/cardsfolder/stormbind.txt | 11 - res/cardsfolder/stormcallers_boon.txt | 12 - res/cardsfolder/stormcloud_djinn.txt | 13 - res/cardsfolder/stormfront_pegasus.txt | 11 - res/cardsfolder/stormfront_riders.txt | 16 - res/cardsfolder/stormscale_anarch.txt | 12 - res/cardsfolder/stormscape_apprentice.txt | 11 - res/cardsfolder/stormscape_familiar.txt | 12 - res/cardsfolder/stormscape_master.txt | 17 - res/cardsfolder/stormtide_leviathan.txt | 12 - res/cardsfolder/stormwatch_eagle.txt | 12 - res/cardsfolder/strafe.txt | 9 - res/cardsfolder/strands_of_night.txt | 12 - res/cardsfolder/strands_of_undeath.txt | 14 - res/cardsfolder/strandwalker.txt | 10 - res/cardsfolder/strangling_soot.txt | 10 - res/cardsfolder/stratadon.txt | 14 - res/cardsfolder/strategic_planning.txt | 10 - res/cardsfolder/stratozeppelid.txt | 11 - res/cardsfolder/straw_golem.txt | 11 - res/cardsfolder/straw_soldiers.txt | 9 - res/cardsfolder/stream_hopper.txt | 10 - res/cardsfolder/stream_of_acid.txt | 9 - res/cardsfolder/stream_of_life.txt | 20 - res/cardsfolder/stream_of_unconsciousness.txt | 12 - res/cardsfolder/street_wraith.txt | 11 - res/cardsfolder/streetbreaker_wurm.txt | 9 - res/cardsfolder/strength_of_cedars.txt | 10 - res/cardsfolder/strength_of_isolation.txt | 11 - res/cardsfolder/strength_of_lunacy.txt | 11 - res/cardsfolder/strength_of_night.txt | 12 - res/cardsfolder/strength_of_unity.txt | 14 - res/cardsfolder/strider_harness.txt | 9 - res/cardsfolder/strip_mine.txt | 11 - res/cardsfolder/striped_bears.txt | 11 - res/cardsfolder/stroke_of_genius.txt | 11 - res/cardsfolder/stromgald_cabal.txt | 13 - res/cardsfolder/stromgald_crusader.txt | 12 - res/cardsfolder/strongarm_thug.txt | 11 - res/cardsfolder/stronghold_assassin.txt | 12 - res/cardsfolder/stronghold_biologist.txt | 11 - res/cardsfolder/stronghold_discipline.txt | 14 - res/cardsfolder/stronghold_machinist.txt | 11 - res/cardsfolder/stronghold_rats.txt | 13 - res/cardsfolder/stronghold_taskmaster.txt | 11 - res/cardsfolder/stronghold_zeppelin.txt | 11 - res/cardsfolder/student_of_warfare.txt | 14 - res/cardsfolder/stuffy_doll.txt | 11 - res/cardsfolder/stun.txt | 12 - res/cardsfolder/stun_sniper.txt | 11 - res/cardsfolder/stunted_growth.txt | 9 - res/cardsfolder/stupefying_touch.txt | 13 - res/cardsfolder/stupor.txt | 12 - res/cardsfolder/sturdy_hatchling.txt | 15 - res/cardsfolder/su_chi.txt | 11 - res/cardsfolder/subterranean_shambler.txt | 13 - res/cardsfolder/subterranean_spirit.txt | 12 - res/cardsfolder/subversion.txt | 11 - res/cardsfolder/sudden_death.txt | 10 - res/cardsfolder/sudden_impact.txt | 15 - res/cardsfolder/sudden_strength.txt | 10 - res/cardsfolder/suffer_the_past.txt | 9 - res/cardsfolder/suffocating_blast.txt | 10 - res/cardsfolder/suicidal_charge.txt | 10 - res/cardsfolder/suleimans_legacy.txt | 13 - res/cardsfolder/sulfur_elemental.txt | 12 - res/cardsfolder/sulfur_vent.txt | 12 - res/cardsfolder/sulfuric_vapors.txt | 10 - res/cardsfolder/sulfuric_vortex.txt | 13 - res/cardsfolder/sulfurous_blast.txt | 10 - res/cardsfolder/sulfurous_springs.txt | 18 - res/cardsfolder/summer_bloom.txt | 12 - res/cardsfolder/summon_the_school.txt | 11 - res/cardsfolder/summoners_bane.txt | 10 - res/cardsfolder/summoning_station.txt | 12 - res/cardsfolder/sun_ce_young_conquerer.txt | 13 - res/cardsfolder/sun_clasp.txt | 11 - res/cardsfolder/sun_quan_lord_of_wu.txt | 11 - res/cardsfolder/sun_titan.txt | 13 - res/cardsfolder/sunastian_falconer.txt | 11 - res/cardsfolder/sunbeam_spellbomb.txt | 10 - res/cardsfolder/sunblast_angel.txt | 13 - res/cardsfolder/suncrusher.txt | 13 - res/cardsfolder/sunder.txt | 9 - res/cardsfolder/sunder_from_within.txt | 9 - res/cardsfolder/sunfire_balm.txt | 12 - res/cardsfolder/sunflare_shaman.txt | 13 - res/cardsfolder/sunglasses_of_urza.txt | 14 - res/cardsfolder/sungrass_egg.txt | 11 - res/cardsfolder/sungrass_prairie.txt | 10 - res/cardsfolder/sunhome_enforcer.txt | 13 - .../sunhome_fortress_of_the_legion.txt | 10 - res/cardsfolder/sunken_city.txt | 12 - res/cardsfolder/sunken_field.txt | 11 - res/cardsfolder/sunken_hope.txt | 12 - res/cardsfolder/sunken_ruins.txt | 13 - res/cardsfolder/sunlance.txt | 9 - res/cardsfolder/sunpetal_grove.txt | 12 - res/cardsfolder/sunrise_sovereign.txt | 12 - res/cardsfolder/suns_bounty.txt | 10 - res/cardsfolder/sunscape_familiar.txt | 12 - res/cardsfolder/sunscape_master.txt | 11 - res/cardsfolder/sunscour.txt | 11 - res/cardsfolder/sunseed_nurturer.txt | 12 - res/cardsfolder/sunspear_shikari.txt | 11 - res/cardsfolder/sunspring_expedition.txt | 11 - res/cardsfolder/sunstone.txt | 10 - res/cardsfolder/sunstrike_legionnaire.txt | 13 - res/cardsfolder/suntail_hawk.txt | 13 - res/cardsfolder/suntouched_myr.txt | 11 - res/cardsfolder/sunweb.txt | 15 - res/cardsfolder/supreme_exemplar.txt | 12 - res/cardsfolder/supreme_inquisitor.txt | 11 - res/cardsfolder/suqata_assassin.txt | 12 - res/cardsfolder/suqata_firewalker.txt | 11 - res/cardsfolder/suqata_lancer.txt | 12 - res/cardsfolder/surge_node.txt | 11 - res/cardsfolder/surge_of_strength.txt | 11 - res/cardsfolder/surge_of_thoughtweft.txt | 11 - res/cardsfolder/surging_aether.txt | 10 - res/cardsfolder/surging_dementia.txt | 10 - res/cardsfolder/surging_flame.txt | 10 - res/cardsfolder/surging_might.txt | 11 - res/cardsfolder/surging_sentinels.txt | 11 - res/cardsfolder/surrakar_banisher.txt | 12 - res/cardsfolder/surrakar_marauder.txt | 12 - res/cardsfolder/surrakar_spellblade.txt | 14 - res/cardsfolder/surveilling_sprite.txt | 13 - res/cardsfolder/survival_of_the_fittest.txt | 10 - res/cardsfolder/sustainer_of_the_realm.txt | 13 - res/cardsfolder/sustaining_spirit.txt | 11 - res/cardsfolder/sustenance.txt | 10 - res/cardsfolder/suture_priest.txt | 13 - res/cardsfolder/suture_spirit.txt | 11 - res/cardsfolder/sutured_ghoul.txt | 11 - .../svogthos_the_restless_tomb.txt | 13 - res/cardsfolder/svyelunite_priest.txt | 10 - res/cardsfolder/svyelunite_temple.txt | 14 - res/cardsfolder/swallowing_plague.txt | 11 - res/cardsfolder/swamp.txt | 44 - res/cardsfolder/swamp_mosquito.txt | 13 - res/cardsfolder/swans_of_bryn_argoll.txt | 10 - res/cardsfolder/swarm_of_rats.txt | 13 - res/cardsfolder/swarmyard.txt | 10 - res/cardsfolder/swat.txt | 11 - res/cardsfolder/sway_of_the_stars.txt | 14 - res/cardsfolder/swelter.txt | 9 - res/cardsfolder/swift_maneuver.txt | 10 - res/cardsfolder/swirling_sandstorm.txt | 10 - res/cardsfolder/sword_dancer.txt | 11 - res/cardsfolder/sword_of_body_and_mind.txt | 12 - res/cardsfolder/sword_of_feast_and_famine.txt | 12 - res/cardsfolder/sword_of_fire_and_ice.txt | 12 - res/cardsfolder/sword_of_kaldra.txt | 11 - res/cardsfolder/sword_of_light_and_shadow.txt | 13 - res/cardsfolder/sword_of_the_chosen.txt | 10 - res/cardsfolder/sword_of_the_meek.txt | 9 - res/cardsfolder/sword_of_the_paruns.txt | 13 - res/cardsfolder/sword_of_vengeance.txt | 9 - res/cardsfolder/sword_of_war_and_peace.txt | 14 - res/cardsfolder/swords_to_plowshares.txt | 16 - res/cardsfolder/sygg_river_guide.txt | 11 - res/cardsfolder/sylvan_basilisk.txt | 13 - res/cardsfolder/sylvan_bounty.txt | 10 - res/cardsfolder/sylvan_echoes.txt | 11 - res/cardsfolder/sylvan_library.txt | 11 - res/cardsfolder/sylvan_messenger.txt | 13 - res/cardsfolder/sylvan_might.txt | 10 - res/cardsfolder/sylvan_paradise.txt | 11 - res/cardsfolder/sylvan_ranger.txt | 11 - res/cardsfolder/sylvan_safekeeper.txt | 11 - res/cardsfolder/sylvan_scrying.txt | 10 - res/cardsfolder/sylvan_tutor.txt | 9 - res/cardsfolder/sylvok_explorer.txt | 11 - res/cardsfolder/sylvok_lifestaff.txt | 11 - res/cardsfolder/sylvok_replica.txt | 10 - res/cardsfolder/symbiosis.txt | 9 - res/cardsfolder/symbiotic_beast.txt | 11 - res/cardsfolder/symbiotic_deployment.txt | 11 - res/cardsfolder/symbiotic_elf.txt | 11 - res/cardsfolder/symbiotic_wurm.txt | 11 - res/cardsfolder/symbol_of_unsummoning.txt | 10 - res/cardsfolder/synapse_sliver.txt | 11 - res/cardsfolder/synchronous_sliver.txt | 11 - res/cardsfolder/syncopate.txt | 11 - res/cardsfolder/synod_artificer.txt | 15 - res/cardsfolder/synod_sanctum.txt | 11 - res/cardsfolder/syphon_life.txt | 11 - res/cardsfolder/syphon_soul.txt | 12 - res/cardsfolder/szadek_lord_of_secrets.txt | 10 - res/cardsfolder/tablet_of_epityr.txt | 10 - res/cardsfolder/tahngarth_talruum_hero.txt | 14 - res/cardsfolder/tahngarths_rage.txt | 13 - res/cardsfolder/taiga.txt | 11 - res/cardsfolder/tainted_aether.txt | 13 - res/cardsfolder/tainted_field.txt | 11 - res/cardsfolder/tainted_isle.txt | 11 - res/cardsfolder/tainted_peak.txt | 11 - res/cardsfolder/tainted_strike.txt | 9 - res/cardsfolder/tainted_well.txt | 11 - res/cardsfolder/tainted_wood.txt | 11 - res/cardsfolder/taj_nar_swordsmith.txt | 12 - res/cardsfolder/tajuru_archer.txt | 16 - res/cardsfolder/take_possession.txt | 10 - res/cardsfolder/takenos_cavalry.txt | 12 - res/cardsfolder/takenuma_bleeder.txt | 12 - res/cardsfolder/talas_air_ship.txt | 10 - res/cardsfolder/talas_explorer.txt | 12 - res/cardsfolder/talas_merchant.txt | 9 - res/cardsfolder/talas_researcher.txt | 10 - res/cardsfolder/talas_scout.txt | 10 - res/cardsfolder/talas_warrior.txt | 10 - res/cardsfolder/talisman_of_dominance.txt | 13 - res/cardsfolder/talisman_of_impulse.txt | 13 - res/cardsfolder/talisman_of_indulgence.txt | 13 - res/cardsfolder/talisman_of_progress.txt | 13 - res/cardsfolder/talisman_of_unity.txt | 13 - res/cardsfolder/tallowisp.txt | 11 - res/cardsfolder/talon_sliver.txt | 11 - res/cardsfolder/talon_trooper.txt | 10 - res/cardsfolder/talonrend.txt | 11 - res/cardsfolder/talruum_champion.txt | 14 - res/cardsfolder/talruum_minotaur.txt | 11 - res/cardsfolder/talus_paladin.txt | 15 - res/cardsfolder/tamanoa.txt | 12 - res/cardsfolder/tangle_asp.txt | 15 - res/cardsfolder/tangle_golem.txt | 10 - res/cardsfolder/tangle_hulk.txt | 14 - res/cardsfolder/tangle_mantis.txt | 10 - res/cardsfolder/tangle_spider.txt | 12 - res/cardsfolder/tangle_wire.txt | 10 - res/cardsfolder/tanglebloom.txt | 10 - res/cardsfolder/tangleroot.txt | 11 - res/cardsfolder/tanglewalker.txt | 11 - res/cardsfolder/taoist_hermit.txt | 10 - res/cardsfolder/taoist_mystic.txt | 9 - res/cardsfolder/tar_pit_warrior.txt | 11 - res/cardsfolder/tar_pitcher.txt | 11 - res/cardsfolder/tarfire.txt | 9 - res/cardsfolder/tarmogoyf.txt | 9 - res/cardsfolder/tarnished_citadel.txt | 16 - res/cardsfolder/tarox_bladewing.txt | 14 - res/cardsfolder/tarpan.txt | 12 - res/cardsfolder/task_force.txt | 11 - res/cardsfolder/task_mage_assembly.txt | 10 - res/cardsfolder/taste_for_mayhem.txt | 12 - res/cardsfolder/tattered_drake.txt | 11 - res/cardsfolder/tatterkite.txt | 11 - res/cardsfolder/tattermunge_duo.txt | 14 - res/cardsfolder/tattermunge_maniac.txt | 10 - res/cardsfolder/tattermunge_witch.txt | 10 - res/cardsfolder/taunting_challenge.txt | 10 - res/cardsfolder/taunting_elf.txt | 11 - res/cardsfolder/taurean_mauler.txt | 12 - res/cardsfolder/tawnoss_wand.txt | 10 - res/cardsfolder/teardrop_kami.txt | 11 - res/cardsfolder/tears_of_rage.txt | 11 - res/cardsfolder/tectonic_break.txt | 11 - res/cardsfolder/tectonic_edge.txt | 11 - res/cardsfolder/tectonic_fiend.txt | 11 - res/cardsfolder/tectonic_instability.txt | 9 - res/cardsfolder/teekas_dragon.txt | 12 - res/cardsfolder/teetering_peaks.txt | 13 - res/cardsfolder/teferis_puzzle_box.txt | 18 - res/cardsfolder/teferis_response.txt | 10 - res/cardsfolder/tek.txt | 16 - res/cardsfolder/tel_jilad_archers.txt | 11 - res/cardsfolder/tel_jilad_chosen.txt | 10 - res/cardsfolder/tel_jilad_defiance.txt | 10 - res/cardsfolder/tel_jilad_exile.txt | 10 - res/cardsfolder/tel_jilad_fallen.txt | 11 - res/cardsfolder/tel_jilad_justice.txt | 10 - res/cardsfolder/tel_jilad_lifebreather.txt | 10 - res/cardsfolder/tel_jilad_outrider.txt | 10 - res/cardsfolder/tel_jilad_wolf.txt | 11 - res/cardsfolder/telekinetic_bonds.txt | 11 - res/cardsfolder/telekinetic_sliver.txt | 11 - res/cardsfolder/telepathic_spies.txt | 12 - res/cardsfolder/telethopter.txt | 10 - res/cardsfolder/telimtor.txt | 12 - res/cardsfolder/telimtors_darts.txt | 9 - res/cardsfolder/telimtors_edict.txt | 11 - res/cardsfolder/teller_of_tales.txt | 13 - res/cardsfolder/telling_time.txt | 10 - res/cardsfolder/tempered_steel.txt | 10 - res/cardsfolder/tempest_drake.txt | 11 - res/cardsfolder/tempest_of_light.txt | 12 - res/cardsfolder/tempest_owl.txt | 13 - res/cardsfolder/temple_acolyte.txt | 11 - res/cardsfolder/temple_bell.txt | 10 - res/cardsfolder/temple_elder.txt | 10 - res/cardsfolder/temple_garden.txt | 8 - res/cardsfolder/temple_of_the_false_god.txt | 10 - res/cardsfolder/temporal_adept.txt | 13 - res/cardsfolder/temporal_aperture.txt | 9 - res/cardsfolder/temporal_eddy.txt | 9 - res/cardsfolder/temporal_fissure.txt | 10 - res/cardsfolder/temporal_isolation.txt | 11 - res/cardsfolder/temporal_manipulation.txt | 9 - res/cardsfolder/temporal_spring.txt | 9 - res/cardsfolder/temporary_insanity.txt | 10 - res/cardsfolder/tempting_wurm.txt | 12 - res/cardsfolder/tendo_ice_bridge.txt | 15 - res/cardsfolder/tendrils_of_agony.txt | 11 - res/cardsfolder/tendrils_of_corruption.txt | 12 - res/cardsfolder/tendrils_of_despair.txt | 10 - res/cardsfolder/teneb_the_harvester.txt | 12 - res/cardsfolder/tenza_godos_maul.txt | 12 - res/cardsfolder/tephraderm.txt | 14 - res/cardsfolder/terashis_cry.txt | 10 - res/cardsfolder/terashis_grasp.txt | 11 - res/cardsfolder/terashis_verdict.txt | 10 - res/cardsfolder/terminal_moraine.txt | 10 - res/cardsfolder/terminate.txt | 10 - res/cardsfolder/terohs_faithful.txt | 11 - res/cardsfolder/terohs_vanguard.txt | 12 - res/cardsfolder/terra_eternal.txt | 10 - res/cardsfolder/terra_stomper.txt | 11 - res/cardsfolder/terrain_generator.txt | 10 - res/cardsfolder/terramorphic_expanse.txt | 12 - res/cardsfolder/terravore.txt | 12 - res/cardsfolder/territorial_baloth.txt | 12 - res/cardsfolder/terror.txt | 17 - res/cardsfolder/test_of_endurance.txt | 9 - res/cardsfolder/testament_of_faith.txt | 11 - res/cardsfolder/tethered_griffin.txt | 13 - res/cardsfolder/tethered_skirge.txt | 12 - res/cardsfolder/tetsuo_umezawa.txt | 11 - res/cardsfolder/teysa_orzhov_scion.txt | 12 - res/cardsfolder/tezzeret_agent_of_bolas.txt | 15 - res/cardsfolder/tezzeret_the_seeker.txt | 9 - res/cardsfolder/tezzerets_gambit.txt | 10 - res/cardsfolder/thalakos_deceiver.txt | 13 - res/cardsfolder/thalakos_drifters.txt | 10 - res/cardsfolder/thalakos_lowlands.txt | 12 - res/cardsfolder/thalakos_mistfolk.txt | 15 - res/cardsfolder/thalakos_scout.txt | 12 - res/cardsfolder/thalakos_seer.txt | 12 - res/cardsfolder/thalakos_sentry.txt | 10 - res/cardsfolder/thallid.txt | 13 - res/cardsfolder/thallid_devourer.txt | 13 - res/cardsfolder/thallid_germinator.txt | 13 - res/cardsfolder/thallid_shell_dweller.txt | 13 - res/cardsfolder/that_which_was_taken.txt | 9 - res/cardsfolder/thaumatog.txt | 12 - res/cardsfolder/thawing_glaciers.txt | 12 - res/cardsfolder/the_abyss.txt | 9 - res/cardsfolder/the_brute.txt | 13 - res/cardsfolder/the_hive.txt | 16 - res/cardsfolder/the_lady_of_the_mountain.txt | 9 - res/cardsfolder/the_rack.txt | 14 - .../the_tabernacle_at_pendrell_vale.txt | 10 - res/cardsfolder/the_unspeakable.txt | 13 - res/cardsfolder/theft_of_dreams.txt | 13 - res/cardsfolder/thelonite_hermit.txt | 14 - res/cardsfolder/thermal_blast.txt | 10 - res/cardsfolder/thermal_glider.txt | 11 - res/cardsfolder/thermal_navigator.txt | 10 - res/cardsfolder/thermokarst.txt | 10 - res/cardsfolder/thermopod.txt | 13 - res/cardsfolder/thicket_basilisk.txt | 21 - res/cardsfolder/thief_of_hope.txt | 13 - res/cardsfolder/thieving_magpie.txt | 16 - res/cardsfolder/think_tank.txt | 11 - res/cardsfolder/think_twice.txt | 10 - res/cardsfolder/thirst.txt | 11 - res/cardsfolder/thirst_for_knowledge.txt | 10 - res/cardsfolder/thistledown_duo.txt | 14 - res/cardsfolder/thistledown_liege.txt | 13 - res/cardsfolder/thopter_assembly.txt | 13 - res/cardsfolder/thopter_foundry.txt | 11 - res/cardsfolder/thopter_squadron.txt | 13 - res/cardsfolder/thorn_of_amethyst.txt | 10 - res/cardsfolder/thorn_thallid.txt | 12 - res/cardsfolder/thorn_thrash_viashino.txt | 11 - res/cardsfolder/thornling.txt | 14 - res/cardsfolder/thornscape_apprentice.txt | 11 - res/cardsfolder/thornscape_familiar.txt | 10 - res/cardsfolder/thornscape_master.txt | 15 - res/cardsfolder/thorntooth_witch.txt | 12 - res/cardsfolder/thornwatch_scarecrow.txt | 12 - res/cardsfolder/thornweald_archer.txt | 11 - res/cardsfolder/thornwind_faeries.txt | 11 - res/cardsfolder/thought_courier.txt | 12 - res/cardsfolder/thought_devourer.txt | 12 - res/cardsfolder/thought_eater.txt | 12 - res/cardsfolder/thought_nibbler.txt | 12 - res/cardsfolder/thoughtbind.txt | 9 - res/cardsfolder/thoughtcast.txt | 10 - res/cardsfolder/thoughtcutter_agent.txt | 11 - res/cardsfolder/thoughtleech.txt | 12 - res/cardsfolder/thoughtpicker_witch.txt | 11 - res/cardsfolder/thoughtseize.txt | 10 - res/cardsfolder/thoughtweft_gambit.txt | 11 - res/cardsfolder/thousand_legged_kami.txt | 10 - res/cardsfolder/thran_dynamo.txt | 10 - res/cardsfolder/thran_forge.txt | 11 - res/cardsfolder/thran_foundry.txt | 10 - res/cardsfolder/thran_golem.txt | 12 - res/cardsfolder/thran_lens.txt | 10 - res/cardsfolder/thran_quarry.txt | 16 - res/cardsfolder/thran_war_machine.txt | 11 - res/cardsfolder/thrashing_mudspawn.txt | 13 - res/cardsfolder/thrashing_wumpus.txt | 10 - res/cardsfolder/thraximundar.txt | 14 - res/cardsfolder/threads_of_disloyalty.txt | 10 - res/cardsfolder/threaten.txt | 11 - res/cardsfolder/three_tragedies.txt | 9 - res/cardsfolder/three_visits.txt | 9 - res/cardsfolder/thresher_beast.txt | 11 - res/cardsfolder/thrill_of_the_hunt.txt | 10 - res/cardsfolder/thriss_nantuko_primus.txt | 10 - res/cardsfolder/thrive.txt | 14 - res/cardsfolder/throat_slitter.txt | 13 - res/cardsfolder/throne_of_bone.txt | 19 - res/cardsfolder/throne_of_geth.txt | 10 - res/cardsfolder/thrull_champion.txt | 12 - res/cardsfolder/thrull_surgeon.txt | 11 - res/cardsfolder/thrumming_stone.txt | 8 - res/cardsfolder/thrummingbird.txt | 12 - res/cardsfolder/thrun_the_last_troll.txt | 12 - res/cardsfolder/thunder_dragon.txt | 12 - res/cardsfolder/thunder_of_hooves.txt | 11 - res/cardsfolder/thunder_spirit.txt | 11 - res/cardsfolder/thunder_strike.txt | 9 - res/cardsfolder/thunder_thrash_elder.txt | 10 - res/cardsfolder/thunder_wall.txt | 12 - res/cardsfolder/thunderblust.txt | 13 - res/cardsfolder/thunderbolt.txt | 11 - res/cardsfolder/thunderclap.txt | 10 - res/cardsfolder/thundercloud_elemental.txt | 12 - res/cardsfolder/thundercloud_shaman.txt | 14 - res/cardsfolder/thunderheads.txt | 11 - res/cardsfolder/thundering_giant.txt | 11 - res/cardsfolder/thundering_tanadon.txt | 10 - res/cardsfolder/thundermare.txt | 14 - res/cardsfolder/thunderscape_apprentice.txt | 11 - res/cardsfolder/thunderscape_familiar.txt | 11 - res/cardsfolder/thunderscape_master.txt | 13 - res/cardsfolder/thundersong_trumpeter.txt | 10 - res/cardsfolder/thwart.txt | 11 - res/cardsfolder/tibor_and_lumia.txt | 14 - res/cardsfolder/ticking_gnomes.txt | 11 - res/cardsfolder/tidal_bore.txt | 11 - res/cardsfolder/tidal_control.txt | 12 - res/cardsfolder/tidal_courier.txt | 13 - res/cardsfolder/tidal_kraken.txt | 12 - res/cardsfolder/tidal_surge.txt | 13 - res/cardsfolder/tidal_wave.txt | 10 - res/cardsfolder/tideforce_elemental.txt | 12 - res/cardsfolder/tidehollow_sculler.txt | 14 - res/cardsfolder/tidehollow_strix.txt | 11 - res/cardsfolder/tidespout_tyrant.txt | 12 - res/cardsfolder/tidings.txt | 10 - res/cardsfolder/tiger_claws.txt | 11 - res/cardsfolder/tigereye_cameo.txt | 10 - res/cardsfolder/tilling_treefolk.txt | 11 - res/cardsfolder/timber_protector.txt | 13 - res/cardsfolder/timberland_ruins.txt | 15 - res/cardsfolder/timberline_ridge.txt | 14 - res/cardsfolder/timbermare.txt | 13 - res/cardsfolder/timbermaw_larva.txt | 12 - res/cardsfolder/timberwatch_elf.txt | 11 - res/cardsfolder/time_bomb.txt | 11 - res/cardsfolder/time_ebb.txt | 13 - res/cardsfolder/time_elemental.txt | 18 - res/cardsfolder/time_of_heroes.txt | 9 - res/cardsfolder/time_of_need.txt | 10 - res/cardsfolder/time_reversal.txt | 13 - res/cardsfolder/time_sieve.txt | 10 - res/cardsfolder/time_spiral.txt | 14 - res/cardsfolder/time_stretch.txt | 10 - res/cardsfolder/time_vault.txt | 13 - res/cardsfolder/time_walk.txt | 11 - res/cardsfolder/time_warp.txt | 11 - res/cardsfolder/timetwister.txt | 15 - res/cardsfolder/timid_drake.txt | 14 - res/cardsfolder/tin_wing_chimera.txt | 13 - res/cardsfolder/tinder_farm.txt | 12 - res/cardsfolder/tinder_wall.txt | 13 - res/cardsfolder/tine_shrike.txt | 11 - res/cardsfolder/tinker.txt | 10 - res/cardsfolder/tireless_missionaries.txt | 11 - res/cardsfolder/tireless_tribe.txt | 10 - res/cardsfolder/titan_forge.txt | 10 - res/cardsfolder/titanias_boon.txt | 9 - res/cardsfolder/titanias_chosen.txt | 12 - res/cardsfolder/titanias_song.txt | 17 - res/cardsfolder/titanic_bulvox.txt | 11 - res/cardsfolder/titanic_ultimatum.txt | 11 - res/cardsfolder/titanium_golem.txt | 10 - res/cardsfolder/titans_revenge.txt | 13 - res/cardsfolder/tithe.txt | 11 - res/cardsfolder/tivadar_of_thorn.txt | 13 - res/cardsfolder/tivadars_crusade.txt | 10 - res/cardsfolder/to_arms.txt | 10 - res/cardsfolder/tobias_andrion.txt | 9 - res/cardsfolder/toil_to_renown.txt | 10 - res/cardsfolder/toils_of_night_and_day.txt | 11 - res/cardsfolder/tolaria_west.txt | 12 - res/cardsfolder/tolarian_academy.txt | 12 - res/cardsfolder/tolarian_emissary.txt | 13 - res/cardsfolder/tolarian_entrancer.txt | 12 - res/cardsfolder/tolarian_serpent.txt | 11 - res/cardsfolder/tolsimir_wolfblood.txt | 13 - res/cardsfolder/tomb_of_urami.txt | 12 - res/cardsfolder/tome_scour.txt | 10 - res/cardsfolder/tonic_peddler.txt | 10 - res/cardsfolder/tooth_of_chiss_goria.txt | 11 - res/cardsfolder/tooth_of_ramos.txt | 11 - res/cardsfolder/topan_ascetic.txt | 10 - res/cardsfolder/tor_giant.txt | 9 - res/cardsfolder/tor_wauki.txt | 11 - res/cardsfolder/torch_drake.txt | 11 - res/cardsfolder/torch_slinger.txt | 12 - res/cardsfolder/torch_song.txt | 12 - res/cardsfolder/torii_watchward.txt | 11 - res/cardsfolder/torment.txt | 10 - res/cardsfolder/tormented_angel.txt | 10 - res/cardsfolder/tormods_crypt.txt | 11 - res/cardsfolder/torpor_dust.txt | 11 - res/cardsfolder/torrent_of_fire.txt | 10 - res/cardsfolder/torsten_von_ursus.txt | 9 - res/cardsfolder/tortoise_formation.txt | 10 - res/cardsfolder/torture.txt | 14 - res/cardsfolder/tortured_existence.txt | 10 - res/cardsfolder/totem_guide_hartebeest.txt | 11 - res/cardsfolder/totem_speaker.txt | 11 - res/cardsfolder/touch_of_brilliance.txt | 11 - res/cardsfolder/touch_of_darkness.txt | 11 - res/cardsfolder/touch_of_death.txt | 12 - res/cardsfolder/touch_of_invisibility.txt | 10 - res/cardsfolder/touchstone.txt | 10 - res/cardsfolder/tower_drake.txt | 11 - res/cardsfolder/tower_gargoyle.txt | 10 - res/cardsfolder/tower_of_calamities.txt | 9 - res/cardsfolder/tower_of_champions.txt | 9 - res/cardsfolder/tower_of_coireall.txt | 10 - res/cardsfolder/tower_of_eons.txt | 9 - res/cardsfolder/tower_of_fortunes.txt | 9 - res/cardsfolder/tower_of_murmurs.txt | 9 - res/cardsfolder/tower_of_the_magistrate.txt | 10 - res/cardsfolder/towering_baloth.txt | 10 - res/cardsfolder/toxic_iguanar.txt | 11 - res/cardsfolder/toxic_nim.txt | 11 - res/cardsfolder/toxin_sliver.txt | 12 - res/cardsfolder/toymaker.txt | 12 - res/cardsfolder/tracker.txt | 13 - res/cardsfolder/trade_caravan.txt | 13 - res/cardsfolder/trade_routes.txt | 13 - res/cardsfolder/tradewind_rider.txt | 11 - res/cardsfolder/tragic_poet.txt | 11 - res/cardsfolder/trailblazer.txt | 9 - res/cardsfolder/trailblazers_boots.txt | 9 - res/cardsfolder/trained_armodon.txt | 13 - res/cardsfolder/trained_cheetah.txt | 11 - res/cardsfolder/trained_jackal.txt | 9 - res/cardsfolder/trained_orgg.txt | 10 - res/cardsfolder/trained_pronghorn.txt | 10 - res/cardsfolder/training_drone.txt | 12 - res/cardsfolder/training_grounds.txt | 9 - res/cardsfolder/traitorous_instinct.txt | 10 - res/cardsfolder/tranquil_domain.txt | 9 - res/cardsfolder/tranquil_garden.txt | 12 - res/cardsfolder/tranquil_grove.txt | 11 - res/cardsfolder/tranquil_path.txt | 10 - res/cardsfolder/tranquil_thicket.txt | 12 - res/cardsfolder/tranquility.txt | 19 - res/cardsfolder/transcendent_master.txt | 15 - res/cardsfolder/transguild_courier.txt | 14 - res/cardsfolder/transluminant.txt | 9 - res/cardsfolder/transmutation.txt | 10 - res/cardsfolder/trap_digger.txt | 11 - res/cardsfolder/trapjaw_kelpie.txt | 11 - res/cardsfolder/trapmakers_snare.txt | 10 - res/cardsfolder/traproot_kami.txt | 12 - res/cardsfolder/trash_for_treasure.txt | 10 - res/cardsfolder/traumatic_visions.txt | 10 - res/cardsfolder/traumatize.txt | 14 - res/cardsfolder/treacherous_link.txt | 11 - res/cardsfolder/treachery.txt | 12 - res/cardsfolder/treasure_hunter.txt | 13 - res/cardsfolder/treasure_mage.txt | 12 - res/cardsfolder/treasure_trove.txt | 11 - res/cardsfolder/tree_monkey.txt | 11 - res/cardsfolder/tree_of_tales.txt | 9 - res/cardsfolder/treefolk_harbinger.txt | 12 - res/cardsfolder/treefolk_seedlings.txt | 11 - res/cardsfolder/treespring_lorian.txt | 10 - res/cardsfolder/treetop_bracers.txt | 12 - res/cardsfolder/treetop_rangers.txt | 10 - res/cardsfolder/treetop_scout.txt | 10 - res/cardsfolder/treetop_sentinel.txt | 11 - res/cardsfolder/treetop_village.txt | 12 - res/cardsfolder/tremble.txt | 9 - res/cardsfolder/tremor.txt | 15 - res/cardsfolder/trench_wurm.txt | 10 - res/cardsfolder/trenching_steed.txt | 11 - res/cardsfolder/trespassing_souleater.txt | 10 - res/cardsfolder/tresserhorn_sinks.txt | 11 - res/cardsfolder/tresserhorn_skyknight.txt | 11 - res/cardsfolder/treva_the_renewer.txt | 10 - res/cardsfolder/trevas_attendant.txt | 11 - res/cardsfolder/trevas_charm.txt | 13 - res/cardsfolder/trevas_ruins.txt | 12 - res/cardsfolder/triangle_of_war.txt | 9 - res/cardsfolder/tribal_flames.txt | 12 - res/cardsfolder/tribal_forcemage.txt | 10 - res/cardsfolder/tribal_golem.txt | 16 - res/cardsfolder/trickster_mage.txt | 11 - res/cardsfolder/triclopean_sight.txt | 13 - res/cardsfolder/trigon_of_corruption.txt | 13 - res/cardsfolder/trigon_of_infestation.txt | 11 - res/cardsfolder/trigon_of_mending.txt | 11 - res/cardsfolder/trigon_of_rage.txt | 12 - res/cardsfolder/trigon_of_thought.txt | 11 - res/cardsfolder/trinket_mage.txt | 13 - res/cardsfolder/trip_noose.txt | 9 - res/cardsfolder/trip_wire.txt | 10 - res/cardsfolder/triskelavus.txt | 13 - res/cardsfolder/triskelion.txt | 15 - res/cardsfolder/triumph_of_the_hordes.txt | 9 - res/cardsfolder/trokin_high_guard.txt | 9 - res/cardsfolder/troll_ascetic.txt | 12 - res/cardsfolder/troll_horn_cameo.txt | 10 - res/cardsfolder/trolls_of_tel_jilad.txt | 10 - res/cardsfolder/tromp_the_domains.txt | 11 - res/cardsfolder/tropical_island.txt | 11 - res/cardsfolder/tropical_storm.txt | 12 - res/cardsfolder/troublesome_spirit.txt | 13 - res/cardsfolder/true_conviction.txt | 10 - res/cardsfolder/trumpet_blast.txt | 11 - res/cardsfolder/trusted_advisor.txt | 13 - res/cardsfolder/trusty_machete.txt | 9 - res/cardsfolder/trygon_predator.txt | 12 - res/cardsfolder/tsabo_tavoc.txt | 13 - res/cardsfolder/tsunami.txt | 15 - res/cardsfolder/tukatongue_thallid.txt | 11 - res/cardsfolder/tuknir_deathlock.txt | 11 - res/cardsfolder/tuktuk_grunts.txt | 14 - res/cardsfolder/tuktuk_the_explorer.txt | 12 - res/cardsfolder/tumble_magnet.txt | 11 - res/cardsfolder/tundra.txt | 11 - res/cardsfolder/tundra_wolves.txt | 15 - res/cardsfolder/tunnel.txt | 14 - res/cardsfolder/tunneler_wurm.txt | 10 - res/cardsfolder/turn_aside.txt | 9 - res/cardsfolder/turn_the_tide.txt | 10 - res/cardsfolder/turn_to_dust.txt | 11 - res/cardsfolder/turn_to_mist.txt | 12 - res/cardsfolder/turn_to_slag.txt | 9 - res/cardsfolder/turnabout.txt | 9 - res/cardsfolder/turntimber_grove.txt | 12 - res/cardsfolder/turntimber_ranger.txt | 14 - res/cardsfolder/turtleshell_changeling.txt | 12 - res/cardsfolder/twiddle.txt | 16 - res/cardsfolder/twigwalker.txt | 10 - res/cardsfolder/twilight_drover.txt | 12 - res/cardsfolder/twilight_mire.txt | 13 - res/cardsfolder/twinblade_slasher.txt | 11 - res/cardsfolder/twincast.txt | 11 - res/cardsfolder/twisted_abomination.txt | 12 - res/cardsfolder/twisted_experiment.txt | 10 - res/cardsfolder/twisted_image.txt | 11 - res/cardsfolder/twitch.txt | 13 - res/cardsfolder/typhoon.txt | 11 - res/cardsfolder/tyrranax.txt | 10 - res/cardsfolder/uktabi_drake.txt | 14 - res/cardsfolder/uktabi_efreet.txt | 10 - res/cardsfolder/uktabi_faerie.txt | 11 - res/cardsfolder/uktabi_orangutan.txt | 12 - res/cardsfolder/uktabi_wildcats.txt | 14 - res/cardsfolder/ulamog_the_infinite_gyre.txt | 14 - res/cardsfolder/ulamogs_crusher.txt | 11 - res/cardsfolder/umara_raptor.txt | 14 - res/cardsfolder/umbra_stalker.txt | 9 - res/cardsfolder/umbral_mantle.txt | 8 - res/cardsfolder/umezawas_jitte.txt | 14 - res/cardsfolder/unbender_tine.txt | 10 - res/cardsfolder/unburden.txt | 10 - res/cardsfolder/uncle_istvan.txt | 12 - res/cardsfolder/uncontrollable_anger.txt | 12 - res/cardsfolder/undead_gladiator.txt | 11 - res/cardsfolder/undead_leotau.txt | 11 - res/cardsfolder/undead_slayer.txt | 11 - res/cardsfolder/undead_warchief.txt | 14 - res/cardsfolder/undercity_shade.txt | 11 - res/cardsfolder/underground_river.txt | 18 - res/cardsfolder/underground_sea.txt | 11 - res/cardsfolder/undergrowth.txt | 12 - res/cardsfolder/undermine.txt | 10 - res/cardsfolder/undertaker.txt | 11 - res/cardsfolder/undertow.txt | 9 - res/cardsfolder/underworld_dreams.txt | 14 - res/cardsfolder/undiscovered_paradise.txt | 14 - res/cardsfolder/undo.txt | 11 - res/cardsfolder/undying_beast.txt | 12 - res/cardsfolder/undying_rage.txt | 12 - res/cardsfolder/unearth.txt | 10 - res/cardsfolder/unearthly_blizzard.txt | 9 - res/cardsfolder/unfulfilled_desires.txt | 11 - res/cardsfolder/unhinge.txt | 10 - res/cardsfolder/unholy_grotto.txt | 11 - res/cardsfolder/unholy_strength.txt | 21 - res/cardsfolder/unifying_theory.txt | 11 - res/cardsfolder/unlikely_alliance.txt | 10 - res/cardsfolder/unliving_psychopath.txt | 12 - res/cardsfolder/unmake.txt | 9 - res/cardsfolder/unmask.txt | 11 - res/cardsfolder/unnatural_predation.txt | 9 - res/cardsfolder/unnatural_speed.txt | 9 - res/cardsfolder/unnerve.txt | 9 - res/cardsfolder/unquestioned_authority.txt | 12 - res/cardsfolder/unseen_walker.txt | 12 - res/cardsfolder/unspeakable_symbol.txt | 10 - res/cardsfolder/unstable_hulk.txt | 13 - res/cardsfolder/unstable_mutation.txt | 15 - res/cardsfolder/unsummon.txt | 21 - res/cardsfolder/untamed_might.txt | 11 - res/cardsfolder/untamed_wilds.txt | 16 - res/cardsfolder/unwilling_recruit.txt | 12 - res/cardsfolder/unwinding_clock.txt | 10 - res/cardsfolder/unworthy_dead.txt | 10 - res/cardsfolder/unyaro_bee_sting.txt | 9 - res/cardsfolder/unyaro_bees.txt | 12 - res/cardsfolder/unyaro_griffin.txt | 12 - res/cardsfolder/updraft.txt | 11 - res/cardsfolder/upheaval.txt | 9 - res/cardsfolder/uproot.txt | 9 - res/cardsfolder/upwelling.txt | 10 - res/cardsfolder/ur_drago.txt | 11 - res/cardsfolder/ur_golems_eye.txt | 11 - res/cardsfolder/urabrask_the_hidden.txt | 12 - res/cardsfolder/urborg_drake.txt | 11 - res/cardsfolder/urborg_elf.txt | 12 - res/cardsfolder/urborg_emissary.txt | 12 - res/cardsfolder/urborg_justice.txt | 10 - res/cardsfolder/urborg_mindsucker.txt | 10 - res/cardsfolder/urborg_phantom.txt | 11 - res/cardsfolder/urborg_shambler.txt | 11 - res/cardsfolder/urborg_skeleton.txt | 12 - res/cardsfolder/urborg_stalker.txt | 14 - res/cardsfolder/urborg_syphon_mage.txt | 11 - res/cardsfolder/urborg_tomb_of_yawgmoth.txt | 10 - res/cardsfolder/urborg_uprising.txt | 10 - res/cardsfolder/urborg_volcano.txt | 12 - res/cardsfolder/uril_the_miststalker.txt | 14 - res/cardsfolder/ursapine.txt | 10 - res/cardsfolder/urzas_armor.txt | 9 - res/cardsfolder/urzas_blueprints.txt | 10 - res/cardsfolder/urzas_chalice.txt | 11 - res/cardsfolder/urzas_factory.txt | 10 - res/cardsfolder/urzas_guilt.txt | 11 - res/cardsfolder/urzas_mine.txt | 14 - res/cardsfolder/urzas_power_plant.txt | 14 - res/cardsfolder/urzas_rage.txt | 11 - res/cardsfolder/urzas_tower.txt | 14 - res/cardsfolder/uthden_troll.txt | 15 - res/cardsfolder/utopia_mycon.txt | 17 - res/cardsfolder/utopia_tree.txt | 15 - res/cardsfolder/utopia_vow.txt | 16 - res/cardsfolder/utvara_scalper.txt | 11 - res/cardsfolder/uyo_silent_prophet.txt | 12 - res/cardsfolder/vacuumelt.txt | 10 - res/cardsfolder/vaevictis_asmadi.txt | 14 - res/cardsfolder/vagrant_plowbeasts.txt | 10 - res/cardsfolder/valakut_fireboar.txt | 12 - .../valakut_the_molten_pinnacle.txt | 12 - res/cardsfolder/valeron_outlander.txt | 10 - res/cardsfolder/valiant_guard.txt | 9 - res/cardsfolder/valley_rannet.txt | 11 - res/cardsfolder/valor.txt | 11 - res/cardsfolder/valorous_charge.txt | 9 - res/cardsfolder/vampire_aristocrat.txt | 10 - res/cardsfolder/vampire_bats.txt | 14 - res/cardsfolder/vampire_hexmage.txt | 11 - res/cardsfolder/vampire_hounds.txt | 11 - res/cardsfolder/vampire_lacerator.txt | 10 - res/cardsfolder/vampire_nighthawk.txt | 12 - res/cardsfolder/vampire_nocturnus.txt | 14 - res/cardsfolder/vampires_bite.txt | 10 - res/cardsfolder/vampiric_dragon.txt | 12 - res/cardsfolder/vampiric_embrace.txt | 10 - res/cardsfolder/vampiric_feast.txt | 10 - res/cardsfolder/vampiric_link.txt | 13 - res/cardsfolder/vampiric_sliver.txt | 11 - res/cardsfolder/vampiric_spirit.txt | 13 - res/cardsfolder/vampiric_touch.txt | 10 - res/cardsfolder/vampiric_tutor.txt | 11 - res/cardsfolder/vampirism.txt | 16 - res/cardsfolder/vanquish.txt | 10 - res/cardsfolder/vapor_snag.txt | 10 - res/cardsfolder/varchilds_crusader.txt | 11 - res/cardsfolder/vastwood_animist.txt | 13 - res/cardsfolder/vastwood_gorger.txt | 9 - res/cardsfolder/vastwood_zendikon.txt | 12 - res/cardsfolder/vault_of_whispers.txt | 9 - res/cardsfolder/vault_skirge.txt | 11 - res/cardsfolder/vault_skyward.txt | 10 - res/cardsfolder/vec_townships.txt | 13 - res/cardsfolder/vectis_agents.txt | 10 - res/cardsfolder/vectis_silencers.txt | 10 - res/cardsfolder/vector_asp.txt | 10 - res/cardsfolder/vedalken_aethermage.txt | 14 - res/cardsfolder/vedalken_anatomist.txt | 12 - res/cardsfolder/vedalken_archmage.txt | 12 - res/cardsfolder/vedalken_certarch.txt | 10 - res/cardsfolder/vedalken_dismisser.txt | 11 - res/cardsfolder/vedalken_entrancer.txt | 10 - res/cardsfolder/vedalken_ghoul.txt | 11 - res/cardsfolder/vedalken_heretic.txt | 11 - res/cardsfolder/vedalken_infuser.txt | 12 - res/cardsfolder/vedalken_mastermind.txt | 12 - res/cardsfolder/vedalken_orrery.txt | 9 - res/cardsfolder/vedalken_outlander.txt | 10 - res/cardsfolder/vedalken_plotter.txt | 10 - res/cardsfolder/vedalken_shackles.txt | 11 - res/cardsfolder/veil_of_birds.txt | 10 - res/cardsfolder/veiled_apparition.txt | 10 - res/cardsfolder/vein_drinker.txt | 15 - res/cardsfolder/veinfire_borderpost.txt | 12 - res/cardsfolder/veldrane_of_sengir.txt | 10 - res/cardsfolder/veldt.txt | 14 - res/cardsfolder/venarian_gold.txt | 16 - res/cardsfolder/vendetta.txt | 12 - res/cardsfolder/vendilion_clique.txt | 14 - res/cardsfolder/venerable_kumo.txt | 12 - res/cardsfolder/venerable_monk.txt | 18 - res/cardsfolder/venerated_teacher.txt | 12 - res/cardsfolder/vengeance.txt | 13 - res/cardsfolder/vengeful_dead.txt | 12 - res/cardsfolder/vengeful_dreams.txt | 9 - res/cardsfolder/vengeful_firebrand.txt | 12 - res/cardsfolder/vengevine.txt | 10 - res/cardsfolder/venomous_dragonfly.txt | 16 - res/cardsfolder/venomous_vines.txt | 9 - res/cardsfolder/venomspout_brackus.txt | 12 - res/cardsfolder/venser_the_sojourner.txt | 9 - res/cardsfolder/vensers_journal.txt | 12 - res/cardsfolder/vensers_sliver.txt | 10 - res/cardsfolder/vent_sentinel.txt | 12 - res/cardsfolder/verdant_catacombs.txt | 9 - res/cardsfolder/verdant_eidolon.txt | 17 - res/cardsfolder/verdant_field.txt | 11 - res/cardsfolder/verdant_force.txt | 13 - res/cardsfolder/verdant_touch.txt | 11 - res/cardsfolder/verdigris.txt | 9 - res/cardsfolder/verduran_emissary.txt | 12 - res/cardsfolder/verduran_enchantress.txt | 21 - res/cardsfolder/vermiculos.txt | 13 - res/cardsfolder/vernal_bloom.txt | 13 - res/cardsfolder/vernal_equinox.txt | 10 - res/cardsfolder/vertigo_spawn.txt | 13 - res/cardsfolder/vesper_ghoul.txt | 15 - res/cardsfolder/vesuvan_doppelganger.txt | 13 - res/cardsfolder/veteran_armorer.txt | 11 - res/cardsfolder/veteran_armorsmith.txt | 12 - res/cardsfolder/veteran_brawlers.txt | 11 - res/cardsfolder/veteran_cavalier.txt | 11 - res/cardsfolder/veteran_explorer.txt | 11 - res/cardsfolder/veteran_of_the_depths.txt | 11 - res/cardsfolder/veteran_swordsmith.txt | 12 - res/cardsfolder/veterans_reflexes.txt | 10 - res/cardsfolder/vex.txt | 11 - res/cardsfolder/vexing_beetle.txt | 11 - res/cardsfolder/viashino_bladescout.txt | 12 - res/cardsfolder/viashino_cutthroat.txt | 13 - res/cardsfolder/viashino_fangtail.txt | 10 - res/cardsfolder/viashino_grappler.txt | 10 - res/cardsfolder/viashino_heretic.txt | 12 - res/cardsfolder/viashino_outrider.txt | 10 - res/cardsfolder/viashino_sandscout.txt | 14 - res/cardsfolder/viashino_sandstalker.txt | 15 - res/cardsfolder/viashino_skeleton.txt | 11 - res/cardsfolder/viashino_slasher.txt | 10 - res/cardsfolder/viashino_slaughtermaster.txt | 11 - res/cardsfolder/viashino_spearhunter.txt | 10 - res/cardsfolder/viashino_warrior.txt | 10 - res/cardsfolder/viashino_weaponsmith.txt | 11 - res/cardsfolder/viashivan_dragon.txt | 12 - res/cardsfolder/vibrating_sphere.txt | 11 - res/cardsfolder/vicious_hunger.txt | 11 - res/cardsfolder/vicious_kavu.txt | 11 - res/cardsfolder/victorious_destruction.txt | 10 - res/cardsfolder/victorys_herald.txt | 12 - res/cardsfolder/victual_sliver.txt | 12 - res/cardsfolder/vigean_intuition.txt | 11 - res/cardsfolder/vigil_for_the_lost.txt | 12 - res/cardsfolder/vigilance.txt | 10 - res/cardsfolder/vigilant_drake.txt | 12 - res/cardsfolder/vigilant_martyr.txt | 12 - res/cardsfolder/vigilant_sentry.txt | 11 - res/cardsfolder/vile_deacon.txt | 12 - res/cardsfolder/vile_requiem.txt | 12 - res/cardsfolder/village_elder.txt | 10 - res/cardsfolder/villainous_ogre.txt | 12 - res/cardsfolder/vindicate.txt | 9 - res/cardsfolder/vindictive_mob.txt | 13 - res/cardsfolder/vine_dryad.txt | 12 - res/cardsfolder/vine_trellis.txt | 12 - res/cardsfolder/vinelasher_kudzu.txt | 12 - res/cardsfolder/vines_of_vastwood.txt | 10 - res/cardsfolder/vintara_snapper.txt | 11 - res/cardsfolder/violent_outburst.txt | 10 - res/cardsfolder/violent_ultimatum.txt | 9 - res/cardsfolder/violet_pall.txt | 10 - res/cardsfolder/viral_drake.txt | 12 - res/cardsfolder/viridescent_wisps.txt | 11 - res/cardsfolder/viridian_acolyte.txt | 15 - res/cardsfolder/viridian_betrayers.txt | 10 - res/cardsfolder/viridian_claw.txt | 9 - res/cardsfolder/viridian_corrupter.txt | 12 - res/cardsfolder/viridian_emissary.txt | 11 - res/cardsfolder/viridian_harvest.txt | 12 - res/cardsfolder/viridian_joiner.txt | 13 - res/cardsfolder/viridian_longbow.txt | 11 - res/cardsfolder/viridian_lorebearers.txt | 12 - res/cardsfolder/viridian_revel.txt | 11 - res/cardsfolder/viridian_scout.txt | 11 - res/cardsfolder/viridian_shaman.txt | 13 - res/cardsfolder/viridian_zealot.txt | 10 - res/cardsfolder/virtues_ruin.txt | 10 - res/cardsfolder/virtuous_charge.txt | 9 - res/cardsfolder/virulent_sliver.txt | 12 - res/cardsfolder/virulent_wound.txt | 10 - res/cardsfolder/visara_the_dreadful.txt | 11 - res/cardsfolder/viscera_dragger.txt | 11 - res/cardsfolder/viscera_seer.txt | 11 - res/cardsfolder/viscerid_armor.txt | 12 - res/cardsfolder/viscerid_deepwalker.txt | 11 - res/cardsfolder/viscid_lemures.txt | 10 - res/cardsfolder/viseling.txt | 12 - res/cardsfolder/vision_skeins.txt | 9 - res/cardsfolder/visions.txt | 12 - res/cardsfolder/vital_splicer.txt | 12 - res/cardsfolder/vital_surge.txt | 9 - res/cardsfolder/vitality_charm.txt | 12 - res/cardsfolder/vitalize.txt | 11 - res/cardsfolder/vitalizing_cascade.txt | 11 - res/cardsfolder/vitalizing_wind.txt | 9 - res/cardsfolder/vitaspore_thallid.txt | 13 - res/cardsfolder/vithian_renegades.txt | 11 - res/cardsfolder/vithian_stinger.txt | 11 - res/cardsfolder/vitu_ghazi_the_city_tree.txt | 10 - res/cardsfolder/vivid_crag.txt | 16 - res/cardsfolder/vivid_creek.txt | 16 - res/cardsfolder/vivid_grove.txt | 16 - res/cardsfolder/vivid_marsh.txt | 16 - res/cardsfolder/vivid_meadow.txt | 16 - res/cardsfolder/vivify.txt | 11 - res/cardsfolder/vivisection.txt | 10 - res/cardsfolder/vizzerdrix.txt | 11 - res/cardsfolder/vodalian_hypnotist.txt | 10 - res/cardsfolder/vodalian_knights.txt | 14 - res/cardsfolder/vodalian_mage.txt | 10 - res/cardsfolder/vodalian_merchant.txt | 12 - res/cardsfolder/vodalian_serpent.txt | 12 - res/cardsfolder/vodalian_soldiers.txt | 11 - res/cardsfolder/vodalian_zombie.txt | 10 - res/cardsfolder/voice_of_duty.txt | 11 - res/cardsfolder/voice_of_grace.txt | 11 - res/cardsfolder/voice_of_law.txt | 11 - res/cardsfolder/voice_of_reason.txt | 11 - res/cardsfolder/voice_of_the_woods.txt | 11 - res/cardsfolder/voice_of_truth.txt | 11 - res/cardsfolder/voices_from_the_void.txt | 11 - res/cardsfolder/voidmage_prodigy.txt | 13 - res/cardsfolder/voidslime.txt | 9 - res/cardsfolder/volcanic_awakening.txt | 10 - res/cardsfolder/volcanic_dragon.txt | 14 - res/cardsfolder/volcanic_eruption.txt | 18 - res/cardsfolder/volcanic_fallout.txt | 10 - res/cardsfolder/volcanic_geyser.txt | 11 - res/cardsfolder/volcanic_hammer.txt | 14 - res/cardsfolder/volcanic_island.txt | 10 - res/cardsfolder/volcanic_spray.txt | 10 - res/cardsfolder/volcanic_strength.txt | 10 - res/cardsfolder/volcanic_submersion.txt | 10 - res/cardsfolder/volcano_imp.txt | 11 - res/cardsfolder/volition_reins.txt | 11 - res/cardsfolder/volrath_the_fallen.txt | 11 - res/cardsfolder/volraths_dungeon.txt | 8 - res/cardsfolder/volraths_gardens.txt | 10 - res/cardsfolder/volraths_stronghold.txt | 11 - res/cardsfolder/volt_charge.txt | 10 - res/cardsfolder/voltaic_construct.txt | 11 - res/cardsfolder/voltaic_key.txt | 11 - res/cardsfolder/volunteer_militia.txt | 10 - res/cardsfolder/voracious_cobra.txt | 12 - res/cardsfolder/voracious_hatchling.txt | 15 - res/cardsfolder/vorinclex_voice_of_hunger.txt | 14 - res/cardsfolder/vorosh_the_hunter.txt | 12 - res/cardsfolder/vorrac_battlehorns.txt | 9 - res/cardsfolder/votary_of_the_conclave.txt | 10 - res/cardsfolder/voyager_drake.txt | 14 - res/cardsfolder/vug_lizard.txt | 11 - res/cardsfolder/vulshok_battlegear.txt | 9 - res/cardsfolder/vulshok_berserker.txt | 11 - res/cardsfolder/vulshok_gauntlets.txt | 9 - res/cardsfolder/vulshok_heartstoker.txt | 12 - res/cardsfolder/vulshok_morningstar.txt | 10 - res/cardsfolder/vulshok_refugee.txt | 10 - res/cardsfolder/vulshok_replica.txt | 10 - res/cardsfolder/vulshok_sorcerer.txt | 11 - res/cardsfolder/vulturous_zombie.txt | 12 - res/cardsfolder/wail_of_the_nim.txt | 13 - res/cardsfolder/waiting_in_the_weeds.txt | 13 - res/cardsfolder/wake_of_vultures.txt | 11 - res/cardsfolder/wake_thrasher.txt | 11 - res/cardsfolder/wakestone_gargoyle.txt | 12 - res/cardsfolder/waking_nightmare.txt | 9 - res/cardsfolder/walker_of_secret_ways.txt | 12 - res/cardsfolder/walker_of_the_grove.txt | 14 - res/cardsfolder/walking_archive.txt | 18 - res/cardsfolder/walking_atlas.txt | 10 - res/cardsfolder/walking_dead.txt | 10 - res/cardsfolder/walking_desecration.txt | 12 - res/cardsfolder/walking_dream.txt | 11 - res/cardsfolder/walking_wall.txt | 11 - res/cardsfolder/wall_of_air.txt | 20 - res/cardsfolder/wall_of_blood.txt | 11 - res/cardsfolder/wall_of_blossoms.txt | 12 - res/cardsfolder/wall_of_bone.txt | 18 - res/cardsfolder/wall_of_brambles.txt | 16 - res/cardsfolder/wall_of_denial.txt | 12 - res/cardsfolder/wall_of_diffusion.txt | 11 - res/cardsfolder/wall_of_distortion.txt | 11 - res/cardsfolder/wall_of_earth.txt | 10 - res/cardsfolder/wall_of_essence.txt | 13 - res/cardsfolder/wall_of_faith.txt | 11 - res/cardsfolder/wall_of_fire.txt | 20 - res/cardsfolder/wall_of_frost.txt | 13 - res/cardsfolder/wall_of_granite.txt | 10 - res/cardsfolder/wall_of_heat.txt | 10 - res/cardsfolder/wall_of_hope.txt | 13 - res/cardsfolder/wall_of_ice.txt | 14 - res/cardsfolder/wall_of_junk.txt | 13 - res/cardsfolder/wall_of_kelp.txt | 12 - res/cardsfolder/wall_of_lava.txt | 11 - res/cardsfolder/wall_of_light.txt | 11 - res/cardsfolder/wall_of_mulch.txt | 11 - res/cardsfolder/wall_of_omens.txt | 12 - res/cardsfolder/wall_of_opposition.txt | 11 - res/cardsfolder/wall_of_pine_needles.txt | 11 - res/cardsfolder/wall_of_putrid_flesh.txt | 12 - res/cardsfolder/wall_of_razors.txt | 11 - res/cardsfolder/wall_of_resistance.txt | 14 - res/cardsfolder/wall_of_reverence.txt | 11 - res/cardsfolder/wall_of_roots.txt | 13 - res/cardsfolder/wall_of_souls.txt | 13 - res/cardsfolder/wall_of_spears.txt | 15 - res/cardsfolder/wall_of_stone.txt | 16 - res/cardsfolder/wall_of_swords.txt | 21 - res/cardsfolder/wall_of_tanglecord.txt | 11 - res/cardsfolder/wall_of_tears.txt | 13 - res/cardsfolder/wall_of_tombstones.txt | 13 - res/cardsfolder/wall_of_vines.txt | 11 - res/cardsfolder/wall_of_water.txt | 15 - res/cardsfolder/wall_of_wonder.txt | 12 - res/cardsfolder/wall_of_wood.txt | 15 - res/cardsfolder/wallop.txt | 10 - res/cardsfolder/wand_of_the_elements.txt | 11 - res/cardsfolder/wanderbrine_rootcutters.txt | 10 - res/cardsfolder/wanderers_twig.txt | 9 - res/cardsfolder/wanderguard_sentry.txt | 12 - res/cardsfolder/wandering_goblins.txt | 13 - res/cardsfolder/wandering_graybeard.txt | 10 - res/cardsfolder/wandering_ones.txt | 9 - res/cardsfolder/wandering_stream.txt | 11 - res/cardsfolder/wanderlust.txt | 16 - res/cardsfolder/wanderwine_hub.txt | 10 - res/cardsfolder/wanderwine_prophets.txt | 13 - res/cardsfolder/waning_wurm.txt | 10 - res/cardsfolder/war_chariot.txt | 9 - res/cardsfolder/war_dance.txt | 12 - res/cardsfolder/war_mammoth.txt | 15 - res/cardsfolder/war_priest_of_thune.txt | 11 - res/cardsfolder/war_report.txt | 11 - res/cardsfolder/war_spike_changeling.txt | 11 - res/cardsfolder/war_torch_goblin.txt | 11 - res/cardsfolder/warbreak_trumpeter.txt | 14 - res/cardsfolder/wargate.txt | 11 - res/cardsfolder/warlords_axe.txt | 9 - res/cardsfolder/warmonger.txt | 11 - res/cardsfolder/warmongers_chariot.txt | 10 - res/cardsfolder/warmth.txt | 12 - res/cardsfolder/warning.txt | 10 - res/cardsfolder/warp_artifact.txt | 16 - res/cardsfolder/warpath.txt | 9 - res/cardsfolder/warpath_ghoul.txt | 9 - res/cardsfolder/warped_devotion.txt | 12 - res/cardsfolder/warped_researcher.txt | 11 - res/cardsfolder/warren_instigator.txt | 12 - res/cardsfolder/warren_scourge_elf.txt | 10 - res/cardsfolder/warrior_angel.txt | 13 - res/cardsfolder/warriors_charge.txt | 9 - res/cardsfolder/warriors_honor.txt | 12 - res/cardsfolder/warthog.txt | 11 - res/cardsfolder/wasp_lancer.txt | 10 - res/cardsfolder/waste_away.txt | 9 - res/cardsfolder/wasteland.txt | 10 - res/cardsfolder/watcher_sliver.txt | 11 - res/cardsfolder/watchwing_scarecrow.txt | 12 - res/cardsfolder/watchwolf.txt | 9 - res/cardsfolder/water_elemental.txt | 14 - res/cardsfolder/water_servant.txt | 11 - res/cardsfolder/water_wurm.txt | 10 - res/cardsfolder/waterfront_bouncer.txt | 11 - res/cardsfolder/waterspout_elemental.txt | 15 - res/cardsfolder/waterspout_weavers.txt | 10 - res/cardsfolder/waterveil_cavern.txt | 12 - res/cardsfolder/watery_grave.txt | 8 - res/cardsfolder/wave_elemental.txt | 11 - res/cardsfolder/wave_of_indifference.txt | 13 - res/cardsfolder/wave_of_terror.txt | 13 - res/cardsfolder/waveskimmer_aven.txt | 11 - res/cardsfolder/wayfarers_bauble.txt | 9 - res/cardsfolder/wayfaring_giant.txt | 13 - res/cardsfolder/waylay.txt | 10 - res/cardsfolder/wayward_soul.txt | 11 - res/cardsfolder/weakness.txt | 16 - res/cardsfolder/weakstone.txt | 10 - res/cardsfolder/weathered_wayfarer.txt | 12 - res/cardsfolder/weatherseed_elf.txt | 10 - res/cardsfolder/weatherseed_faeries.txt | 11 - res/cardsfolder/weatherseed_treefolk.txt | 12 - res/cardsfolder/web.txt | 15 - res/cardsfolder/wee_dragonauts.txt | 13 - res/cardsfolder/weed_pruner_poplar.txt | 11 - res/cardsfolder/wei_ambush_force.txt | 11 - res/cardsfolder/wei_elite_companions.txt | 10 - res/cardsfolder/wei_infantry.txt | 9 - res/cardsfolder/wei_night_raiders.txt | 12 - res/cardsfolder/wei_scout.txt | 10 - res/cardsfolder/wei_strike_force.txt | 10 - res/cardsfolder/weirding_shaman.txt | 10 - res/cardsfolder/welding_jar.txt | 9 - res/cardsfolder/welkin_guide.txt | 12 - res/cardsfolder/welkin_hawk.txt | 12 - res/cardsfolder/welkin_tern.txt | 11 - res/cardsfolder/well_laid_plans.txt | 9 - res/cardsfolder/well_of_discovery.txt | 11 - res/cardsfolder/well_of_life.txt | 11 - res/cardsfolder/wellspring.txt | 14 - res/cardsfolder/wellwisher.txt | 12 - res/cardsfolder/werebear.txt | 11 - res/cardsfolder/western_paladin.txt | 13 - res/cardsfolder/whalebone_glider.txt | 9 - res/cardsfolder/wheel_and_deal.txt | 11 - res/cardsfolder/wheel_of_fortune.txt | 14 - res/cardsfolder/wheel_of_torture.txt | 11 - res/cardsfolder/where_ancients_tread.txt | 10 - res/cardsfolder/whetstone.txt | 9 - res/cardsfolder/whetwheel.txt | 12 - res/cardsfolder/whimwader.txt | 10 - res/cardsfolder/whip_sergeant.txt | 11 - res/cardsfolder/whip_silk.txt | 11 - res/cardsfolder/whip_spine_drake.txt | 11 - res/cardsfolder/whipcorder.txt | 11 - res/cardsfolder/whipflare.txt | 9 - res/cardsfolder/whipstitched_zombie.txt | 10 - res/cardsfolder/whiptail_moloch.txt | 12 - res/cardsfolder/whiptail_wurm.txt | 10 - res/cardsfolder/whiptongue_frog.txt | 10 - res/cardsfolder/whirling_catapult.txt | 9 - res/cardsfolder/whirling_dervish.txt | 13 - res/cardsfolder/whirlpool_drake.txt | 10 - res/cardsfolder/whirlpool_rider.txt | 9 - res/cardsfolder/whirlwind.txt | 10 - res/cardsfolder/whispering_shade.txt | 11 - res/cardsfolder/whispering_specter.txt | 15 - res/cardsfolder/whispers_of_the_muse.txt | 12 - res/cardsfolder/whispersilk_cloak.txt | 12 - res/cardsfolder/white_knight.txt | 19 - res/cardsfolder/white_mana_battery.txt | 11 - res/cardsfolder/white_scarab.txt | 12 - res/cardsfolder/white_shield_crusader.txt | 12 - res/cardsfolder/white_suns_zenith.txt | 12 - res/cardsfolder/white_ward.txt | 15 - res/cardsfolder/whitemane_lion.txt | 13 - res/cardsfolder/whitesuns_passage.txt | 9 - res/cardsfolder/wicked_pact.txt | 11 - res/cardsfolder/wicked_reward.txt | 10 - res/cardsfolder/wicker_warcrawler.txt | 13 - res/cardsfolder/wickerbough_elder.txt | 11 - res/cardsfolder/wielding_the_green_dragon.txt | 9 - res/cardsfolder/wild_aesthir.txt | 12 - res/cardsfolder/wild_cantor.txt | 14 - res/cardsfolder/wild_colos.txt | 10 - res/cardsfolder/wild_elephant.txt | 10 - res/cardsfolder/wild_griffin.txt | 13 - res/cardsfolder/wild_growth.txt | 20 - res/cardsfolder/wild_jhovall.txt | 9 - res/cardsfolder/wild_leotau.txt | 10 - res/cardsfolder/wild_mongrel.txt | 9 - res/cardsfolder/wild_nacatl.txt | 11 - res/cardsfolder/wild_ox.txt | 11 - res/cardsfolder/wild_research.txt | 11 - res/cardsfolder/wild_wurm.txt | 12 - res/cardsfolder/wilderness_elemental.txt | 11 - res/cardsfolder/wilderness_hypnotist.txt | 11 - res/cardsfolder/wildfield_borderpost.txt | 12 - res/cardsfolder/wildfire.txt | 14 - res/cardsfolder/wildfire_emissary.txt | 12 - res/cardsfolder/wildheart_invoker.txt | 10 - res/cardsfolder/wildsize.txt | 10 - res/cardsfolder/wildslayer_elves.txt | 10 - res/cardsfolder/will_o_the_wisp.txt | 16 - res/cardsfolder/willow_dryad.txt | 10 - res/cardsfolder/willow_elf.txt | 10 - res/cardsfolder/willow_faerie.txt | 10 - res/cardsfolder/willow_priestess.txt | 11 - res/cardsfolder/willow_satyr.txt | 11 - res/cardsfolder/wilt_leaf_cavaliers.txt | 10 - res/cardsfolder/wilt_leaf_liege.txt | 13 - res/cardsfolder/wind_dancer.txt | 12 - res/cardsfolder/wind_drake.txt | 17 - res/cardsfolder/wind_sail.txt | 10 - res/cardsfolder/wind_shear.txt | 10 - res/cardsfolder/wind_zendikon.txt | 12 - res/cardsfolder/windborn_muse.txt | 11 - res/cardsfolder/windborne_charge.txt | 9 - res/cardsfolder/windbrisk_raptor.txt | 12 - res/cardsfolder/windfall.txt | 8 - res/cardsfolder/winding_wurm.txt | 10 - res/cardsfolder/windreaper_falcon.txt | 11 - res/cardsfolder/windreaver.txt | 15 - res/cardsfolder/windrider_eel.txt | 13 - res/cardsfolder/winds_of_change.txt | 11 - res/cardsfolder/winds_of_rath.txt | 9 - res/cardsfolder/windscouter.txt | 14 - res/cardsfolder/windseeker_centaur.txt | 10 - res/cardsfolder/windstorm.txt | 11 - res/cardsfolder/windswept_heath.txt | 9 - res/cardsfolder/windwright_mage.txt | 11 - res/cardsfolder/wing_puncture.txt | 9 - res/cardsfolder/wing_shards.txt | 10 - res/cardsfolder/wing_snare.txt | 11 - res/cardsfolder/wing_splicer.txt | 12 - res/cardsfolder/wing_storm.txt | 13 - res/cardsfolder/wingbeat_warrior.txt | 13 - res/cardsfolder/winged_coatl.txt | 12 - res/cardsfolder/winged_sliver.txt | 11 - res/cardsfolder/wingrattle_scarecrow.txt | 12 - res/cardsfolder/wings_of_aesthir.txt | 10 - res/cardsfolder/wings_of_hope.txt | 10 - res/cardsfolder/wings_of_velis_vel.txt | 11 - res/cardsfolder/winnower_patrol.txt | 10 - res/cardsfolder/winter_orb.txt | 14 - res/cardsfolder/winter_sky.txt | 12 - res/cardsfolder/wintermoon_mesa.txt | 11 - res/cardsfolder/winters_grasp.txt | 10 - res/cardsfolder/winters_night.txt | 13 - res/cardsfolder/wipe_away.txt | 10 - res/cardsfolder/wipe_clean.txt | 10 - res/cardsfolder/wirecat.txt | 10 - res/cardsfolder/wirefly_hive.txt | 11 - res/cardsfolder/wirewood_channeler.txt | 17 - res/cardsfolder/wirewood_elf.txt | 10 - res/cardsfolder/wirewood_guardian.txt | 10 - res/cardsfolder/wirewood_herald.txt | 11 - res/cardsfolder/wirewood_hivemaster.txt | 11 - res/cardsfolder/wirewood_lodge.txt | 11 - res/cardsfolder/wirewood_pride.txt | 10 - res/cardsfolder/wirewood_savage.txt | 11 - res/cardsfolder/wirewood_symbiote.txt | 11 - res/cardsfolder/wispmare.txt | 15 - res/cardsfolder/wistful_selkie.txt | 11 - res/cardsfolder/wistful_thinking.txt | 12 - res/cardsfolder/witch_hunter.txt | 12 - res/cardsfolder/witch_maw_nephilim.txt | 12 - res/cardsfolder/witchs_mist.txt | 9 - res/cardsfolder/withered_wretch.txt | 11 - res/cardsfolder/withering_boon.txt | 9 - res/cardsfolder/withering_gaze.txt | 14 - res/cardsfolder/withering_hex.txt | 14 - res/cardsfolder/withstand.txt | 10 - res/cardsfolder/withstand_death.txt | 9 - res/cardsfolder/wits_end.txt | 9 - res/cardsfolder/wizard_mentor.txt | 12 - res/cardsfolder/wizard_replica.txt | 12 - res/cardsfolder/wizards_school.txt | 14 - res/cardsfolder/wizened_cenn.txt | 12 - res/cardsfolder/woebearer.txt | 12 - res/cardsfolder/wojek_embermage.txt | 9 - res/cardsfolder/wolf_skull_shaman.txt | 10 - res/cardsfolder/wolfbriar_elemental.txt | 13 - res/cardsfolder/wolverine_pack.txt | 11 - res/cardsfolder/wonder.txt | 10 - res/cardsfolder/wood_elves.txt | 16 - res/cardsfolder/woodcloaker.txt | 13 - res/cardsfolder/wooded_bastion.txt | 13 - res/cardsfolder/wooded_foothills.txt | 9 - res/cardsfolder/wooden_sphere.txt | 19 - res/cardsfolder/woodfall_primus.txt | 13 - res/cardsfolder/woodland_changeling.txt | 10 - res/cardsfolder/woodland_druid.txt | 9 - res/cardsfolder/woodland_guidance.txt | 11 - res/cardsfolder/woodlurker_mimic.txt | 12 - res/cardsfolder/woodripper.txt | 11 - res/cardsfolder/woodwraith_corrupter.txt | 11 - res/cardsfolder/woodwraith_strangler.txt | 11 - res/cardsfolder/woolly_mammoths.txt | 12 - res/cardsfolder/woolly_spider.txt | 12 - res/cardsfolder/woolly_thoctar.txt | 9 - res/cardsfolder/word_of_binding.txt | 14 - res/cardsfolder/word_of_blasting.txt | 14 - res/cardsfolder/word_of_seizing.txt | 10 - res/cardsfolder/words_of_wisdom.txt | 10 - res/cardsfolder/workhorse.txt | 11 - res/cardsfolder/worldgorger_dragon.txt | 15 - res/cardsfolder/worldly_counsel.txt | 12 - res/cardsfolder/worldly_tutor.txt | 10 - res/cardsfolder/worldslayer.txt | 12 - res/cardsfolder/worm_harvest.txt | 11 - res/cardsfolder/wormfang_behemoth.txt | 13 - res/cardsfolder/wormfang_drake.txt | 11 - res/cardsfolder/wormfang_manta.txt | 15 - res/cardsfolder/wormfang_newt.txt | 13 - res/cardsfolder/wormfang_turtle.txt | 13 - res/cardsfolder/wormwood_dryad.txt | 12 - res/cardsfolder/wormwood_treefolk.txt | 12 - res/cardsfolder/worn_powerstone.txt | 11 - res/cardsfolder/worry_beads.txt | 10 - res/cardsfolder/worship.txt | 12 - res/cardsfolder/wort_boggart_auntie.txt | 12 - res/cardsfolder/wrap_in_flames.txt | 10 - res/cardsfolder/wrap_in_vigor.txt | 9 - res/cardsfolder/wrath_of_god.txt | 20 - res/cardsfolder/wrath_of_marit_lage.txt | 13 - res/cardsfolder/wreak_havoc.txt | 10 - res/cardsfolder/wrecking_ball.txt | 9 - res/cardsfolder/wrench_mind.txt | 9 - res/cardsfolder/wrens_run_packmaster.txt | 13 - res/cardsfolder/wretched_anurid.txt | 12 - res/cardsfolder/wu_admiral.txt | 10 - res/cardsfolder/wu_elite_cavalry.txt | 10 - res/cardsfolder/wu_infantry.txt | 9 - res/cardsfolder/wu_light_cavalry.txt | 10 - res/cardsfolder/wu_longbowman.txt | 10 - res/cardsfolder/wu_scout.txt | 12 - res/cardsfolder/wu_spy.txt | 12 - res/cardsfolder/wu_warship.txt | 10 - res/cardsfolder/wurmcoil_engine.txt | 14 - res/cardsfolder/wurms_tooth.txt | 15 - res/cardsfolder/wurmskin_forger.txt | 13 - res/cardsfolder/wydwen_the_biting_gale.txt | 12 - res/cardsfolder/wyluli_wolf.txt | 12 - res/cardsfolder/xanthic_statue.txt | 9 - res/cardsfolder/xenograft.txt | 11 - res/cardsfolder/xiahou_dun_the_one_eyed.txt | 11 - res/cardsfolder/xira_arien.txt | 11 - res/cardsfolder/xun_yu_wei_advisor.txt | 10 - res/cardsfolder/yamabushis_flame.txt | 10 - res/cardsfolder/yavimaya_ancients.txt | 10 - res/cardsfolder/yavimaya_ants.txt | 12 - res/cardsfolder/yavimaya_barbarian.txt | 10 - res/cardsfolder/yavimaya_coast.txt | 15 - res/cardsfolder/yavimaya_elder.txt | 12 - res/cardsfolder/yavimaya_enchantress.txt | 16 - res/cardsfolder/yavimaya_gnats.txt | 11 - res/cardsfolder/yavimaya_granger.txt | 12 - res/cardsfolder/yavimaya_hollow.txt | 10 - res/cardsfolder/yavimaya_kavu.txt | 11 - res/cardsfolder/yavimaya_scion.txt | 10 - res/cardsfolder/yavimaya_wurm.txt | 11 - res/cardsfolder/yavimayas_embrace.txt | 11 - res/cardsfolder/yawgmoth_demon.txt | 13 - res/cardsfolder/yawgmoths_bargain.txt | 10 - res/cardsfolder/yawgmoths_edict.txt | 13 - res/cardsfolder/yawning_fissure.txt | 9 - res/cardsfolder/yellow_scarves_cavalry.txt | 11 - res/cardsfolder/yellow_scarves_general.txt | 11 - res/cardsfolder/yellow_scarves_troops.txt | 10 - res/cardsfolder/yoke_of_the_damned.txt | 11 - res/cardsfolder/yoked_plowbeast.txt | 10 - res/cardsfolder/yomiji_who_bars_the_way.txt | 11 - res/cardsfolder/yore_tiller_nephilim.txt | 11 - res/cardsfolder/yosei_the_morning_star.txt | 11 - res/cardsfolder/yotian_soldier.txt | 12 - res/cardsfolder/young_wei_recruits.txt | 10 - res/cardsfolder/youthful_knight.txt | 11 - res/cardsfolder/yuan_shao_the_indecisive.txt | 11 - res/cardsfolder/yuan_shaos_infantry.txt | 11 - res/cardsfolder/yuki_onna.txt | 13 - res/cardsfolder/zap.txt | 10 - res/cardsfolder/zealots_en_dal.txt | 12 - res/cardsfolder/zealous_guardian.txt | 10 - res/cardsfolder/zealous_persecution.txt | 10 - res/cardsfolder/zebra_unicorn.txt | 12 - res/cardsfolder/zektar_shrine_expedition.txt | 11 - res/cardsfolder/zendikar_farguide.txt | 10 - res/cardsfolder/zephid.txt | 11 - res/cardsfolder/zephids_embrace.txt | 10 - res/cardsfolder/zephyr_falcon.txt | 13 - res/cardsfolder/zephyr_net.txt | 10 - res/cardsfolder/zephyr_spirit.txt | 11 - res/cardsfolder/zephyr_sprite.txt | 10 - res/cardsfolder/zhalfirin_commander.txt | 13 - res/cardsfolder/zhalfirin_knight.txt | 11 - res/cardsfolder/zhang_fei_fierce_warrior.txt | 11 - res/cardsfolder/zhang_he_wei_general.txt | 12 - res/cardsfolder/zhang_liao_hero_of_hefei.txt | 11 - res/cardsfolder/zhao_zilong_tiger_general.txt | 12 - res/cardsfolder/zhou_yu_chief_commander.txt | 10 - res/cardsfolder/zhuge_jin_wu_strategist.txt | 10 - res/cardsfolder/zirilan_of_the_claw.txt | 14 - res/cardsfolder/zo_zu_the_punisher.txt | 12 - res/cardsfolder/zodiac_dog.txt | 10 - res/cardsfolder/zodiac_dragon.txt | 11 - res/cardsfolder/zodiac_goat.txt | 10 - res/cardsfolder/zodiac_horse.txt | 10 - res/cardsfolder/zodiac_monkey.txt | 11 - res/cardsfolder/zodiac_ox.txt | 10 - res/cardsfolder/zodiac_pig.txt | 10 - res/cardsfolder/zodiac_rabbit.txt | 10 - res/cardsfolder/zodiac_rat.txt | 10 - res/cardsfolder/zodiac_rooster.txt | 10 - res/cardsfolder/zodiac_snake.txt | 10 - res/cardsfolder/zodiac_tiger.txt | 10 - res/cardsfolder/zoetic_cavern.txt | 10 - res/cardsfolder/zof_shade.txt | 10 - res/cardsfolder/zombie_cannibal.txt | 11 - res/cardsfolder/zombie_cutthroat.txt | 10 - res/cardsfolder/zombie_goliath.txt | 9 - res/cardsfolder/zombie_infestation.txt | 10 - res/cardsfolder/zombie_master.txt | 19 - res/cardsfolder/zombie_mob.txt | 13 - res/cardsfolder/zombie_musher.txt | 13 - res/cardsfolder/zombie_outlander.txt | 10 - res/cardsfolder/zombie_trailblazer.txt | 12 - res/cardsfolder/zombify.txt | 11 - res/cardsfolder/zoologist.txt | 10 - res/cardsfolder/zuberi_golden_feather.txt | 12 - res/cardsfolder/zulaport_enforcer.txt | 13 - res/cardsfolder/zuo_ci_the_mocking_sage.txt | 11 - res/cardsfolder/zur_the_enchanter.txt | 10 - res/cardsfolder/zuran_enchanter.txt | 10 - res/cardsfolder/zuran_orb.txt | 9 - res/cardsfolder/zuran_spellcaster.txt | 10 - res/decks/JuzamjediCube.dck | 1028 +- res/gui/display_new_layout.xml | 86 +- res/lang/de.properties | 23 +- res/lang/en.properties | 27 +- res/lib/google-collections-1.0.jar | Bin 639592 -> 0 bytes res/lib/java-image-scaling-0.8.4.jar | Bin 43161 -> 0 bytes res/lib/jl1.0.1.jar | Bin 105363 -> 0 bytes res/lib/miglayout-3.7.3.1-swing.jar | Bin 76357 -> 0 bytes res/lib/napkinlaf-1.2.jar | Bin 795524 -> 0 bytes res/lib/nimrodlf.jar | Bin 215923 -> 0 bytes res/lib/substance.jar | Bin 1741419 -> 0 bytes res/lib/xpp3_min-1.1.4c.jar | Bin 24956 -> 0 bytes res/lib/xstream-1.3.1.jar | Bin 431406 -> 0 bytes res/main.properties | 6 +- res/mtg-data.txt | 2886 +++-- res/quest/all-prices.txt | 4 +- res/quest/decks/Abraham Lincoln 3.dck | 32 +- res/quest/decks/Barney Rubble 1.dck | 40 +- res/quest/decks/Cave Troll 2.dck | 25 - res/quest/decks/Crocodile Dundee 2.dck | 9 +- res/quest/decks/Darrin Stephens 1.dck | 3 +- res/quest/decks/Galadriel 2.dck | 5 +- res/quest/decks/George of the Jungle 1.dck | 23 +- res/quest/decks/George of the Jungle 2.dck | 13 +- res/quest/decks/Grampa Simpson 3.dck | 9 +- res/quest/decks/Hellboy 3.dck | 4 +- res/quest/decks/Hercules 1.dck | 10 +- res/quest/decks/Hercules 2.dck | 37 +- res/quest/decks/Hercules 3.dck | 6 +- res/quest/decks/Joe Kidd 1.dck | 47 +- res/quest/decks/Joe Kidd 2.dck | 2 +- res/quest/decks/King Arthur 1.dck | 54 +- res/quest/decks/King Arthur 2.dck | 46 +- res/quest/decks/King Arthur 3.dck | 42 +- res/quest/decks/King Kong 1.dck | 36 +- res/quest/decks/King Kong 2.dck | 43 +- res/quest/decks/Kojak 2.dck | 2 +- res/quest/decks/Magnum 1.dck | 36 +- res/quest/decks/Magnum 2.dck | 18 +- res/quest/decks/Radiant 3.dck | 6 +- res/quest/decks/Rocky 1.dck | 23 +- res/quest/decks/Rocky 2.dck | 73 +- res/quest/decks/Rocky 3.dck | 53 +- res/quest/decks/Samantha Stephens 1.dck | 6 +- res/quest/decks/Sauron 2.dck | 9 +- res/quest/decks/Scotty 2.dck | 60 +- res/quest/decks/Sherlock Holmes 1.dck | 40 +- res/quest/decks/Sherlock Holmes 2.dck | 23 +- res/quest/decks/Sherlock Holmes 3.dck | 5 +- res/quest/decks/Wilma Flintstone 1.dck | 52 +- res/quest/decks/Wilma Flintstone 2.dck | 7 +- res/quest/decks/Wilma Flintstone 3.dck | 3 +- res/quest/decks/Wyatt Earp 1.dck | 37 +- res/quest/decks/Wyatt Earp 2.dck | 17 +- res/quest/decks/Wyatt Earp 3.dck | 7 +- res/quest/decks/quest1.dck | 50 +- res/quest/decks/quest2.dck | 39 +- res/quest/decks/quest6.dck | 100 +- res/quest/easy.txt | 8 + res/quest/hard.txt | 10 +- res/quest/medium.txt | 12 +- res/quest/price.txt | 2 +- res/quest/quests.txt | 50 +- res/quest/veryhard.txt | 2 + res/reprintSetInfo.py | 14 +- res/setInfoScript.py | 379 +- src/arcane/ui/CardArea.java | 537 +- src/arcane/ui/CardPanel.java | 780 +- src/arcane/ui/CardPanelContainer.java | 616 +- src/arcane/ui/HandArea.java | 75 +- src/arcane/ui/PlayArea.java | 782 +- src/arcane/ui/ScaledImagePanel.java | 455 +- src/arcane/ui/ViewPanel.java | 79 +- src/arcane/ui/util/Animation.java | 770 +- .../ui/util/CardPanelMouseListener.java | 77 +- src/arcane/ui/util/GlowText.java | 162 +- src/arcane/ui/util/ImageUtil.java | 108 +- src/arcane/ui/util/ManaSymbols.java | 180 +- src/arcane/ui/util/UI.java | 373 +- src/arcane/util/MultiplexOutputStream.java | 39 +- src/arcane/util/Util.java | 128 +- .../cloudgarden/layout/AnchorConstraint.java | 80 - src/com/cloudgarden/layout/AnchorLayout.java | 256 - src/com/esotericsoftware/minlog/Log.java | 233 - src/forge/AIPlayer.java | 525 +- src/forge/AllZone.java | 671 +- src/forge/AllZoneUtil.java | 1797 ++-- src/forge/Base64Coder.java | 521 +- src/forge/BoosterDraft.java | 348 +- src/forge/BoosterDraftAI.java | 1112 +- src/forge/BoosterGenerator.java | 438 +- src/forge/BoosterPack.java | 28 - src/forge/ButtonUtil.java | 113 +- src/forge/Card.java | 9373 ++++++++++------- src/forge/CardContainer.java | 18 +- src/forge/CardFilter.java | 571 +- src/forge/CardList.java | 1151 +- src/forge/CardListFilter.java | 16 +- src/forge/CardListUtil.java | 839 +- src/forge/CardShopTableModel.java | 713 +- src/forge/CardUtil.java | 690 +- src/forge/Card_Color.java | 207 +- src/forge/Color.java | 220 +- src/forge/Combat.java | 1299 ++- src/forge/CombatUtil.java | 4021 +++---- src/forge/Command.java | 28 +- src/forge/CommandArgs.java | 15 +- src/forge/CommandList.java | 99 +- src/forge/CommandReturn.java | 19 +- src/forge/Computer.java | 50 +- src/forge/ComputerAI_General.java | 811 +- src/forge/ComputerAI_Input.java | 93 +- src/forge/ComputerUtil.java | 2479 +++-- src/forge/ComputerUtil_Attack2.java | 1217 ++- src/forge/ComputerUtil_Block2.java | 1065 +- src/forge/Constant.java | 215 +- src/forge/CopyFiles.java | 183 +- src/forge/Counters.java | 42 +- src/forge/DefaultPlayerZone.java | 479 +- src/forge/Display.java | 94 +- src/forge/EndOfCombat.java | 117 +- src/forge/EndOfTurn.java | 418 +- src/forge/ExternalPanel.java | 60 +- src/forge/FileFinder.java | 317 +- src/forge/FileUtil.java | 68 +- src/forge/GUI_DeckAnalysis.java | 2358 +++-- src/forge/GUI_Filter.java | 1535 ++- src/forge/GUI_ImportPicture.java | 751 +- src/forge/GUI_Quest_Filter.java | 1492 ++- src/forge/GameAction.java | 3422 +++--- src/forge/GameActionUtil.java | 8955 +++++----------- src/forge/GameInfo.java | 298 +- src/forge/GuiDisplay2.java | 856 -- src/forge/GuiDisplay3.java | 1346 --- src/forge/GuiDisplay4.java | 1358 +-- src/forge/GuiDisplayUtil.java | 1335 ++- src/forge/GuiInput.java | 69 +- src/forge/Gui_BoosterDraft.java | 508 +- src/forge/Gui_CardShop.java | 903 +- src/forge/Gui_DeckEditor.java | 1488 +-- src/forge/Gui_DeckEditor_Menu.java | 403 +- src/forge/Gui_DownloadPictures.java | 708 -- src/forge/Gui_DownloadPictures_LQ.java | 782 +- src/forge/Gui_DownloadPrices.java | 533 +- src/forge/Gui_DownloadSetPictures_LQ.java | 1009 +- .../Gui_MigrateLocalMWSSetPictures_HQ.java | 1033 +- src/forge/Gui_MultipleBlockers.java | 140 - src/forge/Gui_NewGame.java | 2055 ++-- src/forge/Gui_QuestOptions.java | 197 +- src/forge/Gui_Quest_DeckEditor.java | 1067 +- src/forge/Gui_Quest_DeckEditor_Menu.java | 841 +- src/forge/Gui_WinLose.java | 718 +- src/forge/HandSizeOp.java | 54 +- src/forge/HumanPlayer.java | 347 +- src/forge/ImageCache.java | 153 +- src/forge/ImagePreviewPanel.java | 218 +- src/forge/KeyListenerTest.java | 30 - src/forge/MP3Player.java | 60 - src/forge/MagicStack.java | 2036 ++-- src/forge/MenuItem_HowToPlay.java | 141 +- src/forge/Move.java | 67 +- src/forge/MyButton.java | 55 +- src/forge/MyObservable.java | 38 +- src/forge/MyRandom.java | 29 +- src/forge/NameChanger.java | 216 +- src/forge/Phase.java | 1352 ++- src/forge/PhaseUtil.java | 910 +- src/forge/Player.java | 3011 ++++-- src/forge/PlayerUtil.java | 307 +- src/forge/PlayerZone.java | 38 +- src/forge/PlayerZone_ComesIntoPlay.java | 320 +- src/forge/QuestData.java | 814 -- src/forge/QuestData_BoosterPack.java | 325 - src/forge/QuestData_Prefs.java | 365 - src/forge/QuestData_State.java | 73 - src/forge/Quest_Assignment.java | 408 +- src/forge/ReadBoosterPack.java | 345 +- src/forge/ReadCard.java | 246 - src/forge/ReadDraftBoosterPack.java | 544 +- src/forge/ReadPriceList.java | 198 +- src/forge/ReadQuest_Assignment.java | 224 +- src/forge/RunTest.java | 324 - src/forge/SetInfo.java | 149 +- src/forge/SetInfoUtil.java | 691 +- src/forge/SimpleCombat.java | 110 +- src/forge/StaticEffect.java | 976 +- src/forge/StaticEffects.java | 348 +- src/forge/TableModel.java | 813 +- src/forge/TableSorter.java | 343 +- src/forge/Test.java | 10 - src/forge/TestMove.java | 93 - src/forge/TestPanel.java | 45 - src/forge/Time.java | 59 +- src/forge/UndoCommand.java | 17 +- src/forge/ZCTrigger.java | 46 +- .../card/abilityFactory/AbilityFactory.java | 3180 +++--- .../AbilityFactory_AlterLife.java | 2306 ++-- .../AbilityFactory_Animate.java | 1545 +-- .../AbilityFactory_ChangeZone.java | 3274 +++--- .../abilityFactory/AbilityFactory_Choose.java | 716 +- .../abilityFactory/AbilityFactory_Clash.java | 718 +- .../AbilityFactory_Cleanup.java | 104 +- .../abilityFactory/AbilityFactory_Combat.java | 621 +- .../abilityFactory/AbilityFactory_Copy.java | 1128 +- .../AbilityFactory_CounterMagic.java | 829 +- .../AbilityFactory_Counters.java | 3063 +++--- .../AbilityFactory_DealDamage.java | 1841 ++-- .../abilityFactory/AbilityFactory_Debuff.java | 1340 +-- .../AbilityFactory_DelayedTrigger.java | 320 +- .../AbilityFactory_Destroy.java | 1322 +-- .../abilityFactory/AbilityFactory_Effect.java | 614 +- .../AbilityFactory_EndGameCondition.java | 825 +- .../AbilityFactory_GainControl.java | 840 +- .../abilityFactory/AbilityFactory_Mana.java | 1425 ++- .../AbilityFactory_PermanentState.java | 3048 +++--- .../AbilityFactory_PreventDamage.java | 700 +- .../abilityFactory/AbilityFactory_Pump.java | 1997 ++-- .../AbilityFactory_Regenerate.java | 1225 ++- .../abilityFactory/AbilityFactory_Reveal.java | 2284 ++-- .../AbilityFactory_Sacrifice.java | 1005 +- .../abilityFactory/AbilityFactory_Token.java | 929 +- .../abilityFactory/AbilityFactory_Turns.java | 420 +- .../AbilityFactory_ZoneAffecting.java | 2819 ++--- src/forge/card/cardFactory/CardFactory.java | 3220 ------ .../card/cardFactory/CardFactoryUtil.java | 7987 +++++++------- .../card/cardFactory/CardFactory_Auras.java | 2014 +--- .../cardFactory/CardFactory_Creatures.java | 4854 ++++----- .../cardFactory/CardFactory_Equipment.java | 853 +- .../cardFactory/CardFactory_Instants.java | 3261 +++--- .../card/cardFactory/CardFactory_Lands.java | 1873 ++-- .../CardFactory_Planeswalkers.java | 3527 +++---- .../cardFactory/CardFactory_Sorceries.java | 4577 ++++---- src/forge/card/mana/Mana.java | 280 +- src/forge/card/mana/ManaCost.java | 836 +- src/forge/card/mana/ManaPool.java | 1233 ++- src/forge/card/mana/Mana_Part.java | 92 +- src/forge/card/mana/Mana_PartColor.java | 93 +- src/forge/card/mana/Mana_PartColorless.java | 116 +- src/forge/card/mana/Mana_PartPhyrexian.java | 176 +- src/forge/card/mana/Mana_PartSnow.java | 111 +- src/forge/card/mana/Mana_PartSplit.java | 127 +- src/forge/card/mana/Mana_PartTest.java | 520 - src/forge/card/spellability/Ability.java | 62 +- .../card/spellability/Ability_Activated.java | 80 +- src/forge/card/spellability/Ability_Mana.java | 429 +- .../card/spellability/Ability_Static.java | 33 +- src/forge/card/spellability/Ability_Sub.java | 94 +- .../card/spellability/Ability_Triggered.java | 86 +- src/forge/card/spellability/Cost.java | 2053 ++-- src/forge/card/spellability/Cost_Payment.java | 3473 +++--- src/forge/card/spellability/Spell.java | 93 +- src/forge/card/spellability/SpellAbility.java | 1814 ++-- .../card/spellability/SpellAbilityList.java | 94 +- .../spellability/SpellAbility_Condition.java | 479 +- .../SpellAbility_Requirements.java | 311 +- .../SpellAbility_Restriction.java | 429 +- .../SpellAbility_StackInstance.java | 286 +- .../spellability/SpellAbility_Variables.java | 504 +- .../card/spellability/Spell_Permanent.java | 488 +- src/forge/card/spellability/Target.java | 744 +- .../card/spellability/Target_Choices.java | 261 +- .../card/spellability/Target_Selection.java | 804 +- src/forge/card/trigger/Trigger.java | 920 +- src/forge/card/trigger/TriggerHandler.java | 1958 ++-- .../card/trigger/Trigger_AttackerBlocked.java | 118 +- .../trigger/Trigger_AttackerUnblocked.java | 102 +- src/forge/card/trigger/Trigger_Attacks.java | 144 +- src/forge/card/trigger/Trigger_Blocks.java | 118 +- .../card/trigger/Trigger_ChangesZone.java | 149 +- src/forge/card/trigger/Trigger_Clashed.java | 120 +- .../card/trigger/Trigger_CounterAdded.java | 120 +- src/forge/card/trigger/Trigger_Cycled.java | 100 +- .../card/trigger/Trigger_DamageDone.java | 207 +- src/forge/card/trigger/Trigger_Discarded.java | 134 +- src/forge/card/trigger/Trigger_Drawn.java | 103 +- .../card/trigger/Trigger_LandPlayed.java | 115 +- .../card/trigger/Trigger_LifeGained.java | 104 +- src/forge/card/trigger/Trigger_LifeLost.java | 104 +- src/forge/card/trigger/Trigger_Phase.java | 142 +- .../card/trigger/Trigger_Sacrificed.java | 113 +- src/forge/card/trigger/Trigger_Shuffled.java | 102 +- .../trigger/Trigger_SpellAbilityCast.java | 327 +- src/forge/card/trigger/Trigger_Taps.java | 106 +- .../card/trigger/Trigger_TapsForMana.java | 105 +- .../card/trigger/Trigger_TurnFaceUp.java | 101 +- src/forge/card/trigger/Trigger_Unequip.java | 117 +- src/forge/card/trigger/Trigger_Untaps.java | 108 +- src/forge/deck/Deck.java | 221 +- src/forge/deck/DeckManager.java | 139 +- src/forge/deck/DownloadDeck.java | 84 +- .../deck/generate/Generate2ColorDeck.java | 805 +- .../deck/generate/Generate3ColorDeck.java | 854 +- .../generate/GenerateConstructedDeck.java | 366 +- .../GenerateConstructedMultiColorDeck.java | 868 +- .../deck/generate/GenerateSealedDeck.java | 164 - .../deck/generate/GenerateThemeDeck.java | 595 +- src/forge/error/ErrorViewer.java | 235 +- src/forge/error/ExceptionHandler.java | 94 +- src/forge/gui/ForgeAction.java | 43 +- src/forge/gui/ForgeFontConstants.java | 33 - src/forge/gui/GuiUtils.java | 146 +- src/forge/gui/ListChooser.java | 272 +- src/forge/gui/MultiLineLabel.java | 45 +- src/forge/gui/MultiLineLabelUI.java | 206 +- src/forge/gui/game/CardDetailPanel.java | 433 +- src/forge/gui/game/CardPanel.java | 58 +- src/forge/gui/game/CardPicturePanel.java | 68 +- src/forge/gui/input/Input.java | 97 +- src/forge/gui/input/InputControl.java | 254 +- src/forge/gui/input/Input_Attack.java | 111 +- src/forge/gui/input/Input_Block.java | 122 +- src/forge/gui/input/Input_Cleanup.java | 79 +- src/forge/gui/input/Input_Mulligan.java | 144 +- src/forge/gui/input/Input_PassPriority.java | 115 +- src/forge/gui/input/Input_PayManaCost.java | 223 +- .../gui/input/Input_PayManaCostUtil.java | 294 +- .../gui/input/Input_PayManaCost_Ability.java | 146 +- src/forge/properties/ForgePreferences.java | 273 +- src/forge/properties/ForgeProps.java | 70 +- src/forge/properties/NewConstants.java | 706 +- src/forge/properties/Preferences.java | 104 +- .../properties/SavePreferencesListener.java | 12 +- src/forge/quest/data/QuestBattleManager.java | 73 +- src/forge/quest/data/QuestBoosterPack.java | 285 +- src/forge/quest/data/QuestData.java | 354 +- src/forge/quest/data/QuestDataIO.java | 182 +- src/forge/quest/data/QuestMatchState.java | 70 +- src/forge/quest/data/QuestPreferences.java | 996 +- src/forge/quest/data/QuestUtil.java | 960 +- .../data/bazaar/QuestStallDefinition.java | 14 + .../quest/data/bazaar/QuestStallManager.java | 97 +- .../data/bazaar/QuestStallPurchasable.java | 18 +- src/forge/quest/data/item/QuestInventory.java | 53 + .../quest/data/item/QuestItemAbstract.java | 89 +- .../quest/data/item/QuestItemElixir.java | 24 +- .../quest/data/item/QuestItemEstates.java | 20 +- .../quest/data/item/QuestItemLuckyCoin.java | 20 +- src/forge/quest/data/item/QuestItemMap.java | 19 +- .../quest/data/item/QuestItemSleight.java | 20 +- .../quest/data/item/QuestItemZeppelin.java | 34 +- .../quest/data/pet/QuestPetAbstract.java | 153 +- src/forge/quest/data/pet/QuestPetBird.java | 53 +- .../quest/data/pet/QuestPetCrocodile.java | 51 +- src/forge/quest/data/pet/QuestPetHound.java | 58 +- src/forge/quest/data/pet/QuestPetManager.java | 87 +- src/forge/quest/data/pet/QuestPetPlant.java | 68 +- src/forge/quest/data/pet/QuestPetWolf.java | 51 +- src/forge/quest/gui/QuestAbstractPanel.java | 21 +- src/forge/quest/gui/QuestFrame.java | 54 +- .../quest/gui/bazaar/QuestBazaarItem.java | 91 +- .../quest/gui/bazaar/QuestBazaarPanel.java | 56 +- .../quest/gui/bazaar/QuestBazaarStall.java | 72 +- src/forge/quest/gui/main/QuestBattle.java | 154 +- src/forge/quest/gui/main/QuestMainPanel.java | 227 +- src/forge/quest/gui/main/QuestQuest.java | 46 +- .../quest/gui/main/QuestSelectablePanel.java | 58 +- src/org/jdesktop/beans/AbstractBean.java | 501 - .../swingworker/AccumulativeRunnable.java | 141 - .../SwingPropertyChangeSupport.java | 107 - src/org/jdesktop/swingworker/SwingWorker.java | 888 -- src/org/jdesktop/swingx/JXMultiSplitPane.java | 569 - src/org/jdesktop/swingx/MultiSplitLayout.java | 2215 ---- .../swingx/graphics/GraphicsUtilities.java | 765 -- .../swingx/painter/AbstractPainter.java | 427 - src/org/jdesktop/swingx/painter/Painter.java | 106 - src/treeProperties/PropertyElement.java | 22 +- src/treeProperties/PropertyType.java | 78 +- src/treeProperties/TreeProperties.java | 858 +- src/treeProperties/types/FileType.java | 144 +- 8725 files changed, 107237 insertions(+), 210472 deletions(-) delete mode 100644 build.xml delete mode 100644 build/forge.jardesc delete mode 100644 build/forge.xml delete mode 100644 build/manifest.forge delete mode 100644 res/cardsfolder/abandoned_outpost.txt delete mode 100644 res/cardsfolder/abbey_gargoyles.txt delete mode 100644 res/cardsfolder/abbey_matron.txt delete mode 100644 res/cardsfolder/abduction.txt delete mode 100644 res/cardsfolder/abjure.txt delete mode 100644 res/cardsfolder/abolish.txt delete mode 100644 res/cardsfolder/abomination.txt delete mode 100644 res/cardsfolder/aboshan_cephalid_emperor.txt delete mode 100644 res/cardsfolder/aboshans_desire.txt delete mode 100644 res/cardsfolder/about_face.txt delete mode 100644 res/cardsfolder/absolute_grace.txt delete mode 100644 res/cardsfolder/absolute_law.txt delete mode 100644 res/cardsfolder/absorb.txt delete mode 100644 res/cardsfolder/absorb_vis.txt delete mode 100644 res/cardsfolder/abuna_acolyte.txt delete mode 100644 res/cardsfolder/abyssal_gatekeeper.txt delete mode 100644 res/cardsfolder/abyssal_horror.txt delete mode 100644 res/cardsfolder/abyssal_hunter.txt delete mode 100644 res/cardsfolder/abyssal_nightstalker.txt delete mode 100644 res/cardsfolder/abyssal_nocturnus.txt delete mode 100644 res/cardsfolder/abyssal_persecutor.txt delete mode 100644 res/cardsfolder/abyssal_specter.txt delete mode 100644 res/cardsfolder/academy_rector.txt delete mode 100644 res/cardsfolder/academy_ruins.txt delete mode 100644 res/cardsfolder/accelerate.txt delete mode 100644 res/cardsfolder/accelerated_mutation.txt delete mode 100644 res/cardsfolder/acceptable_losses.txt delete mode 100644 res/cardsfolder/accorder_paladin.txt delete mode 100644 res/cardsfolder/accorders_shield.txt delete mode 100644 res/cardsfolder/accumulated_knowledge.txt delete mode 100644 res/cardsfolder/accursed_centaur.txt delete mode 100644 res/cardsfolder/acid_rain.txt delete mode 100644 res/cardsfolder/acid_web_spider.txt delete mode 100644 res/cardsfolder/acidic_slime.txt delete mode 100644 res/cardsfolder/acidic_sliver.txt delete mode 100644 res/cardsfolder/acidic_soil.txt delete mode 100644 res/cardsfolder/acolyte_of_xathrid.txt delete mode 100644 res/cardsfolder/acorn_harvest.txt delete mode 100644 res/cardsfolder/acquire.txt delete mode 100644 res/cardsfolder/acridian.txt delete mode 100644 res/cardsfolder/act_of_aggression.txt delete mode 100644 res/cardsfolder/act_of_treason.txt delete mode 100644 res/cardsfolder/active_volcano.txt delete mode 100644 res/cardsfolder/adamaro_first_to_desire.txt delete mode 100644 res/cardsfolder/adarkar_sentinel.txt delete mode 100644 res/cardsfolder/adarkar_valkyrie.txt delete mode 100644 res/cardsfolder/adarkar_wastes.txt delete mode 100644 res/cardsfolder/adarkar_windform.txt delete mode 100644 res/cardsfolder/adder_staff_boggart.txt delete mode 100644 res/cardsfolder/admonition_angel.txt delete mode 100644 res/cardsfolder/adun_oakenshield.txt delete mode 100644 res/cardsfolder/advance_scout.txt delete mode 100644 res/cardsfolder/advanced_hoverguard.txt delete mode 100644 res/cardsfolder/adventuring_gear.txt delete mode 100644 res/cardsfolder/aegis_of_the_meek.txt delete mode 100644 res/cardsfolder/aeolipile.txt delete mode 100644 res/cardsfolder/aerathi_berserker.txt delete mode 100644 res/cardsfolder/aerie_mystics.txt delete mode 100644 res/cardsfolder/aerie_ouphes.txt delete mode 100644 res/cardsfolder/aesthir_glider.txt delete mode 100644 res/cardsfolder/aether_adept.txt delete mode 100644 res/cardsfolder/aether_burst.txt delete mode 100644 res/cardsfolder/aether_charge.txt delete mode 100644 res/cardsfolder/aether_figment.txt delete mode 100644 res/cardsfolder/aether_flash.txt delete mode 100644 res/cardsfolder/aether_membrane.txt delete mode 100644 res/cardsfolder/aether_mutation.txt delete mode 100644 res/cardsfolder/aether_shockwave.txt delete mode 100644 res/cardsfolder/aether_spellbomb.txt delete mode 100644 res/cardsfolder/aether_sting.txt delete mode 100644 res/cardsfolder/aether_tradewinds.txt delete mode 100644 res/cardsfolder/aether_vial.txt delete mode 100644 res/cardsfolder/aether_web.txt delete mode 100644 res/cardsfolder/aetherflame_wall.txt delete mode 100644 res/cardsfolder/aethermages_touch.txt delete mode 100644 res/cardsfolder/aethersnipe.txt delete mode 100644 res/cardsfolder/affa_guard_hound.txt delete mode 100644 res/cardsfolder/afflict.txt delete mode 100644 res/cardsfolder/afterlife.txt delete mode 100644 res/cardsfolder/aftershock.txt delete mode 100644 res/cardsfolder/agadeem_occultist.txt delete mode 100644 res/cardsfolder/ageless_entity.txt delete mode 100644 res/cardsfolder/agent_of_masks.txt delete mode 100644 res/cardsfolder/agent_of_shauku.txt delete mode 100644 res/cardsfolder/agent_of_stromgald.txt delete mode 100644 res/cardsfolder/aggressive_urge.txt delete mode 100644 res/cardsfolder/agility.txt delete mode 100644 res/cardsfolder/agonizing_demise.txt delete mode 100644 res/cardsfolder/agony_warp.txt delete mode 100644 res/cardsfolder/agrus_kos_wojek_veteran.txt delete mode 100644 res/cardsfolder/air_bladder.txt delete mode 100644 res/cardsfolder/air_elemental.txt delete mode 100644 res/cardsfolder/air_servant.txt delete mode 100644 res/cardsfolder/airborne_aid.txt delete mode 100644 res/cardsfolder/airdrop_condor.txt delete mode 100644 res/cardsfolder/ajani_goldmane.txt delete mode 100644 res/cardsfolder/ajani_vengeant.txt delete mode 100644 res/cardsfolder/ajanis_mantra.txt delete mode 100644 res/cardsfolder/ajanis_pridemate.txt delete mode 100644 res/cardsfolder/akki_avalanchers.txt delete mode 100644 res/cardsfolder/akki_blizzard_herder.txt delete mode 100644 res/cardsfolder/akki_coalflinger.txt delete mode 100644 res/cardsfolder/akki_drillmaster.txt delete mode 100644 res/cardsfolder/akki_raider.txt delete mode 100644 res/cardsfolder/akki_rockspeaker.txt delete mode 100644 res/cardsfolder/akki_underling.txt delete mode 100644 res/cardsfolder/akki_underminer.txt delete mode 100644 res/cardsfolder/akoum_battlesinger.txt delete mode 100644 res/cardsfolder/akoum_boulderfoot.txt delete mode 100644 res/cardsfolder/akoum_refuge.txt delete mode 100644 res/cardsfolder/akrasan_squire.txt delete mode 100644 res/cardsfolder/akroma_angel_of_fury.txt delete mode 100644 res/cardsfolder/akroma_angel_of_wrath.txt delete mode 100644 res/cardsfolder/akromas_devoted.txt delete mode 100644 res/cardsfolder/akromas_memorial.txt delete mode 100644 res/cardsfolder/akromas_vengeance.txt delete mode 100644 res/cardsfolder/aku_djinn.txt delete mode 100644 res/cardsfolder/akuta_born_of_ash.txt delete mode 100644 res/cardsfolder/alabaster_dragon.txt delete mode 100644 res/cardsfolder/alabaster_leech.txt delete mode 100644 res/cardsfolder/alabaster_wall.txt delete mode 100644 res/cardsfolder/alaborn_cavalier.txt delete mode 100644 res/cardsfolder/alaborn_grenadier.txt delete mode 100644 res/cardsfolder/alaborn_musketeer.txt delete mode 100644 res/cardsfolder/alaborn_trooper.txt delete mode 100644 res/cardsfolder/alaborn_veteran.txt delete mode 100644 res/cardsfolder/alaborn_zealot.txt delete mode 100644 res/cardsfolder/aladdin.txt delete mode 100644 res/cardsfolder/aladdins_ring.txt delete mode 100644 res/cardsfolder/alarum.txt delete mode 100644 res/cardsfolder/albino_troll.txt delete mode 100644 res/cardsfolder/alert_shu_infantry.txt delete mode 100644 res/cardsfolder/alexi_zephyr_mage.txt delete mode 100644 res/cardsfolder/alexis_cloak.txt delete mode 100644 res/cardsfolder/algae_gharial.txt delete mode 100644 res/cardsfolder/ali_baba.txt delete mode 100644 res/cardsfolder/ali_from_cairo.txt delete mode 100644 res/cardsfolder/alibans_tower.txt delete mode 100644 res/cardsfolder/all_hallows_eve.txt delete mode 100644 res/cardsfolder/all_is_dust.txt delete mode 100644 res/cardsfolder/all_suns_dawn.txt delete mode 100644 res/cardsfolder/allay.txt delete mode 100644 res/cardsfolder/alley_grifters.txt delete mode 100644 res/cardsfolder/allied_strategies.txt delete mode 100644 res/cardsfolder/allosaurus_rider.txt delete mode 100644 res/cardsfolder/alloy_myr.txt delete mode 100644 res/cardsfolder/alluring_scent.txt delete mode 100644 res/cardsfolder/alluring_siren.txt delete mode 100644 res/cardsfolder/alpha_kavu.txt delete mode 100644 res/cardsfolder/alpha_myr.txt delete mode 100644 res/cardsfolder/alpha_tyrranax.txt delete mode 100644 res/cardsfolder/altar_golem.txt delete mode 100644 res/cardsfolder/altar_of_bone.txt delete mode 100644 res/cardsfolder/altar_of_dementia.txt delete mode 100644 res/cardsfolder/altar_of_shadows.txt delete mode 100644 res/cardsfolder/altars_light.txt delete mode 100644 res/cardsfolder/aluren.txt delete mode 100644 res/cardsfolder/ambassador_laquatus.txt delete mode 100644 res/cardsfolder/ambassador_oak.txt delete mode 100644 res/cardsfolder/ambitions_cost.txt delete mode 100644 res/cardsfolder/ambush.txt delete mode 100644 res/cardsfolder/ambush_commander.txt delete mode 100644 res/cardsfolder/ambush_party.txt delete mode 100644 res/cardsfolder/amnesia.txt delete mode 100644 res/cardsfolder/amok.txt delete mode 100644 res/cardsfolder/amphibious_kavu.txt delete mode 100644 res/cardsfolder/amrou_kithkin.txt delete mode 100644 res/cardsfolder/amrou_scout.txt delete mode 100644 res/cardsfolder/amrou_seekers.txt delete mode 100644 res/cardsfolder/amugaba.txt delete mode 100644 res/cardsfolder/amulet_of_kroog.txt delete mode 100644 res/cardsfolder/amulet_of_unmaking.txt delete mode 100644 res/cardsfolder/amulet_of_vigor.txt delete mode 100644 res/cardsfolder/an_havva_constable.txt delete mode 100644 res/cardsfolder/an_havva_inn.txt delete mode 100644 res/cardsfolder/an_havva_township.txt delete mode 100644 res/cardsfolder/an_zerrin_ruins.txt delete mode 100644 res/cardsfolder/ana_disciple.txt delete mode 100644 res/cardsfolder/anaba_ancestor.txt delete mode 100644 res/cardsfolder/anaba_bodyguard.txt delete mode 100644 res/cardsfolder/anaba_shaman.txt delete mode 100644 res/cardsfolder/anaba_spirit_crafter.txt delete mode 100644 res/cardsfolder/anaconda.txt delete mode 100644 res/cardsfolder/anarchist.txt delete mode 100644 res/cardsfolder/anarchy.txt delete mode 100644 res/cardsfolder/ancestors_chosen.txt delete mode 100644 res/cardsfolder/ancestors_prophet.txt delete mode 100644 res/cardsfolder/ancestral_mask.txt delete mode 100644 res/cardsfolder/ancestral_memories.txt delete mode 100644 res/cardsfolder/ancestral_recall.txt delete mode 100644 res/cardsfolder/ancestral_tribute.txt delete mode 100644 res/cardsfolder/ancestral_vision.txt delete mode 100644 res/cardsfolder/ancient_amphitheater.txt delete mode 100644 res/cardsfolder/ancient_craving.txt delete mode 100644 res/cardsfolder/ancient_den.txt delete mode 100644 res/cardsfolder/ancient_grudge.txt delete mode 100644 res/cardsfolder/ancient_hellkite.txt delete mode 100644 res/cardsfolder/ancient_hydra.txt delete mode 100644 res/cardsfolder/ancient_runes.txt delete mode 100644 res/cardsfolder/ancient_silverback.txt delete mode 100644 res/cardsfolder/ancient_spider.txt delete mode 100644 res/cardsfolder/ancient_spring.txt delete mode 100644 res/cardsfolder/ancient_stirrings.txt delete mode 100644 res/cardsfolder/ancient_tomb.txt delete mode 100644 res/cardsfolder/andradite_leech.txt delete mode 100644 res/cardsfolder/angel_of_despair.txt delete mode 100644 res/cardsfolder/angel_of_fury.txt delete mode 100644 res/cardsfolder/angel_of_light.txt delete mode 100644 res/cardsfolder/angel_of_mercy.txt delete mode 100644 res/cardsfolder/angel_of_retribution.txt delete mode 100644 res/cardsfolder/angelfire_crusader.txt delete mode 100644 res/cardsfolder/angelheart_vial.txt delete mode 100644 res/cardsfolder/angelic_benediction.txt delete mode 100644 res/cardsfolder/angelic_blessing.txt delete mode 100644 res/cardsfolder/angelic_chorus.txt delete mode 100644 res/cardsfolder/angelic_curator.txt delete mode 100755 res/cardsfolder/angelic_favor.txt delete mode 100644 res/cardsfolder/angelic_page.txt delete mode 100644 res/cardsfolder/angelic_protector.txt delete mode 100644 res/cardsfolder/angelic_renewal.txt delete mode 100644 res/cardsfolder/angelic_shield.txt delete mode 100644 res/cardsfolder/angelic_voices.txt delete mode 100644 res/cardsfolder/angelic_wall.txt delete mode 100644 res/cardsfolder/angels_feather.txt delete mode 100644 res/cardsfolder/angels_grace.txt delete mode 100644 res/cardsfolder/angels_mercy.txt delete mode 100644 res/cardsfolder/angelsong.txt delete mode 100644 res/cardsfolder/anger.txt delete mode 100644 res/cardsfolder/angry_mob.txt delete mode 100644 res/cardsfolder/angus_mackenzie.txt delete mode 100644 res/cardsfolder/animal_boneyard.txt delete mode 100644 res/cardsfolder/animate_artifact.txt delete mode 100644 res/cardsfolder/animate_dead.txt delete mode 100644 res/cardsfolder/animate_land.txt delete mode 100644 res/cardsfolder/animate_wall.txt delete mode 100644 res/cardsfolder/ankh_of_mishra.txt delete mode 100644 res/cardsfolder/annihilate.txt delete mode 100644 res/cardsfolder/annul.txt delete mode 100644 res/cardsfolder/anodet_lurker.txt delete mode 100644 res/cardsfolder/anoint.txt delete mode 100644 res/cardsfolder/anowon_the_ruin_sage.txt delete mode 100644 res/cardsfolder/ant_queen.txt delete mode 100644 res/cardsfolder/anthroplasm.txt delete mode 100644 res/cardsfolder/antler_skulkin.txt delete mode 100644 res/cardsfolder/anurid_barkripper.txt delete mode 100644 res/cardsfolder/anurid_brushhopper.txt delete mode 100644 res/cardsfolder/anurid_murkdiver.txt delete mode 100644 res/cardsfolder/anvil_of_bogardan.txt delete mode 100644 res/cardsfolder/apes_of_rath.txt delete mode 100644 res/cardsfolder/apex_hawks.txt delete mode 100644 res/cardsfolder/aphetto_alchemist.txt delete mode 100644 res/cardsfolder/aphetto_exterminator.txt delete mode 100644 res/cardsfolder/aphetto_grifter.txt delete mode 100644 res/cardsfolder/aphetto_runecaster.txt delete mode 100644 res/cardsfolder/aphetto_vulture.txt delete mode 100644 res/cardsfolder/aphotic_wisps.txt delete mode 100644 res/cardsfolder/apocalypse.txt delete mode 100644 res/cardsfolder/apocalypse_hydra.txt delete mode 100644 res/cardsfolder/apostles_blessing.txt delete mode 100644 res/cardsfolder/apothecary_initiate.txt delete mode 100644 res/cardsfolder/apprentice_necromancer.txt delete mode 100644 res/cardsfolder/apprentice_sorcerer.txt delete mode 100644 res/cardsfolder/apprentice_wizard.txt delete mode 100644 res/cardsfolder/aquamoeba.txt delete mode 100644 res/cardsfolder/aquitects_will.txt delete mode 100644 res/cardsfolder/araba_mothrider.txt delete mode 100644 res/cardsfolder/arachnoid.txt delete mode 100644 res/cardsfolder/arashi_the_sky_asunder.txt delete mode 100644 res/cardsfolder/arbiter_of_knollridge.txt delete mode 100644 res/cardsfolder/arbor_elf.txt delete mode 100644 res/cardsfolder/arc_blade.txt delete mode 100644 res/cardsfolder/arc_lightning.txt delete mode 100644 res/cardsfolder/arc_mage.txt delete mode 100644 res/cardsfolder/arc_runner.txt delete mode 100644 res/cardsfolder/arc_slogger.txt delete mode 100644 res/cardsfolder/arc_trail.txt delete mode 100644 res/cardsfolder/arcades_sabboth.txt delete mode 100644 res/cardsfolder/arcane_sanctum.txt delete mode 100644 res/cardsfolder/arcane_spyglass.txt delete mode 100644 res/cardsfolder/arcane_teachings.txt delete mode 100644 res/cardsfolder/arcanis_the_omnipotent.txt delete mode 100644 res/cardsfolder/arcbound_bruiser.txt delete mode 100644 res/cardsfolder/arcbound_crusher.txt delete mode 100644 res/cardsfolder/arcbound_hybrid.txt delete mode 100644 res/cardsfolder/arcbound_lancer.txt delete mode 100644 res/cardsfolder/arcbound_overseer.txt delete mode 100644 res/cardsfolder/arcbound_ravager.txt delete mode 100644 res/cardsfolder/arcbound_reclaimer.txt delete mode 100644 res/cardsfolder/arcbound_slith.txt delete mode 100644 res/cardsfolder/arcbound_stinger.txt delete mode 100644 res/cardsfolder/arcbound_wanderer.txt delete mode 100644 res/cardsfolder/arcbound_worker.txt delete mode 100644 res/cardsfolder/archaeological_dig.txt delete mode 100644 res/cardsfolder/archangel.txt delete mode 100644 res/cardsfolder/archdemon_of_unx.txt delete mode 100644 res/cardsfolder/architects_of_will.txt delete mode 100644 res/cardsfolder/archivist.txt delete mode 100644 res/cardsfolder/archon_of_justice.txt delete mode 100644 res/cardsfolder/archon_of_redemption.txt delete mode 100644 res/cardsfolder/arctic_flats.txt delete mode 100644 res/cardsfolder/arctic_foxes.txt delete mode 100644 res/cardsfolder/arctic_nishoba.txt delete mode 100644 res/cardsfolder/arctic_wolves.txt delete mode 100644 res/cardsfolder/arcums_sleigh.txt delete mode 100644 res/cardsfolder/ardent_militia.txt delete mode 100644 res/cardsfolder/ardent_plea.txt delete mode 100644 res/cardsfolder/ardent_recruit.txt delete mode 100644 res/cardsfolder/ardent_soldier.txt delete mode 100644 res/cardsfolder/arena_of_the_ancients.txt delete mode 100644 res/cardsfolder/arensons_aura.txt delete mode 100644 res/cardsfolder/argent_mutation.txt delete mode 100644 res/cardsfolder/argentum_armor.txt delete mode 100644 res/cardsfolder/argivian_archaeologist.txt delete mode 100644 res/cardsfolder/argivian_blacksmith.txt delete mode 100644 res/cardsfolder/argivian_find.txt delete mode 100644 res/cardsfolder/argivian_restoration.txt delete mode 100644 res/cardsfolder/argothian_elder.txt delete mode 100644 res/cardsfolder/argothian_enchantress.txt delete mode 100644 res/cardsfolder/argothian_pixies.txt delete mode 100644 res/cardsfolder/argothian_swine.txt delete mode 100644 res/cardsfolder/argothian_treefolk.txt delete mode 100644 res/cardsfolder/arid_mesa.txt delete mode 100644 res/cardsfolder/ark_of_blight.txt delete mode 100644 res/cardsfolder/armadillo_cloak.txt delete mode 100644 res/cardsfolder/armageddon.txt delete mode 100644 res/cardsfolder/armageddon_clock.txt delete mode 100644 res/cardsfolder/armament_master.txt delete mode 100644 res/cardsfolder/armed_response.txt delete mode 100644 res/cardsfolder/armillary_sphere.txt delete mode 100644 res/cardsfolder/armistice.txt delete mode 100644 res/cardsfolder/armor_of_faith.txt delete mode 100644 res/cardsfolder/armor_sliver.txt delete mode 100644 res/cardsfolder/armor_thrull.txt delete mode 100644 res/cardsfolder/armored_ascension.txt delete mode 100644 res/cardsfolder/armored_cancrix.txt delete mode 100644 res/cardsfolder/armored_galleon.txt delete mode 100644 res/cardsfolder/armored_griffin.txt delete mode 100644 res/cardsfolder/armored_guardian.txt delete mode 100644 res/cardsfolder/armored_pegasus.txt delete mode 100644 res/cardsfolder/armorer_guildmage.txt delete mode 100644 res/cardsfolder/arms_dealer.txt delete mode 100644 res/cardsfolder/army_ants.txt delete mode 100644 res/cardsfolder/army_of_allah.txt delete mode 100644 res/cardsfolder/arnjlots_ascent.txt delete mode 100644 res/cardsfolder/arrest.txt delete mode 100644 res/cardsfolder/arrogant_bloodlord.txt delete mode 100644 res/cardsfolder/arrogant_vampire.txt delete mode 100644 res/cardsfolder/arrogant_wurm.txt delete mode 100755 res/cardsfolder/arrow_volley_trap.txt delete mode 100644 res/cardsfolder/artifact_blast.txt delete mode 100644 res/cardsfolder/artifact_mutation.txt delete mode 100644 res/cardsfolder/artifact_ward.txt delete mode 100644 res/cardsfolder/artificers_intuition.txt delete mode 100644 res/cardsfolder/artillerize.txt delete mode 100644 res/cardsfolder/artisan_of_kozilek.txt delete mode 100644 res/cardsfolder/ascendant_evincar.txt delete mode 100644 res/cardsfolder/ascending_aven.txt delete mode 100644 res/cardsfolder/asceticism.txt delete mode 100644 res/cardsfolder/ashas_favor.txt delete mode 100644 res/cardsfolder/ashcoat_bear.txt delete mode 100644 res/cardsfolder/ashen_firebeast.txt delete mode 100644 res/cardsfolder/ashen_monstrosity.txt delete mode 100644 res/cardsfolder/ashen_powder.txt delete mode 100644 res/cardsfolder/ashen_skin_zubera.txt delete mode 100644 res/cardsfolder/ashenmoor_cohort.txt delete mode 100644 res/cardsfolder/ashenmoor_gouger.txt delete mode 100644 res/cardsfolder/ashenmoor_liege.txt delete mode 100644 res/cardsfolder/ashes_to_ashes.txt delete mode 100644 res/cardsfolder/ashnods_altar.txt delete mode 100644 res/cardsfolder/ashnods_transmogrant.txt delete mode 100644 res/cardsfolder/asmira_holy_avenger.txt delete mode 100644 res/cardsfolder/aspect_of_mongoose.txt delete mode 100644 res/cardsfolder/aspect_of_wolf.txt delete mode 100644 res/cardsfolder/assassinate.txt delete mode 100644 res/cardsfolder/assassins_blade.txt delete mode 100644 res/cardsfolder/assault_griffin.txt delete mode 100644 res/cardsfolder/assault_strobe.txt delete mode 100644 res/cardsfolder/assault_zeppelid.txt delete mode 100644 res/cardsfolder/assembly_worker.txt delete mode 100644 res/cardsfolder/assert_authority.txt delete mode 100644 res/cardsfolder/astral_slide.txt delete mode 100644 res/cardsfolder/astral_steel.txt delete mode 100644 res/cardsfolder/astrolabe.txt delete mode 100644 res/cardsfolder/atog.txt delete mode 100644 res/cardsfolder/atogatog.txt delete mode 100644 res/cardsfolder/attrition.txt delete mode 100644 res/cardsfolder/attunement.txt delete mode 100644 res/cardsfolder/augur_il_vec.txt delete mode 100644 res/cardsfolder/augur_of_skulls.txt delete mode 100644 res/cardsfolder/augury_adept.txt delete mode 100644 res/cardsfolder/augury_owl.txt delete mode 100644 res/cardsfolder/aunties_hovel.txt delete mode 100644 res/cardsfolder/aura_blast.txt delete mode 100644 res/cardsfolder/aura_extraction.txt delete mode 100644 res/cardsfolder/aura_flux.txt delete mode 100644 res/cardsfolder/aura_fracture.txt delete mode 100644 res/cardsfolder/aura_gnarlid.txt delete mode 100644 res/cardsfolder/aura_mutation.txt delete mode 100644 res/cardsfolder/aura_of_dominion.txt delete mode 100644 res/cardsfolder/aura_of_silence.txt delete mode 100644 res/cardsfolder/aura_shards.txt delete mode 100644 res/cardsfolder/auramancer.txt delete mode 100644 res/cardsfolder/auratog.txt delete mode 100644 res/cardsfolder/auriok_bladewarden.txt delete mode 100644 res/cardsfolder/auriok_champion.txt delete mode 100644 res/cardsfolder/auriok_edgewright.txt delete mode 100644 res/cardsfolder/auriok_glaivemaster.txt delete mode 100644 res/cardsfolder/auriok_salvagers.txt delete mode 100644 res/cardsfolder/auriok_sunchaser.txt delete mode 100644 res/cardsfolder/auriok_transfixer.txt delete mode 100644 res/cardsfolder/aurochs.txt delete mode 100644 res/cardsfolder/aurochs_herd.txt delete mode 100644 res/cardsfolder/aurora_eidolon.txt delete mode 100644 res/cardsfolder/aurora_griffin.txt delete mode 100644 res/cardsfolder/auspicious_ancestor.txt delete mode 100644 res/cardsfolder/austere_command.txt delete mode 100644 res/cardsfolder/avalanche.txt delete mode 100644 res/cardsfolder/avalanche_riders.txt delete mode 100644 res/cardsfolder/avarax.txt delete mode 100644 res/cardsfolder/avatar_of_fury.txt delete mode 100644 res/cardsfolder/avatar_of_might.txt delete mode 100644 res/cardsfolder/avatar_of_will.txt delete mode 100644 res/cardsfolder/avatar_of_woe.txt delete mode 100644 res/cardsfolder/aven_archer.txt delete mode 100644 res/cardsfolder/aven_augur.txt delete mode 100644 res/cardsfolder/aven_brigadier.txt delete mode 100644 res/cardsfolder/aven_cloudchaser.txt delete mode 100644 res/cardsfolder/aven_envoy.txt delete mode 100644 res/cardsfolder/aven_farseer.txt delete mode 100644 res/cardsfolder/aven_fateshaper.txt delete mode 100644 res/cardsfolder/aven_fisher.txt delete mode 100644 res/cardsfolder/aven_flock.txt delete mode 100644 res/cardsfolder/aven_fogbringer.txt delete mode 100644 res/cardsfolder/aven_redeemer.txt delete mode 100644 res/cardsfolder/aven_riftwatcher.txt delete mode 100644 res/cardsfolder/aven_smokeweaver.txt delete mode 100644 res/cardsfolder/aven_squire.txt delete mode 100644 res/cardsfolder/aven_trailblazer.txt delete mode 100644 res/cardsfolder/aven_trooper.txt delete mode 100644 res/cardsfolder/avenger_en_dal.txt delete mode 100644 res/cardsfolder/avenger_of_zendikar.txt delete mode 100644 res/cardsfolder/avenging_angel.txt delete mode 100644 res/cardsfolder/avian_changeling.txt delete mode 100644 res/cardsfolder/avoid_fate.txt delete mode 100644 res/cardsfolder/awakener_druid.txt delete mode 100644 res/cardsfolder/awakening.txt delete mode 100644 res/cardsfolder/awakening_zone.txt delete mode 100644 res/cardsfolder/axegrinder_giant.txt delete mode 100644 res/cardsfolder/axelrod_gunnarson.txt delete mode 100644 res/cardsfolder/aysen_abbey.txt delete mode 100644 res/cardsfolder/aysen_bureaucrats.txt delete mode 100644 res/cardsfolder/aysen_crusader.txt delete mode 100644 res/cardsfolder/aysen_highway.txt delete mode 100644 res/cardsfolder/ayumi_the_last_visitor.txt delete mode 100644 res/cardsfolder/azami_lady_of_scrolls.txt delete mode 100644 res/cardsfolder/azimaet_drake.txt delete mode 100644 res/cardsfolder/azorius_aethermage.txt delete mode 100644 res/cardsfolder/azorius_chancery.txt delete mode 100644 res/cardsfolder/azorius_first_wing.txt delete mode 100644 res/cardsfolder/azorius_guildmage.txt delete mode 100644 res/cardsfolder/azorius_ploy.txt delete mode 100644 res/cardsfolder/azorius_signet.txt delete mode 100644 res/cardsfolder/azure_drake.txt delete mode 100644 res/cardsfolder/azusa_lost_but_seeking.txt delete mode 100644 res/cardsfolder/back_to_basics.txt delete mode 100644 res/cardsfolder/back_to_nature.txt delete mode 100644 res/cardsfolder/backfire.txt delete mode 100644 res/cardsfolder/backlash.txt delete mode 100644 res/cardsfolder/bad_moon.txt delete mode 100644 res/cardsfolder/bad_river.txt delete mode 100644 res/cardsfolder/badlands.txt delete mode 100644 res/cardsfolder/baku_altar.txt delete mode 100644 res/cardsfolder/bala_ged_scorpion.txt delete mode 100644 res/cardsfolder/balance.txt delete mode 100644 res/cardsfolder/balduvian_barbarians.txt delete mode 100644 res/cardsfolder/balduvian_bears.txt delete mode 100644 res/cardsfolder/balduvian_conjurer.txt delete mode 100644 res/cardsfolder/balduvian_dead.txt delete mode 100644 res/cardsfolder/balduvian_frostwaker.txt delete mode 100644 res/cardsfolder/balduvian_horde.txt delete mode 100644 res/cardsfolder/balduvian_rage.txt delete mode 100644 res/cardsfolder/balduvian_trading_post.txt delete mode 100644 res/cardsfolder/balduvian_war_makers.txt delete mode 100644 res/cardsfolder/balefire_liege.txt delete mode 100644 res/cardsfolder/baleful_stare.txt delete mode 100644 res/cardsfolder/ball_lightning.txt delete mode 100755 res/cardsfolder/ballista_squad.txt delete mode 100644 res/cardsfolder/balloon_peddler.txt delete mode 100644 res/cardsfolder/ballynock_cohort.txt delete mode 100644 res/cardsfolder/ballynock_trapper.txt delete mode 100644 res/cardsfolder/ballyrush_banneret.txt delete mode 100644 res/cardsfolder/baloth_woodcrasher.txt delete mode 100644 res/cardsfolder/balshan_collaborator.txt delete mode 100644 res/cardsfolder/balshan_griffin.txt delete mode 100644 res/cardsfolder/balthor_the_defiled.txt delete mode 100644 res/cardsfolder/balthor_the_stout.txt delete mode 100644 res/cardsfolder/bandage.txt delete mode 100644 res/cardsfolder/bane_of_the_living.txt delete mode 100644 res/cardsfolder/baneslayer_angel.txt delete mode 100644 res/cardsfolder/banishing_knack.txt delete mode 100644 res/cardsfolder/banishment_decree.txt delete mode 100644 res/cardsfolder/banshee.txt delete mode 100644 res/cardsfolder/banshees_blade.txt delete mode 100644 res/cardsfolder/bant_battlemage.txt delete mode 100644 res/cardsfolder/bant_charm.txt delete mode 100644 res/cardsfolder/bant_panorama.txt delete mode 100644 res/cardsfolder/bant_sojourners.txt delete mode 100644 res/cardsfolder/bant_sureblade.txt delete mode 100644 res/cardsfolder/barbarian_general.txt delete mode 100644 res/cardsfolder/barbarian_horde.txt delete mode 100644 res/cardsfolder/barbarian_lunatic.txt delete mode 100644 res/cardsfolder/barbarian_outcast.txt delete mode 100644 res/cardsfolder/barbarian_riftcutter.txt delete mode 100644 res/cardsfolder/barbarian_ring.txt delete mode 100644 res/cardsfolder/barbary_apes.txt delete mode 100644 res/cardsfolder/barbed_battlegear.txt delete mode 100644 res/cardsfolder/barbed_field.txt delete mode 100644 res/cardsfolder/barbed_lightning.txt delete mode 100644 res/cardsfolder/barbed_sextant.txt delete mode 100644 res/cardsfolder/barbed_sliver.txt delete mode 100644 res/cardsfolder/barbtooth_wurm.txt delete mode 100644 res/cardsfolder/bargain.txt delete mode 100644 res/cardsfolder/bargaining_table.txt delete mode 100644 res/cardsfolder/barishi.txt delete mode 100644 res/cardsfolder/barkhide_mauler.txt delete mode 100644 res/cardsfolder/barktooth_warbeard.txt delete mode 100644 res/cardsfolder/barls_cage.txt delete mode 100644 res/cardsfolder/baron_sengir.txt delete mode 100644 res/cardsfolder/barony_vampire.txt delete mode 100644 res/cardsfolder/barrage_ogre.txt delete mode 100644 res/cardsfolder/barren_glory.txt delete mode 100644 res/cardsfolder/barren_moor.txt delete mode 100644 res/cardsfolder/barrenton_cragtreads.txt delete mode 100644 res/cardsfolder/barrenton_medic.txt delete mode 100644 res/cardsfolder/barrin_master_wizard.txt delete mode 100644 res/cardsfolder/barrins_codex.txt delete mode 100644 res/cardsfolder/bartel_runeaxe.txt delete mode 100644 res/cardsfolder/barter_in_blood.txt delete mode 100644 res/cardsfolder/baru_fist_of_krosa.txt delete mode 100644 res/cardsfolder/basal_sliver.txt delete mode 100644 res/cardsfolder/basal_thrull.txt delete mode 100644 res/cardsfolder/basalt_gargoyle.txt delete mode 100644 res/cardsfolder/basalt_monolith.txt delete mode 100644 res/cardsfolder/bash_to_bits.txt delete mode 100644 res/cardsfolder/basilisk_collar.txt delete mode 100644 res/cardsfolder/basking_rootwalla.txt delete mode 100644 res/cardsfolder/baton_of_courage.txt delete mode 100644 res/cardsfolder/battered_golem.txt delete mode 100644 res/cardsfolder/battering_craghorn.txt delete mode 100644 res/cardsfolder/battering_sliver.txt delete mode 100644 res/cardsfolder/battering_wurm.txt delete mode 100644 res/cardsfolder/batterskull.txt delete mode 100644 res/cardsfolder/battle_frenzy.txt delete mode 100644 res/cardsfolder/battle_hurda.txt delete mode 100644 res/cardsfolder/battle_mad_ronin.txt delete mode 100644 res/cardsfolder/battle_mastery.txt delete mode 100644 res/cardsfolder/battle_of_wits.txt delete mode 100644 res/cardsfolder/battle_rampart.txt delete mode 100644 res/cardsfolder/battle_rattle_shaman.txt delete mode 100644 res/cardsfolder/battle_screech.txt delete mode 100644 res/cardsfolder/battle_squadron.txt delete mode 100644 res/cardsfolder/battle_strain.txt delete mode 100644 res/cardsfolder/battlefield_forge.txt delete mode 100644 res/cardsfolder/battlefield_medic.txt delete mode 100644 res/cardsfolder/battlefield_percher.txt delete mode 100644 res/cardsfolder/battlegate_mimic.txt delete mode 100644 res/cardsfolder/battlegrace_angel.txt delete mode 100644 res/cardsfolder/battlegrowth.txt delete mode 100644 res/cardsfolder/battlewand_oak.txt delete mode 100644 res/cardsfolder/battlewise_aven.txt delete mode 100644 res/cardsfolder/bay_falcon.txt delete mode 100644 res/cardsfolder/bayou.txt delete mode 100644 res/cardsfolder/bayou_dragonfly.txt delete mode 100644 res/cardsfolder/bazaar_of_baghdad.txt delete mode 100644 res/cardsfolder/bazaar_of_wonders.txt delete mode 100644 res/cardsfolder/beacon_behemoth.txt delete mode 100644 res/cardsfolder/beacon_hawk.txt delete mode 100644 res/cardsfolder/beacon_of_creation.txt delete mode 100644 res/cardsfolder/beacon_of_destruction.txt delete mode 100644 res/cardsfolder/beacon_of_immortality.txt delete mode 100644 res/cardsfolder/beacon_of_tomorrows.txt delete mode 100644 res/cardsfolder/beacon_of_unrest.txt delete mode 100644 res/cardsfolder/bear_cub.txt delete mode 100644 res/cardsfolder/bear_umbra.txt delete mode 100644 res/cardsfolder/bearscape.txt delete mode 100644 res/cardsfolder/beast_attack.txt delete mode 100644 res/cardsfolder/beast_hunt.txt delete mode 100644 res/cardsfolder/beast_of_burden.txt delete mode 100644 res/cardsfolder/beast_within.txt delete mode 100644 res/cardsfolder/beastbreaker_of_bala_ged.txt delete mode 100644 res/cardsfolder/beastmaster_ascension.txt delete mode 100644 res/cardsfolder/beastmasters_magemark.txt delete mode 100644 res/cardsfolder/beasts_of_bogardan.txt delete mode 100644 res/cardsfolder/beckon_apparition.txt delete mode 100644 res/cardsfolder/bedlam.txt delete mode 100644 res/cardsfolder/bee_sting.txt delete mode 100644 res/cardsfolder/befoul.txt delete mode 100644 res/cardsfolder/behemoth_sledge.txt delete mode 100644 res/cardsfolder/belbes_armor.txt delete mode 100644 res/cardsfolder/belbes_percher.txt delete mode 100644 res/cardsfolder/belbes_portal.txt delete mode 100644 res/cardsfolder/belligerent_hatchling.txt delete mode 100644 res/cardsfolder/bellowing_fiend.txt delete mode 100644 res/cardsfolder/bellowing_tanglewurm.txt delete mode 100644 res/cardsfolder/belltower_sphinx.txt delete mode 100644 res/cardsfolder/beloved_chaplain.txt delete mode 100644 res/cardsfolder/ben_ben_akki_hermit.txt delete mode 100644 res/cardsfolder/benalish_cavalry.txt delete mode 100644 res/cardsfolder/benalish_emissary.txt delete mode 100644 res/cardsfolder/benalish_heralds.txt delete mode 100644 res/cardsfolder/benalish_knight.txt delete mode 100644 res/cardsfolder/benalish_missionary.txt delete mode 100644 res/cardsfolder/benalish_trapper.txt delete mode 100644 res/cardsfolder/benevolent_ancestor.txt delete mode 100644 res/cardsfolder/benevolent_bodyguard.txt delete mode 100644 res/cardsfolder/benevolent_unicorn.txt delete mode 100644 res/cardsfolder/benthic_behemoth.txt delete mode 100644 res/cardsfolder/benthic_djinn.txt delete mode 100644 res/cardsfolder/benthicore.txt delete mode 100644 res/cardsfolder/bequeathal.txt delete mode 100644 res/cardsfolder/bereavement.txt delete mode 100644 res/cardsfolder/berserk.txt delete mode 100644 res/cardsfolder/berserk_murlodont.txt delete mode 100644 res/cardsfolder/berserkers_of_blood_ridge.txt delete mode 100644 res/cardsfolder/beseech_the_queen.txt delete mode 100644 res/cardsfolder/bestial_fury.txt delete mode 100644 res/cardsfolder/bestial_menace.txt delete mode 100644 res/cardsfolder/betrayal.txt delete mode 100644 res/cardsfolder/betrayal_of_flesh.txt delete mode 100644 res/cardsfolder/betrothed_of_fire.txt delete mode 100644 res/cardsfolder/bewilder.txt delete mode 100644 res/cardsfolder/big_game_hunter.txt delete mode 100644 res/cardsfolder/bile_urchin.txt delete mode 100644 res/cardsfolder/bind.txt delete mode 100644 res/cardsfolder/binding_agony.txt delete mode 100644 res/cardsfolder/binding_grasp.txt delete mode 100644 res/cardsfolder/biomantic_mastery.txt delete mode 100644 res/cardsfolder/biorhythm.txt delete mode 100644 res/cardsfolder/birchlore_rangers.txt delete mode 100644 res/cardsfolder/bird_maiden.txt delete mode 100644 res/cardsfolder/birds_of_paradise.txt delete mode 100644 res/cardsfolder/biting_tether.txt delete mode 100644 res/cardsfolder/bitterblossom.txt delete mode 100644 res/cardsfolder/bituminous_blast.txt delete mode 100644 res/cardsfolder/black_carriage.txt delete mode 100644 res/cardsfolder/black_knight.txt delete mode 100644 res/cardsfolder/black_lotus.txt delete mode 100644 res/cardsfolder/black_mana_battery.txt delete mode 100644 res/cardsfolder/black_market.txt delete mode 100644 res/cardsfolder/black_poplar_shaman.txt delete mode 100644 res/cardsfolder/black_scarab.txt delete mode 100644 res/cardsfolder/black_suns_zenith.txt delete mode 100644 res/cardsfolder/black_vise.txt delete mode 100644 res/cardsfolder/black_ward.txt delete mode 100644 res/cardsfolder/blackcleave_cliffs.txt delete mode 100644 res/cardsfolder/blackcleave_goblin.txt delete mode 100644 res/cardsfolder/blade_of_the_bloodchief.txt delete mode 100644 res/cardsfolder/blade_of_the_sixth_pride.txt delete mode 100644 res/cardsfolder/blade_sliver.txt delete mode 100644 res/cardsfolder/blade_splicer.txt delete mode 100644 res/cardsfolder/blade_tribe_berserkers.txt delete mode 100644 res/cardsfolder/bladed_pinions.txt delete mode 100644 res/cardsfolder/bladed_sentinel.txt delete mode 100644 res/cardsfolder/blades_of_velis_vel.txt delete mode 100644 res/cardsfolder/bladetusk_boar.txt delete mode 100644 res/cardsfolder/bladewing_the_risen.txt delete mode 100644 res/cardsfolder/bladewings_thrall.txt delete mode 100644 res/cardsfolder/blanchwood_armor.txt delete mode 100644 res/cardsfolder/blanchwood_treefolk.txt delete mode 100644 res/cardsfolder/blanket_of_night.txt delete mode 100644 res/cardsfolder/blasted_landscape.txt delete mode 100644 res/cardsfolder/blaster_mage.txt delete mode 100644 res/cardsfolder/blasting_station.txt delete mode 100644 res/cardsfolder/blastoderm.txt delete mode 100644 res/cardsfolder/blatant_thievery.txt delete mode 100644 res/cardsfolder/blaze.txt delete mode 100644 res/cardsfolder/blazethorn_scarecrow.txt delete mode 100644 res/cardsfolder/blazing_archon.txt delete mode 100644 res/cardsfolder/blazing_shoal.txt delete mode 100644 res/cardsfolder/blazing_specter.txt delete mode 100644 res/cardsfolder/bleak_coven_vampires.txt delete mode 100644 res/cardsfolder/blessed_orator.txt delete mode 100644 res/cardsfolder/blessed_reversal.txt delete mode 100644 res/cardsfolder/blessed_wind.txt delete mode 100644 res/cardsfolder/blessed_wine.txt delete mode 100644 res/cardsfolder/blessing.txt delete mode 100644 res/cardsfolder/blessing_of_leeches.txt delete mode 100644 res/cardsfolder/blessing_of_the_nephilim.txt delete mode 100644 res/cardsfolder/blight.txt delete mode 100644 res/cardsfolder/blight_mamba.txt delete mode 100644 res/cardsfolder/blight_sickle.txt delete mode 100644 res/cardsfolder/blighted_agent.txt delete mode 100644 res/cardsfolder/blighted_shaman.txt delete mode 100644 res/cardsfolder/blightning.txt delete mode 100644 res/cardsfolder/blightsoil_druid.txt delete mode 100644 res/cardsfolder/blightspeaker.txt delete mode 100644 res/cardsfolder/blightsteel_colossus.txt delete mode 100644 res/cardsfolder/blightwidow.txt delete mode 100644 res/cardsfolder/blind_creeper.txt delete mode 100644 res/cardsfolder/blind_phantasm.txt delete mode 100644 res/cardsfolder/blind_spot_giant.txt delete mode 100644 res/cardsfolder/blind_with_anger.txt delete mode 100644 res/cardsfolder/blind_zealot.txt delete mode 100644 res/cardsfolder/blinding_light.txt delete mode 100644 res/cardsfolder/blinding_mage.txt delete mode 100644 res/cardsfolder/blinding_souleater.txt delete mode 100644 res/cardsfolder/blinking_spirit.txt delete mode 100644 res/cardsfolder/blinkmoth_infusion.txt delete mode 100644 res/cardsfolder/blinkmoth_nexus.txt delete mode 100644 res/cardsfolder/blinkmoth_well.txt delete mode 100644 res/cardsfolder/blister_beetle.txt delete mode 100644 res/cardsfolder/blistergrub.txt delete mode 100644 res/cardsfolder/blistering_barrier.txt delete mode 100644 res/cardsfolder/blistering_dieflyn.txt delete mode 100644 res/cardsfolder/blistering_firecat.txt delete mode 100644 res/cardsfolder/blisterstick_shaman.txt delete mode 100644 res/cardsfolder/blitz_hellion.txt delete mode 100644 res/cardsfolder/blizzard.txt delete mode 100644 res/cardsfolder/blizzard_elemental.txt delete mode 100644 res/cardsfolder/bloated_toad.txt delete mode 100644 res/cardsfolder/blockade_runner.txt delete mode 100644 res/cardsfolder/blockbuster.txt delete mode 100644 res/cardsfolder/blood_celebrant.txt delete mode 100644 res/cardsfolder/blood_crypt.txt delete mode 100644 res/cardsfolder/blood_cultist.txt delete mode 100644 res/cardsfolder/blood_frenzy.txt delete mode 100644 res/cardsfolder/blood_hound.txt delete mode 100644 res/cardsfolder/blood_knight.txt delete mode 100644 res/cardsfolder/blood_moon.txt delete mode 100644 res/cardsfolder/blood_pet.txt delete mode 100644 res/cardsfolder/blood_rites.txt delete mode 100644 res/cardsfolder/blood_seeker.txt delete mode 100644 res/cardsfolder/blood_speaker.txt delete mode 100644 res/cardsfolder/blood_tithe.txt delete mode 100644 res/cardsfolder/blood_tyrant.txt delete mode 100644 res/cardsfolder/blood_vassal.txt delete mode 100644 res/cardsfolder/bloodbraid_elf.txt delete mode 100644 res/cardsfolder/bloodcurdling_scream.txt delete mode 100644 res/cardsfolder/bloodfire_colossus.txt delete mode 100644 res/cardsfolder/bloodfire_dwarf.txt delete mode 100644 res/cardsfolder/bloodfire_infusion.txt delete mode 100644 res/cardsfolder/bloodfire_kavu.txt delete mode 100644 res/cardsfolder/bloodghast.txt delete mode 100644 res/cardsfolder/bloodhall_ooze.txt delete mode 100644 res/cardsfolder/bloodhusk_ritualist.txt delete mode 100644 res/cardsfolder/bloodied_ghost.txt delete mode 100644 res/cardsfolder/bloodletter_quill.txt delete mode 100644 res/cardsfolder/bloodmark_mentor.txt delete mode 100644 res/cardsfolder/bloodpyre_elemental.txt delete mode 100644 res/cardsfolder/bloodrite_invoker.txt delete mode 100644 res/cardsfolder/bloodrock_cyclops.txt delete mode 100644 res/cardsfolder/bloodscale_prowler.txt delete mode 100644 res/cardsfolder/bloodscent.txt delete mode 100644 res/cardsfolder/bloodshed_fever.txt delete mode 100644 res/cardsfolder/bloodshot_cyclops.txt delete mode 100644 res/cardsfolder/bloodshot_trainee.txt delete mode 100644 res/cardsfolder/bloodstained_mire.txt delete mode 100644 res/cardsfolder/bloodstoke_howler.txt delete mode 100644 res/cardsfolder/bloodstone_cameo.txt delete mode 100644 res/cardsfolder/bloodthirsty_ogre.txt delete mode 100644 res/cardsfolder/bloodthorn_taunter.txt delete mode 100644 res/cardsfolder/bloodthrone_vampire.txt delete mode 100644 res/cardsfolder/blossoming_wreath.txt delete mode 100644 res/cardsfolder/blue_elemental_blast.txt delete mode 100644 res/cardsfolder/blue_mana_battery.txt delete mode 100644 res/cardsfolder/blue_scarab.txt delete mode 100644 res/cardsfolder/blue_suns_zenith.txt delete mode 100644 res/cardsfolder/blue_ward.txt delete mode 100644 res/cardsfolder/blunt_the_assault.txt delete mode 100644 res/cardsfolder/blurred_mongoose.txt delete mode 100644 res/cardsfolder/boa_constrictor.txt delete mode 100644 res/cardsfolder/boar_umbra.txt delete mode 100644 res/cardsfolder/boartusk_liege.txt delete mode 100644 res/cardsfolder/body_of_jukai.txt delete mode 100644 res/cardsfolder/bog_glider.txt delete mode 100644 res/cardsfolder/bog_gnarr.txt delete mode 100644 res/cardsfolder/bog_hoodlums.txt delete mode 100644 res/cardsfolder/bog_imp.txt delete mode 100644 res/cardsfolder/bog_initiate.txt delete mode 100644 res/cardsfolder/bog_raiders.txt delete mode 100644 res/cardsfolder/bog_rats.txt delete mode 100644 res/cardsfolder/bog_serpent.txt delete mode 100644 res/cardsfolder/bog_smugglers.txt delete mode 100644 res/cardsfolder/bog_strider_ash.txt delete mode 100644 res/cardsfolder/bog_tatters.txt delete mode 100644 res/cardsfolder/bog_witch.txt delete mode 100644 res/cardsfolder/bog_wraith.txt delete mode 100644 res/cardsfolder/bog_wreckage.txt delete mode 100644 res/cardsfolder/bogardan_firefiend.txt delete mode 100644 res/cardsfolder/bogardan_hellkite.txt delete mode 100644 res/cardsfolder/bogardan_lancer.txt delete mode 100644 res/cardsfolder/bogardan_rager.txt delete mode 100644 res/cardsfolder/boggart_arsonists.txt delete mode 100644 res/cardsfolder/boggart_birth_rite.txt delete mode 100644 res/cardsfolder/boggart_forager.txt delete mode 100644 res/cardsfolder/boggart_harbinger.txt delete mode 100644 res/cardsfolder/boggart_loggers.txt delete mode 100644 res/cardsfolder/boggart_mob.txt delete mode 100644 res/cardsfolder/boggart_ram_gang.txt delete mode 100644 res/cardsfolder/boggart_shenanigans.txt delete mode 100644 res/cardsfolder/boggart_sprite_chaser.txt delete mode 100644 res/cardsfolder/boil.txt delete mode 100644 res/cardsfolder/boiling_blood.txt delete mode 100644 res/cardsfolder/boiling_seas.txt delete mode 100644 res/cardsfolder/bojuka_bog.txt delete mode 100644 res/cardsfolder/bojuka_brigand.txt delete mode 100644 res/cardsfolder/bola_warrior.txt delete mode 100644 res/cardsfolder/boldwyr_heavyweights.txt delete mode 100644 res/cardsfolder/bonded_fetch.txt delete mode 100644 res/cardsfolder/bonds_of_quicksilver.txt delete mode 100644 res/cardsfolder/bone_flute.txt delete mode 100644 res/cardsfolder/bone_harvest.txt delete mode 100644 res/cardsfolder/bone_saw.txt delete mode 100644 res/cardsfolder/bone_shredder.txt delete mode 100644 res/cardsfolder/bone_splinters.txt delete mode 100644 res/cardsfolder/bonehoard.txt delete mode 100644 res/cardsfolder/boneknitter.txt delete mode 100644 res/cardsfolder/boneshard_slasher.txt delete mode 100644 res/cardsfolder/bonesplitter.txt delete mode 100644 res/cardsfolder/bonesplitter_sliver.txt delete mode 100644 res/cardsfolder/bonethorn_valesk.txt delete mode 100644 res/cardsfolder/book_of_rass.txt delete mode 100644 res/cardsfolder/boomerang.txt delete mode 100644 res/cardsfolder/boon_reflection.txt delete mode 100644 res/cardsfolder/borborygmos.txt delete mode 100644 res/cardsfolder/border_guard.txt delete mode 100644 res/cardsfolder/border_patrol.txt delete mode 100644 res/cardsfolder/borderland_behemoth.txt delete mode 100644 res/cardsfolder/borderland_ranger.txt delete mode 100644 res/cardsfolder/boreal_centaur.txt delete mode 100644 res/cardsfolder/boreal_druid.txt delete mode 100644 res/cardsfolder/boreal_griffin.txt delete mode 100644 res/cardsfolder/boreal_shelf.txt delete mode 100644 res/cardsfolder/boris_devilboon.txt delete mode 100644 res/cardsfolder/boros_garrison.txt delete mode 100644 res/cardsfolder/boros_guildmage.txt delete mode 100644 res/cardsfolder/boros_recruit.txt delete mode 100644 res/cardsfolder/boros_signet.txt delete mode 100644 res/cardsfolder/boros_swiftblade.txt delete mode 100644 res/cardsfolder/borrowing_100000_arrows.txt delete mode 100644 res/cardsfolder/borrowing_the_east_wind.txt delete mode 100644 res/cardsfolder/bosh_iron_golem.txt delete mode 100644 res/cardsfolder/bosk_banneret.txt delete mode 100644 res/cardsfolder/bottle_gnomes.txt delete mode 100644 res/cardsfolder/bottle_of_suleiman.txt delete mode 100644 res/cardsfolder/bottomless_pit.txt delete mode 100644 res/cardsfolder/bottomless_vault.txt delete mode 100644 res/cardsfolder/bouncing_beebles.txt delete mode 100644 res/cardsfolder/bound_in_silence.txt delete mode 100644 res/cardsfolder/bounteous_kirin.txt delete mode 100644 res/cardsfolder/bountiful_harvest.txt delete mode 100644 res/cardsfolder/bounty_hunter.txt delete mode 100644 res/cardsfolder/brackwater_elemental.txt delete mode 100644 res/cardsfolder/braid_of_fire.txt delete mode 100644 res/cardsfolder/braids_cabal_minion.txt delete mode 100644 res/cardsfolder/braids_conjurer_adept.txt delete mode 100644 res/cardsfolder/braidwood_cup.txt delete mode 100644 res/cardsfolder/braidwood_sextant.txt delete mode 100644 res/cardsfolder/brain_freeze.txt delete mode 100644 res/cardsfolder/brainbite.txt delete mode 100644 res/cardsfolder/braingeyser.txt delete mode 100644 res/cardsfolder/brainspoil.txt delete mode 100644 res/cardsfolder/brainstorm.txt delete mode 100644 res/cardsfolder/bramble_creeper.txt delete mode 100644 res/cardsfolder/bramblesnap.txt delete mode 100644 res/cardsfolder/branching_bolt.txt delete mode 100644 res/cardsfolder/branchsnap_lorian.txt delete mode 100644 res/cardsfolder/branded_brawlers.txt delete mode 100644 res/cardsfolder/brass_gnat.txt delete mode 100644 res/cardsfolder/brass_herald.txt delete mode 100644 res/cardsfolder/brass_man.txt delete mode 100644 res/cardsfolder/brass_secretary.txt delete mode 100644 res/cardsfolder/brass_squire.txt delete mode 100644 res/cardsfolder/brass_talon_chimera.txt delete mode 100644 res/cardsfolder/brassclaw_orcs.txt delete mode 100644 res/cardsfolder/bravado.txt delete mode 100644 res/cardsfolder/brave_the_elements.txt delete mode 100644 res/cardsfolder/brawn.txt delete mode 100644 res/cardsfolder/breach.txt delete mode 100644 res/cardsfolder/break_asunder.txt delete mode 100644 res/cardsfolder/breath_of_life.txt delete mode 100644 res/cardsfolder/breath_of_malfegor.txt delete mode 100644 res/cardsfolder/breathstealer.txt delete mode 100644 res/cardsfolder/breeding_pit.txt delete mode 100644 res/cardsfolder/breeding_pool.txt delete mode 100644 res/cardsfolder/briar_patch.txt delete mode 100644 res/cardsfolder/briar_shield.txt delete mode 100644 res/cardsfolder/briarberry_cohort.txt delete mode 100644 res/cardsfolder/briarhorn.txt delete mode 100644 res/cardsfolder/briarknit_kami.txt delete mode 100644 res/cardsfolder/bribery.txt delete mode 100644 res/cardsfolder/bridge_from_below.txt delete mode 100644 res/cardsfolder/brighthearth_banneret.txt delete mode 100644 res/cardsfolder/brightstone_ritual.txt delete mode 100644 res/cardsfolder/brilliant_halo.txt delete mode 100644 res/cardsfolder/brilliant_plan.txt delete mode 100644 res/cardsfolder/brilliant_ultimatum.txt delete mode 100644 res/cardsfolder/brimstone_dragon.txt delete mode 100644 res/cardsfolder/brimstone_mage.txt delete mode 100644 res/cardsfolder/brindle_boar.txt delete mode 100644 res/cardsfolder/brine_shaman.txt delete mode 100644 res/cardsfolder/bringer_of_the_black_dawn.txt delete mode 100644 res/cardsfolder/bringer_of_the_blue_dawn.txt delete mode 100644 res/cardsfolder/bringer_of_the_green_dawn.txt delete mode 100644 res/cardsfolder/bringer_of_the_red_dawn.txt delete mode 100644 res/cardsfolder/bringer_of_the_white_dawn.txt delete mode 100644 res/cardsfolder/brink_of_madness.txt delete mode 100644 res/cardsfolder/brion_stoutarm.txt delete mode 100644 res/cardsfolder/brittle_effigy.txt delete mode 100644 res/cardsfolder/broken_ambitions.txt delete mode 100644 res/cardsfolder/broken_dam.txt delete mode 100644 res/cardsfolder/broken_fall.txt delete mode 100644 res/cardsfolder/broken_visage.txt delete mode 100644 res/cardsfolder/brood_birthing.txt delete mode 100644 res/cardsfolder/brood_of_cockroaches.txt delete mode 100644 res/cardsfolder/brood_sliver.txt delete mode 100644 res/cardsfolder/broodhatch_nantuko.txt delete mode 100644 res/cardsfolder/broodmate_dragon.txt delete mode 100644 res/cardsfolder/broodstar.txt delete mode 100644 res/cardsfolder/broodwarden.txt delete mode 100644 res/cardsfolder/brothers_of_fire.txt delete mode 100644 res/cardsfolder/brown_ouphe.txt delete mode 100644 res/cardsfolder/browse.txt delete mode 100644 res/cardsfolder/brush_with_death.txt delete mode 100644 res/cardsfolder/brushland.txt delete mode 100644 res/cardsfolder/brushwagg.txt delete mode 100644 res/cardsfolder/brutal_nightstalker.txt delete mode 100644 res/cardsfolder/brute_force.txt delete mode 100644 res/cardsfolder/bubble_matrix.txt delete mode 100644 res/cardsfolder/bubbling_beebles.txt delete mode 100644 res/cardsfolder/bubbling_muck.txt delete mode 100644 res/cardsfolder/bull_aurochs.txt delete mode 100644 res/cardsfolder/bull_cerodon.txt delete mode 100644 res/cardsfolder/bull_hippo.txt delete mode 100644 res/cardsfolder/bull_rush.txt delete mode 100644 res/cardsfolder/bullwhip.txt delete mode 100644 res/cardsfolder/buoyancy.txt delete mode 100644 res/cardsfolder/burden_of_greed.txt delete mode 100644 res/cardsfolder/burgeoning.txt delete mode 100644 res/cardsfolder/buried_alive.txt delete mode 100644 res/cardsfolder/burn_the_impure.txt delete mode 100644 res/cardsfolder/burning_cloak.txt delete mode 100644 res/cardsfolder/burning_fields.txt delete mode 100644 res/cardsfolder/burning_inquiry.txt delete mode 100644 res/cardsfolder/burning_shield_askari.txt delete mode 100644 res/cardsfolder/burr_grafter.txt delete mode 100644 res/cardsfolder/burrenton_bombardier.txt delete mode 100644 res/cardsfolder/burrowing.txt delete mode 100644 res/cardsfolder/burst_lightning.txt delete mode 100644 res/cardsfolder/burst_of_energy.txt delete mode 100644 res/cardsfolder/burst_of_speed.txt delete mode 100644 res/cardsfolder/butcher_of_malakir.txt delete mode 100644 res/cardsfolder/cabal_archon.txt delete mode 100644 res/cardsfolder/cabal_coffers.txt delete mode 100644 res/cardsfolder/cabal_conditioning.txt delete mode 100644 res/cardsfolder/cabal_executioner.txt delete mode 100644 res/cardsfolder/cabal_inquisitor.txt delete mode 100644 res/cardsfolder/cabal_patriarch.txt delete mode 100644 res/cardsfolder/cabal_pit.txt delete mode 100644 res/cardsfolder/cabal_ritual.txt delete mode 100644 res/cardsfolder/cabal_slaver.txt delete mode 100644 res/cardsfolder/cabal_surgeon.txt delete mode 100644 res/cardsfolder/cabal_torturer.txt delete mode 100644 res/cardsfolder/cabal_trainee.txt delete mode 100644 res/cardsfolder/cache_raiders.txt delete mode 100644 res/cardsfolder/cackling_fiend.txt delete mode 100644 res/cardsfolder/cackling_flames.txt delete mode 100644 res/cardsfolder/cackling_imp.txt delete mode 100755 res/cardsfolder/cackling_witch.txt delete mode 100644 res/cardsfolder/cadaver_imp.txt delete mode 100644 res/cardsfolder/cadaverous_bloom.txt delete mode 100644 res/cardsfolder/cadaverous_knight.txt delete mode 100644 res/cardsfolder/cage_of_hands.txt delete mode 100644 res/cardsfolder/cagemail.txt delete mode 100644 res/cardsfolder/calciderm.txt delete mode 100644 res/cardsfolder/calciform_pools.txt delete mode 100644 res/cardsfolder/calcite_snapper.txt delete mode 100644 res/cardsfolder/caldera_hellion.txt delete mode 100644 res/cardsfolder/caldera_lake.txt delete mode 100644 res/cardsfolder/call_for_blood.txt delete mode 100644 res/cardsfolder/call_of_the_herd.txt delete mode 100644 res/cardsfolder/call_of_the_wild.txt delete mode 100644 res/cardsfolder/call_the_skybreaker.txt delete mode 100644 res/cardsfolder/call_to_glory.txt delete mode 100644 res/cardsfolder/call_to_heel.txt delete mode 100644 res/cardsfolder/call_to_mind.txt delete mode 100644 res/cardsfolder/call_to_the_grave.txt delete mode 100644 res/cardsfolder/call_to_the_netherworld.txt delete mode 100644 res/cardsfolder/caller_of_gales.txt delete mode 100644 res/cardsfolder/caller_of_the_claw.txt delete mode 100644 res/cardsfolder/callous_giant.txt delete mode 100644 res/cardsfolder/calming_verse.txt delete mode 100644 res/cardsfolder/caltrops.txt delete mode 100644 res/cardsfolder/cancel.txt delete mode 100644 res/cardsfolder/candelabra_of_tawnos.txt delete mode 100644 res/cardsfolder/canker_abomination.txt delete mode 100644 res/cardsfolder/canopy_cover.txt delete mode 100644 res/cardsfolder/canopy_spider.txt delete mode 100644 res/cardsfolder/cantivore.txt delete mode 100644 res/cardsfolder/canyon_drake.txt delete mode 100644 res/cardsfolder/canyon_minotaur.txt delete mode 100644 res/cardsfolder/canyon_wildcat.txt delete mode 100644 res/cardsfolder/cao_cao_lord_of_wei.txt delete mode 100644 res/cardsfolder/cao_ren_wei_commander.txt delete mode 100644 res/cardsfolder/capashen_knight.txt delete mode 100644 res/cardsfolder/capashen_standard.txt delete mode 100644 res/cardsfolder/capashen_templar.txt delete mode 100644 res/cardsfolder/capashen_unicorn.txt delete mode 100644 res/cardsfolder/capricious_sorcerer.txt delete mode 100644 res/cardsfolder/capsize.txt delete mode 100644 res/cardsfolder/captain_of_the_watch.txt delete mode 100644 res/cardsfolder/captain_sisay.txt delete mode 100644 res/cardsfolder/captivating_vampire.txt delete mode 100644 res/cardsfolder/captive_flame.txt delete mode 100644 res/cardsfolder/capture_of_jingzhou.txt delete mode 100644 res/cardsfolder/captured_sunlight.txt delete mode 100644 res/cardsfolder/carapace_forger.txt delete mode 100644 res/cardsfolder/caravan_escort.txt delete mode 100644 res/cardsfolder/caravan_hurda.txt delete mode 100644 res/cardsfolder/carbonize.txt delete mode 100644 res/cardsfolder/careful_consideration.txt delete mode 100644 res/cardsfolder/careful_study.txt delete mode 100644 res/cardsfolder/caress_of_phyrexia.txt delete mode 100644 res/cardsfolder/caribou_range.txt delete mode 100644 res/cardsfolder/carnage_altar.txt delete mode 100644 res/cardsfolder/carnassid.txt delete mode 100644 res/cardsfolder/carnifex_demon.txt delete mode 100644 res/cardsfolder/carnival_of_souls.txt delete mode 100644 res/cardsfolder/carnivorous_plant.txt delete mode 100644 res/cardsfolder/carnophage.txt delete mode 100644 res/cardsfolder/carrier_pigeons.txt delete mode 100644 res/cardsfolder/carrion.txt delete mode 100644 res/cardsfolder/carrion_ants.txt delete mode 100644 res/cardsfolder/carrion_call.txt delete mode 100644 res/cardsfolder/carrion_feeder.txt delete mode 100644 res/cardsfolder/carrion_howler.txt delete mode 100644 res/cardsfolder/carrion_thrash.txt delete mode 100644 res/cardsfolder/carrion_wall.txt delete mode 100644 res/cardsfolder/cartographer.txt delete mode 100644 res/cardsfolder/carven_caryatid.txt delete mode 100644 res/cardsfolder/cascade_bluffs.txt delete mode 100644 res/cardsfolder/castigate.txt delete mode 100644 res/cardsfolder/casting_of_bones.txt delete mode 100644 res/cardsfolder/castle.txt delete mode 100644 res/cardsfolder/castle_raptors.txt delete mode 100644 res/cardsfolder/castle_sengir.txt delete mode 100644 res/cardsfolder/cat_burglar.txt delete mode 100644 res/cardsfolder/cat_warriors.txt delete mode 100644 res/cardsfolder/catalog.txt delete mode 100644 res/cardsfolder/catapult_master.txt delete mode 100644 res/cardsfolder/catapult_squad.txt delete mode 100644 res/cardsfolder/catastrophe.txt delete mode 100644 res/cardsfolder/cateran_brute.txt delete mode 100644 res/cardsfolder/cateran_enforcer.txt delete mode 100644 res/cardsfolder/cateran_kidnappers.txt delete mode 100644 res/cardsfolder/cateran_overlord.txt delete mode 100644 res/cardsfolder/cateran_persuader.txt delete mode 100644 res/cardsfolder/cateran_slaver.txt delete mode 100644 res/cardsfolder/cateran_summons.txt delete mode 100644 res/cardsfolder/cathartic_adept.txt delete mode 100644 res/cardsfolder/cathodion.txt delete mode 100644 res/cardsfolder/cauldron_haze.txt delete mode 100644 res/cardsfolder/cauldron_of_souls.txt delete mode 100644 res/cardsfolder/caustic_crawler.txt delete mode 100644 res/cardsfolder/caustic_hound.txt delete mode 100644 res/cardsfolder/caustic_rain.txt delete mode 100644 res/cardsfolder/caustic_tar.txt delete mode 100644 res/cardsfolder/caustic_wasps.txt delete mode 100644 res/cardsfolder/cavalry_master.txt delete mode 100644 res/cardsfolder/cave_in.txt delete mode 100644 res/cardsfolder/cave_people.txt delete mode 100644 res/cardsfolder/cave_sense.txt delete mode 100644 res/cardsfolder/cave_tiger.txt delete mode 100644 res/cardsfolder/cavern_crawler.txt delete mode 100644 res/cardsfolder/cavern_harpy.txt delete mode 100644 res/cardsfolder/cavern_thoctar.txt delete mode 100644 res/cardsfolder/caverns_of_despair.txt delete mode 100644 res/cardsfolder/caves_of_koilos.txt delete mode 100644 res/cardsfolder/celestial_ancient.txt delete mode 100644 res/cardsfolder/celestial_colonnade.txt delete mode 100644 res/cardsfolder/celestial_crusader.txt delete mode 100644 res/cardsfolder/celestial_gatekeeper.txt delete mode 100644 res/cardsfolder/celestial_kirin.txt delete mode 100644 res/cardsfolder/celestial_mantle.txt delete mode 100644 res/cardsfolder/celestial_prism.txt delete mode 100644 res/cardsfolder/celestial_purge.txt delete mode 100644 res/cardsfolder/celestial_sword.txt delete mode 100644 res/cardsfolder/cemetery_gate.txt delete mode 100644 res/cardsfolder/cemetery_reaper.txt delete mode 100644 res/cardsfolder/cenns_enlistment.txt delete mode 100644 res/cardsfolder/cenns_heir.txt delete mode 100644 res/cardsfolder/centaur_archer.txt delete mode 100644 res/cardsfolder/centaur_chieftain.txt delete mode 100644 res/cardsfolder/centaur_courser.txt delete mode 100644 res/cardsfolder/centaur_garden.txt delete mode 100644 res/cardsfolder/centaur_glade.txt delete mode 100644 res/cardsfolder/centaur_omenreader.txt delete mode 100644 res/cardsfolder/centaur_rootcaster.txt delete mode 100644 res/cardsfolder/centaur_safeguard.txt delete mode 100644 res/cardsfolder/centaur_veteran.txt delete mode 100644 res/cardsfolder/cephalid_aristocrat.txt delete mode 100644 res/cardsfolder/cephalid_broker.txt delete mode 100644 res/cardsfolder/cephalid_coliseum.txt delete mode 100644 res/cardsfolder/cephalid_illusionist.txt delete mode 100644 res/cardsfolder/cephalid_inkshrouder.txt delete mode 100644 res/cardsfolder/cephalid_looter.txt delete mode 100644 res/cardsfolder/cephalid_pathmage.txt delete mode 100644 res/cardsfolder/cephalid_retainer.txt delete mode 100644 res/cardsfolder/cephalid_sage.txt delete mode 100644 res/cardsfolder/cephalid_scout.txt delete mode 100644 res/cardsfolder/cephalid_snitch.txt delete mode 100644 res/cardsfolder/cephalid_vandal.txt delete mode 100644 res/cardsfolder/cerebral_eruption.txt delete mode 100755 res/cardsfolder/ceremonial_guard.txt delete mode 100644 res/cardsfolder/cerodon_yearling.txt delete mode 100644 res/cardsfolder/cerulean_sphinx.txt delete mode 100644 res/cardsfolder/cerulean_wisps.txt delete mode 100644 res/cardsfolder/cerulean_wyvern.txt delete mode 100644 res/cardsfolder/cessation.txt delete mode 100644 res/cardsfolder/ceta_disciple.txt delete mode 100644 res/cardsfolder/ceta_sanctuary.txt delete mode 100644 res/cardsfolder/chain_reaction.txt delete mode 100644 res/cardsfolder/chainbreaker.txt delete mode 100644 res/cardsfolder/chained_throatseeker.txt delete mode 100644 res/cardsfolder/chainer_dementia_master.txt delete mode 100644 res/cardsfolder/chainers_edict.txt delete mode 100644 res/cardsfolder/chainflinger.txt delete mode 100644 res/cardsfolder/chalice_of_the_void.txt delete mode 100644 res/cardsfolder/chambered_nautilus.txt delete mode 100644 res/cardsfolder/chameleon_colossus.txt delete mode 100644 res/cardsfolder/champion_lancer.txt delete mode 100644 res/cardsfolder/champions_drake.txt delete mode 100644 res/cardsfolder/champions_victory.txt delete mode 100644 res/cardsfolder/chandler.txt delete mode 100644 res/cardsfolder/chandra_nalaar.txt delete mode 100644 res/cardsfolder/chandras_outrage.txt delete mode 100644 res/cardsfolder/chandras_spitfire.txt delete mode 100644 res/cardsfolder/change_of_heart.txt delete mode 100644 res/cardsfolder/changeling_berserker.txt delete mode 100644 res/cardsfolder/changeling_hero.txt delete mode 100644 res/cardsfolder/changeling_sentinel.txt delete mode 100644 res/cardsfolder/changeling_titan.txt delete mode 100644 res/cardsfolder/channel.txt delete mode 100644 res/cardsfolder/channel_the_suns.txt delete mode 100644 res/cardsfolder/chaos_charm.txt delete mode 100644 res/cardsfolder/chaosphere.txt delete mode 100644 res/cardsfolder/char.txt delete mode 100644 res/cardsfolder/char_rumbler.txt delete mode 100644 res/cardsfolder/charcoal_diamond.txt delete mode 100644 res/cardsfolder/charging_bandits.txt delete mode 100644 res/cardsfolder/charging_paladin.txt delete mode 100644 res/cardsfolder/charging_rhino.txt delete mode 100644 res/cardsfolder/charging_slateback.txt delete mode 100644 res/cardsfolder/charging_troll.txt delete mode 100755 res/cardsfolder/charmed_griffin.txt delete mode 100644 res/cardsfolder/charnelhoard_wurm.txt delete mode 100644 res/cardsfolder/chartooth_cougar.txt delete mode 100644 res/cardsfolder/chastise.txt delete mode 100644 res/cardsfolder/chatter_of_the_squirrel.txt delete mode 100644 res/cardsfolder/chieftain_en_dal.txt delete mode 100644 res/cardsfolder/child_of_alara.txt delete mode 100644 res/cardsfolder/child_of_gaea.txt delete mode 100644 res/cardsfolder/child_of_night.txt delete mode 100644 res/cardsfolder/child_of_thorns.txt delete mode 100644 res/cardsfolder/childhood_horror.txt delete mode 100644 res/cardsfolder/chill.txt delete mode 100644 res/cardsfolder/chill_to_the_bone.txt delete mode 100644 res/cardsfolder/chilling_apparition.txt delete mode 100644 res/cardsfolder/chilling_shade.txt delete mode 100644 res/cardsfolder/chime_of_night.txt delete mode 100644 res/cardsfolder/chimeric_coils.txt delete mode 100644 res/cardsfolder/chimeric_egg.txt delete mode 100644 res/cardsfolder/chimeric_idol.txt delete mode 100644 res/cardsfolder/chimeric_mass.txt delete mode 100644 res/cardsfolder/chimeric_staff.txt delete mode 100644 res/cardsfolder/chimney_imp.txt delete mode 100644 res/cardsfolder/chittering_rats.txt delete mode 100755 res/cardsfolder/cho_arrim_bruiser.txt delete mode 100644 res/cardsfolder/cho_manno_revolutionary.txt delete mode 100644 res/cardsfolder/choke.txt delete mode 100644 res/cardsfolder/choking_fumes.txt delete mode 100644 res/cardsfolder/choking_sands.txt delete mode 100644 res/cardsfolder/choking_tethers.txt delete mode 100644 res/cardsfolder/chorus_of_woe.txt delete mode 100644 res/cardsfolder/chromatic_sphere.txt delete mode 100644 res/cardsfolder/chromatic_star.txt delete mode 100644 res/cardsfolder/chrome_steed.txt delete mode 100644 res/cardsfolder/chromescale_drake.txt delete mode 100644 res/cardsfolder/chromium.txt delete mode 100644 res/cardsfolder/chronatog.txt delete mode 100644 res/cardsfolder/chronatog_totem.txt delete mode 100644 res/cardsfolder/chronosavant.txt delete mode 100644 res/cardsfolder/chub_toad.txt delete mode 100644 res/cardsfolder/churning_eddy.txt delete mode 100644 res/cardsfolder/cinder_crawler.txt delete mode 100644 res/cardsfolder/cinder_elemental.txt delete mode 100644 res/cardsfolder/cinder_giant.txt delete mode 100644 res/cardsfolder/cinder_marsh.txt delete mode 100644 res/cardsfolder/cinder_pyromancer.txt delete mode 100644 res/cardsfolder/cinder_shade.txt delete mode 100644 res/cardsfolder/cinder_storm.txt delete mode 100644 res/cardsfolder/cinder_wall.txt delete mode 100644 res/cardsfolder/cinderbones.txt delete mode 100644 res/cardsfolder/cinderhaze_wretch.txt delete mode 100644 res/cardsfolder/circular_logic.txt delete mode 100644 res/cardsfolder/citanul_centaurs.txt delete mode 100644 res/cardsfolder/citanul_druid.txt delete mode 100644 res/cardsfolder/citanul_flute.txt delete mode 100644 res/cardsfolder/citanul_hierophants.txt delete mode 100644 res/cardsfolder/citanul_woodreaders.txt delete mode 100644 res/cardsfolder/city_of_brass.txt delete mode 100644 res/cardsfolder/city_of_shadows.txt delete mode 100644 res/cardsfolder/city_of_traitors.txt delete mode 100644 res/cardsfolder/civic_guildmage.txt delete mode 100644 res/cardsfolder/civic_wayfinder.txt delete mode 100644 res/cardsfolder/clairvoyance.txt delete mode 100644 res/cardsfolder/claws_of_gix.txt delete mode 100644 res/cardsfolder/claws_of_valakut.txt delete mode 100644 res/cardsfolder/claws_of_wirewood.txt delete mode 100644 res/cardsfolder/clay_statue.txt delete mode 100644 res/cardsfolder/cleanfall.txt delete mode 100644 res/cardsfolder/cleanse.txt delete mode 100644 res/cardsfolder/clear.txt delete mode 100644 res/cardsfolder/clearwater_goblet.txt delete mode 100644 res/cardsfolder/clergy_en_vec.txt delete mode 100644 res/cardsfolder/clickslither.txt delete mode 100644 res/cardsfolder/cliff_threader.txt delete mode 100644 res/cardsfolder/cliffrunner_behemoth.txt delete mode 100644 res/cardsfolder/clinging_darkness.txt delete mode 100644 res/cardsfolder/cloak_of_feathers.txt delete mode 100644 res/cardsfolder/cloak_of_mists.txt delete mode 100644 res/cardsfolder/clock_of_omens.txt delete mode 100644 res/cardsfolder/clockwork_beetle.txt delete mode 100644 res/cardsfolder/clockwork_condor.txt delete mode 100644 res/cardsfolder/clockwork_dragon.txt delete mode 100644 res/cardsfolder/clockwork_gnomes.txt delete mode 100644 res/cardsfolder/clockwork_vorrac.txt delete mode 100644 res/cardsfolder/clone.txt delete mode 100644 res/cardsfolder/close_quarters.txt delete mode 100644 res/cardsfolder/clot_sliver.txt delete mode 100644 res/cardsfolder/cloud_crusader.txt delete mode 100644 res/cardsfolder/cloud_djinn.txt delete mode 100644 res/cardsfolder/cloud_dragon.txt delete mode 100644 res/cardsfolder/cloud_elemental.txt delete mode 100644 res/cardsfolder/cloud_of_faeries.txt delete mode 100644 res/cardsfolder/cloud_pirates.txt delete mode 100644 res/cardsfolder/cloud_spirit.txt delete mode 100644 res/cardsfolder/cloud_sprite.txt delete mode 100644 res/cardsfolder/cloudchaser_eagle.txt delete mode 100644 res/cardsfolder/cloudchaser_kestrel.txt delete mode 100644 res/cardsfolder/cloudcrest_lake.txt delete mode 100644 res/cardsfolder/cloudcrown_oak.txt delete mode 100644 res/cardsfolder/cloudgoat_ranger.txt delete mode 100644 res/cardsfolder/cloudheath_drake.txt delete mode 100644 res/cardsfolder/cloudhoof_kirin.txt delete mode 100644 res/cardsfolder/cloudpost.txt delete mode 100644 res/cardsfolder/cloudreach_cavalry.txt delete mode 100644 res/cardsfolder/cloudseeder.txt delete mode 100644 res/cardsfolder/cloudskate.txt delete mode 100644 res/cardsfolder/cloudthresher.txt delete mode 100644 res/cardsfolder/clout_of_the_dominus.txt delete mode 100644 res/cardsfolder/clutch_of_the_undercity.txt delete mode 100644 res/cardsfolder/clutch_of_undeath.txt delete mode 100644 res/cardsfolder/coal_golem.txt delete mode 100644 res/cardsfolder/coast_watcher.txt delete mode 100644 res/cardsfolder/coastal_drake.txt delete mode 100644 res/cardsfolder/coastal_hornclaw.txt delete mode 100644 res/cardsfolder/coastal_piracy.txt delete mode 100644 res/cardsfolder/coastal_tower.txt delete mode 100644 res/cardsfolder/coat_of_arms.txt delete mode 100644 res/cardsfolder/cobalt_golem.txt delete mode 100644 res/cardsfolder/cockatrice.txt delete mode 100644 res/cardsfolder/coercion.txt delete mode 100644 res/cardsfolder/coffin_puppets.txt delete mode 100644 res/cardsfolder/coffin_purge.txt delete mode 100644 res/cardsfolder/cognivore.txt delete mode 100644 res/cardsfolder/coiled_tinviper.txt delete mode 100644 res/cardsfolder/coiling_oracle.txt delete mode 100644 res/cardsfolder/coiling_woodworm.txt delete mode 100644 res/cardsfolder/cold_eyed_selkie.txt delete mode 100644 res/cardsfolder/collective_restraint.txt delete mode 100644 res/cardsfolder/collective_unconscious.txt delete mode 100644 res/cardsfolder/colos_yearling.txt delete mode 100644 res/cardsfolder/colossal_might.txt delete mode 100644 res/cardsfolder/colossus_of_sardia.txt delete mode 100644 res/cardsfolder/combat_medic.txt delete mode 100644 res/cardsfolder/combust.txt delete mode 100644 res/cardsfolder/command_of_unsummoning.txt delete mode 100644 res/cardsfolder/commander_eesha.txt delete mode 100644 res/cardsfolder/commander_greven_il_vec.txt delete mode 100644 res/cardsfolder/commune_with_nature.txt delete mode 100644 res/cardsfolder/complex_automaton.txt delete mode 100644 res/cardsfolder/composite_golem.txt delete mode 100644 res/cardsfolder/compost.txt delete mode 100644 res/cardsfolder/compulsion.txt delete mode 100644 res/cardsfolder/compulsive_research.txt delete mode 100644 res/cardsfolder/concentrate.txt delete mode 100644 res/cardsfolder/conch_horn.txt delete mode 100644 res/cardsfolder/concordant_crossroads.txt delete mode 100644 res/cardsfolder/condemn.txt delete mode 100644 res/cardsfolder/condescend.txt delete mode 100644 res/cardsfolder/confiscate.txt delete mode 100644 res/cardsfolder/conflux.txt delete mode 100644 res/cardsfolder/confound.txt delete mode 100644 res/cardsfolder/congregate.txt delete mode 100644 res/cardsfolder/congregation_at_dawn.txt delete mode 100644 res/cardsfolder/conjurers_bauble.txt delete mode 100644 res/cardsfolder/conquering_manticore.txt delete mode 100644 res/cardsfolder/conquerors_pledge.txt delete mode 100644 res/cardsfolder/consecrated_sphinx.txt delete mode 100644 res/cardsfolder/conservator.txt delete mode 100644 res/cardsfolder/conspiracy.txt delete mode 100644 res/cardsfolder/constant_mists.txt delete mode 100644 res/cardsfolder/constricting_tendrils.txt delete mode 100644 res/cardsfolder/consult_the_necrosages.txt delete mode 100644 res/cardsfolder/consume_the_meek.txt delete mode 100644 res/cardsfolder/consuming_bonfire.txt delete mode 100644 res/cardsfolder/consumptive_goo.txt delete mode 100644 res/cardsfolder/contagion.txt delete mode 100644 res/cardsfolder/contagion_clasp.txt delete mode 100644 res/cardsfolder/contagion_engine.txt delete mode 100644 res/cardsfolder/contagious_nim.txt delete mode 100644 res/cardsfolder/contaminated_bond.txt delete mode 100644 res/cardsfolder/contaminated_ground.txt delete mode 100644 res/cardsfolder/contemplation.txt delete mode 100644 res/cardsfolder/contested_war_zone.txt delete mode 100644 res/cardsfolder/control_magic.txt delete mode 100644 res/cardsfolder/control_of_the_court.txt delete mode 100644 res/cardsfolder/controvert.txt delete mode 100644 res/cardsfolder/convalescence.txt delete mode 100644 res/cardsfolder/convalescent_care.txt delete mode 100644 res/cardsfolder/conversion.txt delete mode 100644 res/cardsfolder/conversion_chamber.txt delete mode 100644 res/cardsfolder/conviction.txt delete mode 100644 res/cardsfolder/convincing_mirage.txt delete mode 100644 res/cardsfolder/convolute.txt delete mode 100644 res/cardsfolder/copper_carapace.txt delete mode 100644 res/cardsfolder/copper_gnomes.txt delete mode 100644 res/cardsfolder/copper_leaf_angel.txt delete mode 100644 res/cardsfolder/copper_myr.txt delete mode 100644 res/cardsfolder/copper_tablet.txt delete mode 100644 res/cardsfolder/copperhorn_scout.txt delete mode 100644 res/cardsfolder/copperline_gorge.txt delete mode 100644 res/cardsfolder/copy_artifact.txt delete mode 100644 res/cardsfolder/coral_atoll.txt delete mode 100644 res/cardsfolder/coral_eel.txt delete mode 100644 res/cardsfolder/coral_fighters.txt delete mode 100644 res/cardsfolder/coral_helm.txt delete mode 100644 res/cardsfolder/coral_merfolk.txt delete mode 100644 res/cardsfolder/coral_reef.txt delete mode 100644 res/cardsfolder/coral_trickster.txt delete mode 100644 res/cardsfolder/coralhelm_commander.txt delete mode 100644 res/cardsfolder/core_prowler.txt delete mode 100644 res/cardsfolder/coretapper.txt delete mode 100644 res/cardsfolder/corpse_connoisseur.txt delete mode 100644 res/cardsfolder/corpse_cur.txt delete mode 100644 res/cardsfolder/corpse_harvester.txt delete mode 100644 res/cardsfolder/corpsehatch.txt delete mode 100644 res/cardsfolder/corpulent_corpse.txt delete mode 100644 res/cardsfolder/corrosive_gale.txt delete mode 100644 res/cardsfolder/corrosive_mentor.txt delete mode 100644 res/cardsfolder/corrupt.txt delete mode 100644 res/cardsfolder/corrupt_court_official.txt delete mode 100644 res/cardsfolder/corrupt_eunuchs.txt delete mode 100644 res/cardsfolder/corrupt_official.txt delete mode 100644 res/cardsfolder/corrupted_conscience.txt delete mode 100644 res/cardsfolder/corrupted_harvester.txt delete mode 100644 res/cardsfolder/corrupted_zendikon.txt delete mode 100644 res/cardsfolder/cosis_ravager.txt delete mode 100644 res/cardsfolder/cosis_trickster.txt delete mode 100644 res/cardsfolder/cosmic_horror.txt delete mode 100644 res/cardsfolder/council_of_advisors.txt delete mode 100644 res/cardsfolder/counsel_of_the_soratami.txt delete mode 100644 res/cardsfolder/counterbalance.txt delete mode 100644 res/cardsfolder/counterintelligence.txt delete mode 100644 res/cardsfolder/counterspell.txt delete mode 100644 res/cardsfolder/countersquall.txt delete mode 100644 res/cardsfolder/courier_hawk.txt delete mode 100644 res/cardsfolder/couriers_capsule.txt delete mode 100644 res/cardsfolder/court_archers.txt delete mode 100644 res/cardsfolder/court_homunculus.txt delete mode 100644 res/cardsfolder/cover_of_darkness.txt delete mode 100644 res/cardsfolder/covert_operative.txt delete mode 100644 res/cardsfolder/covetous_dragon.txt delete mode 100644 res/cardsfolder/cowardice.txt delete mode 100644 res/cardsfolder/crab_umbra.txt delete mode 100644 res/cardsfolder/crabapple_cohort.txt delete mode 100644 res/cardsfolder/crack_the_earth.txt delete mode 100644 res/cardsfolder/crackdown.txt delete mode 100644 res/cardsfolder/crackling_club.txt delete mode 100644 res/cardsfolder/cradle_guard.txt delete mode 100644 res/cardsfolder/cradle_of_vitality.txt delete mode 100644 res/cardsfolder/cradle_to_grave.txt delete mode 100644 res/cardsfolder/crafty_pathmage.txt delete mode 100644 res/cardsfolder/crag_puca.txt delete mode 100644 res/cardsfolder/cranial_extraction.txt delete mode 100644 res/cardsfolder/crash.txt delete mode 100644 res/cardsfolder/crash_landing.txt delete mode 100644 res/cardsfolder/crash_of_rhinos.txt delete mode 100644 res/cardsfolder/crashing_centaur.txt delete mode 100644 res/cardsfolder/crater_hellion.txt delete mode 100644 res/cardsfolder/craven_giant.txt delete mode 100644 res/cardsfolder/craven_knight.txt delete mode 100644 res/cardsfolder/craw_giant.txt delete mode 100644 res/cardsfolder/craw_wurm.txt delete mode 100644 res/cardsfolder/crawling_filth.txt delete mode 100644 res/cardsfolder/crawlspace.txt delete mode 100644 res/cardsfolder/crazed_armodon.txt delete mode 100644 res/cardsfolder/crazed_goblin.txt delete mode 100644 res/cardsfolder/crazed_skirge.txt delete mode 100644 res/cardsfolder/creakwood_ghoul.txt delete mode 100644 res/cardsfolder/creakwood_liege.txt delete mode 100644 res/cardsfolder/cream_of_the_crop.txt delete mode 100644 res/cardsfolder/creeping_corrosion.txt delete mode 100644 res/cardsfolder/creeping_mold.txt delete mode 100644 res/cardsfolder/creeping_tar_pit.txt delete mode 100644 res/cardsfolder/cremate.txt delete mode 100644 res/cardsfolder/crenellated_wall.txt delete mode 100644 res/cardsfolder/crevasse.txt delete mode 100644 res/cardsfolder/crib_swap.txt delete mode 100644 res/cardsfolder/crimson_acolyte.txt delete mode 100644 res/cardsfolder/crimson_kobolds.txt delete mode 100644 res/cardsfolder/crimson_manticore.txt delete mode 100644 res/cardsfolder/crimson_roc.txt delete mode 100644 res/cardsfolder/crimson_wisps.txt delete mode 100644 res/cardsfolder/crippling_fatigue.txt delete mode 100644 res/cardsfolder/cromat.txt delete mode 100644 res/cardsfolder/crookclaw_elder.txt delete mode 100644 res/cardsfolder/crookclaw_transmuter.txt delete mode 100644 res/cardsfolder/crookshank_kobolds.txt delete mode 100644 res/cardsfolder/crop_rotation.txt delete mode 100644 res/cardsfolder/crosiss_attendant.txt delete mode 100644 res/cardsfolder/crosiss_catacombs.txt delete mode 100644 res/cardsfolder/crosiss_charm.txt delete mode 100644 res/cardsfolder/crossbow_ambush.txt delete mode 100644 res/cardsfolder/crossbow_infantry.txt delete mode 100644 res/cardsfolder/crosswinds.txt delete mode 100644 res/cardsfolder/crovax_ascendant_hero.txt delete mode 100644 res/cardsfolder/crowd_favorites.txt delete mode 100644 res/cardsfolder/crowd_of_cinders.txt delete mode 100644 res/cardsfolder/crown_of_flames.txt delete mode 100644 res/cardsfolder/crucible_of_fire.txt delete mode 100644 res/cardsfolder/crucible_of_worlds.txt delete mode 100644 res/cardsfolder/crude_rampart.txt delete mode 100644 res/cardsfolder/cruel_bargain.txt delete mode 100644 res/cardsfolder/cruel_edict.txt delete mode 100644 res/cardsfolder/cruel_fate.txt delete mode 100644 res/cardsfolder/cruel_revival.txt delete mode 100644 res/cardsfolder/cruel_tutor.txt delete mode 100644 res/cardsfolder/cruel_ultimatum.txt delete mode 100644 res/cardsfolder/crumble.txt delete mode 100644 res/cardsfolder/crumbling_ashes.txt delete mode 100644 res/cardsfolder/crumbling_necropolis.txt delete mode 100644 res/cardsfolder/crumbling_sanctuary.txt delete mode 100644 res/cardsfolder/crusade.txt delete mode 100644 res/cardsfolder/crusading_knight.txt delete mode 100644 res/cardsfolder/crush.txt delete mode 100644 res/cardsfolder/crush_of_wurms.txt delete mode 100644 res/cardsfolder/crusher_zendikon.txt delete mode 100644 res/cardsfolder/crushing_pain.txt delete mode 100644 res/cardsfolder/cryoclasm.txt delete mode 100644 res/cardsfolder/crypt_angel.txt delete mode 100644 res/cardsfolder/crypt_cobra.txt delete mode 100644 res/cardsfolder/crypt_creeper.txt delete mode 100644 res/cardsfolder/crypt_of_agadeem.txt delete mode 100644 res/cardsfolder/crypt_ripper.txt delete mode 100644 res/cardsfolder/crypt_sliver.txt delete mode 100644 res/cardsfolder/cryptic_annelid.txt delete mode 100644 res/cardsfolder/cryptic_command.txt delete mode 100644 res/cardsfolder/cryptwailing.txt delete mode 100644 res/cardsfolder/crystal_ball.txt delete mode 100644 res/cardsfolder/crystal_chimes.txt delete mode 100644 res/cardsfolder/crystal_quarry.txt delete mode 100644 res/cardsfolder/crystal_rod.txt delete mode 100644 res/cardsfolder/crystal_seer.txt delete mode 100644 res/cardsfolder/crystal_shard.txt delete mode 100644 res/cardsfolder/crystal_vein.txt delete mode 100644 res/cardsfolder/crystalline_sliver.txt delete mode 100644 res/cardsfolder/crystallization.txt delete mode 100644 res/cardsfolder/cudgel_troll.txt delete mode 100644 res/cardsfolder/culling_dais.txt delete mode 100644 res/cardsfolder/culling_sun.txt delete mode 100644 res/cardsfolder/culling_the_weak.txt delete mode 100644 res/cardsfolder/cultbrand_cinder.txt delete mode 100644 res/cardsfolder/cultivate.txt delete mode 100644 res/cardsfolder/cumber_stone.txt delete mode 100644 res/cardsfolder/cunning.txt delete mode 100644 res/cardsfolder/cunning_advisor.txt delete mode 100644 res/cardsfolder/cunning_lethemancer.txt delete mode 100644 res/cardsfolder/cunning_sparkmage.txt delete mode 100644 res/cardsfolder/curfew.txt delete mode 100644 res/cardsfolder/curiosity.txt delete mode 100644 res/cardsfolder/curse_of_chains.txt delete mode 100644 res/cardsfolder/curse_of_marit_lage.txt delete mode 100644 res/cardsfolder/curse_of_wizardry.txt delete mode 100644 res/cardsfolder/cursecatcher.txt delete mode 100644 res/cardsfolder/cursed_flesh.txt delete mode 100644 res/cardsfolder/cursed_land.txt delete mode 100644 res/cardsfolder/cursed_rack.txt delete mode 100644 res/cardsfolder/cursed_ronin.txt delete mode 100644 res/cardsfolder/cursed_scroll.txt delete mode 100644 res/cardsfolder/cursed_totem.txt delete mode 100755 res/cardsfolder/customs_depot.txt delete mode 100644 res/cardsfolder/cut_the_earthly_bond.txt delete mode 100644 res/cardsfolder/cutthroat_il_dal.txt delete mode 100644 res/cardsfolder/cyclical_evolution.txt delete mode 100644 res/cardsfolder/cyclopean_mummy.txt delete mode 100644 res/cardsfolder/cyclopean_snare.txt delete mode 100644 res/cardsfolder/cylian_elf.txt delete mode 100644 res/cardsfolder/cylian_sunsinger.txt delete mode 100644 res/cardsfolder/cystbearer.txt delete mode 100644 res/cardsfolder/daggerback_basilisk.txt delete mode 100644 res/cardsfolder/daggerclaw_imp.txt delete mode 100644 res/cardsfolder/daily_regimen.txt delete mode 100644 res/cardsfolder/dakkon_blackblade.txt delete mode 100644 res/cardsfolder/dakmor_bat.txt delete mode 100644 res/cardsfolder/dakmor_ghoul.txt delete mode 100644 res/cardsfolder/dakmor_lancer.txt delete mode 100644 res/cardsfolder/dakmor_plague.txt delete mode 100644 res/cardsfolder/dakmor_salvage.txt delete mode 100644 res/cardsfolder/dakmor_scorpion.txt delete mode 100644 res/cardsfolder/dakmor_sorceress.txt delete mode 100644 res/cardsfolder/damnation.txt delete mode 100644 res/cardsfolder/damping_field.txt delete mode 100644 res/cardsfolder/dance_of_many.txt delete mode 100644 res/cardsfolder/dance_of_shadows.txt delete mode 100644 res/cardsfolder/dance_of_the_dead.txt delete mode 100644 res/cardsfolder/dancing_scimitar.txt delete mode 100644 res/cardsfolder/dandan.txt delete mode 100644 res/cardsfolder/daraja_griffin.txt delete mode 100644 res/cardsfolder/darba.txt delete mode 100644 res/cardsfolder/darien_king_of_kjeldor.txt delete mode 100644 res/cardsfolder/darigaazs_attendant.txt delete mode 100644 res/cardsfolder/darigaazs_caldera.txt delete mode 100644 res/cardsfolder/darigaazs_charm.txt delete mode 100644 res/cardsfolder/daring_apprentice.txt delete mode 100644 res/cardsfolder/daring_leap.txt delete mode 100644 res/cardsfolder/dark_banishing.txt delete mode 100644 res/cardsfolder/dark_confidant.txt delete mode 100644 res/cardsfolder/dark_depths.txt delete mode 100644 res/cardsfolder/dark_hatchling.txt delete mode 100644 res/cardsfolder/dark_heart_of_the_wood.txt delete mode 100644 res/cardsfolder/dark_maze.txt delete mode 100644 res/cardsfolder/dark_offering.txt delete mode 100644 res/cardsfolder/dark_privilege.txt delete mode 100644 res/cardsfolder/dark_ritual.txt delete mode 100644 res/cardsfolder/dark_temper.txt delete mode 100755 res/cardsfolder/dark_triumph.txt delete mode 100644 res/cardsfolder/dark_tutelage.txt delete mode 100644 res/cardsfolder/dark_withering.txt delete mode 100644 res/cardsfolder/darkblast.txt delete mode 100644 res/cardsfolder/darkest_hour.txt delete mode 100644 res/cardsfolder/darkheart_sliver.txt delete mode 100644 res/cardsfolder/darkling_stalker.txt delete mode 100644 res/cardsfolder/darklit_gargoyle.txt delete mode 100644 res/cardsfolder/darkness.txt delete mode 100644 res/cardsfolder/darkslick_drake.txt delete mode 100644 res/cardsfolder/darkslick_shores.txt delete mode 100644 res/cardsfolder/darksteel_axe.txt delete mode 100644 res/cardsfolder/darksteel_brute.txt delete mode 100644 res/cardsfolder/darksteel_citadel.txt delete mode 100644 res/cardsfolder/darksteel_colossus.txt delete mode 100644 res/cardsfolder/darksteel_forge.txt delete mode 100644 res/cardsfolder/darksteel_gargoyle.txt delete mode 100644 res/cardsfolder/darksteel_ingot.txt delete mode 100644 res/cardsfolder/darksteel_juggernaut.txt delete mode 100644 res/cardsfolder/darksteel_myr.txt delete mode 100644 res/cardsfolder/darksteel_pendant.txt delete mode 100644 res/cardsfolder/darksteel_plate.txt delete mode 100644 res/cardsfolder/darksteel_relic.txt delete mode 100644 res/cardsfolder/darksteel_sentinel.txt delete mode 100644 res/cardsfolder/darkwatch_elves.txt delete mode 100644 res/cardsfolder/darkwater_catacombs.txt delete mode 100644 res/cardsfolder/darkwater_egg.txt delete mode 100644 res/cardsfolder/darting_merfolk.txt delete mode 100644 res/cardsfolder/daru_cavalier.txt delete mode 100644 res/cardsfolder/daru_encampment.txt delete mode 100644 res/cardsfolder/daru_healer.txt delete mode 100644 res/cardsfolder/daru_lancer.txt delete mode 100644 res/cardsfolder/daru_mender.txt delete mode 100644 res/cardsfolder/daru_sanctifier.txt delete mode 100644 res/cardsfolder/daru_warchief.txt delete mode 100644 res/cardsfolder/daunting_defender.txt delete mode 100644 res/cardsfolder/dauntless_dourbark.txt delete mode 100644 res/cardsfolder/dauntless_escort.txt delete mode 100644 res/cardsfolder/dauthi_cutthroat.txt delete mode 100644 res/cardsfolder/dauthi_embrace.txt delete mode 100644 res/cardsfolder/dauthi_ghoul.txt delete mode 100644 res/cardsfolder/dauthi_horror.txt delete mode 100644 res/cardsfolder/dauthi_jackal.txt delete mode 100644 res/cardsfolder/dauthi_marauder.txt delete mode 100644 res/cardsfolder/dauthi_mercenary.txt delete mode 100644 res/cardsfolder/dauthi_mindripper.txt delete mode 100644 res/cardsfolder/dauthi_slayer.txt delete mode 100644 res/cardsfolder/dauthi_trapper.txt delete mode 100644 res/cardsfolder/dauthi_warlord.txt delete mode 100644 res/cardsfolder/davenant_archer.txt delete mode 100644 res/cardsfolder/davenant_healer.txt delete mode 100644 res/cardsfolder/dawn_elemental.txt delete mode 100644 res/cardsfolder/dawn_of_the_dead.txt delete mode 100644 res/cardsfolder/dawnglare_invoker.txt delete mode 100644 res/cardsfolder/dawning_purist.txt delete mode 100644 res/cardsfolder/dawnray_archer.txt delete mode 100644 res/cardsfolder/dawnstrider.txt delete mode 100644 res/cardsfolder/day_of_destiny.txt delete mode 100644 res/cardsfolder/day_of_judgment.txt delete mode 100644 res/cardsfolder/day_of_the_dragons.txt delete mode 100644 res/cardsfolder/daze.txt delete mode 100644 res/cardsfolder/deadapult.txt delete mode 100644 res/cardsfolder/deadfall.txt delete mode 100644 res/cardsfolder/deadly_grub.txt delete mode 100644 res/cardsfolder/deadly_insect.txt delete mode 100644 res/cardsfolder/deadly_recluse.txt delete mode 100644 res/cardsfolder/deadshot_minotaur.txt delete mode 100644 res/cardsfolder/deadwood_treefolk.txt delete mode 100644 res/cardsfolder/death_baron.txt delete mode 100644 res/cardsfolder/death_bomb.txt delete mode 100644 res/cardsfolder/death_cloud.txt delete mode 100644 res/cardsfolder/death_cultist.txt delete mode 100644 res/cardsfolder/death_denied.txt delete mode 100644 res/cardsfolder/death_grasp.txt delete mode 100644 res/cardsfolder/death_hood_cobra.txt delete mode 100644 res/cardsfolder/death_mutation.txt delete mode 100644 res/cardsfolder/death_of_a_thousand_stings.txt delete mode 100644 res/cardsfolder/death_pits_of_rath.txt delete mode 100644 res/cardsfolder/death_pulse.txt delete mode 100644 res/cardsfolder/death_speakers.txt delete mode 100644 res/cardsfolder/death_stroke.txt delete mode 100644 res/cardsfolder/death_ward.txt delete mode 100644 res/cardsfolder/deathbringer_liege.txt delete mode 100644 res/cardsfolder/deathbringer_thoctar.txt delete mode 100644 res/cardsfolder/deathforge_shaman.txt delete mode 100644 res/cardsfolder/deathgazer.txt delete mode 100644 res/cardsfolder/deathgreeter.txt delete mode 100644 res/cardsfolder/deathgrip.txt delete mode 100644 res/cardsfolder/deathknell_kami.txt delete mode 100644 res/cardsfolder/deathless_angel.txt delete mode 100644 res/cardsfolder/deathmark.txt delete mode 100644 res/cardsfolder/deathmark_prelate.txt delete mode 100644 res/cardsfolder/deathmask_nezumi.txt delete mode 100644 res/cardsfolder/deaths_duet.txt delete mode 100644 res/cardsfolder/deaths_head_buzzard.txt delete mode 100644 res/cardsfolder/deaths_shadow.txt delete mode 100644 res/cardsfolder/deathspore_thallid.txt delete mode 100644 res/cardsfolder/debtors_knell.txt delete mode 100644 res/cardsfolder/deception.txt delete mode 100644 res/cardsfolder/decimate.txt delete mode 100644 res/cardsfolder/decimator_web.txt delete mode 100644 res/cardsfolder/deconstruct.txt delete mode 100644 res/cardsfolder/decree_of_annihilation.txt delete mode 100644 res/cardsfolder/decree_of_justice.txt delete mode 100644 res/cardsfolder/decree_of_savagery.txt delete mode 100644 res/cardsfolder/dedicated_martyr.txt delete mode 100644 res/cardsfolder/deep_analysis.txt delete mode 100644 res/cardsfolder/deep_reconnaissance.txt delete mode 100644 res/cardsfolder/deep_sea_serpent.txt delete mode 100644 res/cardsfolder/deep_slumber_titan.txt delete mode 100644 res/cardsfolder/deepchannel_mentor.txt delete mode 100644 res/cardsfolder/deeptread_merrow.txt delete mode 100644 res/cardsfolder/deepwood_drummer.txt delete mode 100755 res/cardsfolder/deepwood_ghoul.txt delete mode 100644 res/cardsfolder/deepwood_tantiv.txt delete mode 100644 res/cardsfolder/deepwood_wolverine.txt delete mode 100644 res/cardsfolder/defender_of_chaos.txt delete mode 100644 res/cardsfolder/defender_of_law.txt delete mode 100644 res/cardsfolder/defender_of_the_order.txt delete mode 100644 res/cardsfolder/defense_grid.txt delete mode 100644 res/cardsfolder/defense_of_the_heart.txt delete mode 100644 res/cardsfolder/defensive_stance.txt delete mode 100644 res/cardsfolder/defiant_elf.txt delete mode 100644 res/cardsfolder/defiant_falcon.txt delete mode 100644 res/cardsfolder/defiler_of_souls.txt delete mode 100644 res/cardsfolder/deft_duelist.txt delete mode 100644 res/cardsfolder/defy_gravity.txt delete mode 100644 res/cardsfolder/dega_disciple.txt delete mode 100644 res/cardsfolder/dega_sanctuary.txt delete mode 100644 res/cardsfolder/deglamer.txt delete mode 100644 res/cardsfolder/dehydration.txt delete mode 100644 res/cardsfolder/deity_of_scars.txt delete mode 100644 res/cardsfolder/deja_vu.txt delete mode 100644 res/cardsfolder/delirium.txt delete mode 100644 res/cardsfolder/delirium_skeins.txt delete mode 100644 res/cardsfolder/delraich.txt delete mode 100644 res/cardsfolder/deluge.txt delete mode 100644 res/cardsfolder/delusions_of_mediocrity.txt delete mode 100644 res/cardsfolder/dematerialize.txt delete mode 100644 res/cardsfolder/dementia_bat.txt delete mode 100644 res/cardsfolder/demigod_of_revenge.txt delete mode 100644 res/cardsfolder/demolish.txt delete mode 100644 res/cardsfolder/demon_of_deaths_gate.txt delete mode 100644 res/cardsfolder/demonic_appetite.txt delete mode 100644 res/cardsfolder/demonic_consultation.txt delete mode 100644 res/cardsfolder/demonic_dread.txt delete mode 100644 res/cardsfolder/demonic_hordes.txt delete mode 100644 res/cardsfolder/demonic_torment.txt delete mode 100644 res/cardsfolder/demonic_tutor.txt delete mode 100644 res/cardsfolder/demons_horn.txt delete mode 100644 res/cardsfolder/demons_jester.txt delete mode 100644 res/cardsfolder/demonspine_whip.txt delete mode 100644 res/cardsfolder/demystify.txt delete mode 100644 res/cardsfolder/denizen_of_the_deep.txt delete mode 100644 res/cardsfolder/dense_canopy.txt delete mode 100644 res/cardsfolder/dense_foliage.txt delete mode 100644 res/cardsfolder/deny_reality.txt delete mode 100644 res/cardsfolder/denying_wind.txt delete mode 100644 res/cardsfolder/deprive.txt delete mode 100644 res/cardsfolder/deranged_hermit.txt delete mode 100644 res/cardsfolder/derelor.txt delete mode 100644 res/cardsfolder/descendant_of_soramaro.txt delete mode 100644 res/cardsfolder/desecrated_earth.txt delete mode 100644 res/cardsfolder/desert.txt delete mode 100644 res/cardsfolder/desert_drake.txt delete mode 100644 res/cardsfolder/desert_nomads.txt delete mode 100644 res/cardsfolder/desert_sandstorm.txt delete mode 100644 res/cardsfolder/desert_twister.txt delete mode 100644 res/cardsfolder/deserted_temple.txt delete mode 100644 res/cardsfolder/desolation_angel.txt delete mode 100644 res/cardsfolder/desolation_giant.txt delete mode 100644 res/cardsfolder/desperate_charge.txt delete mode 100644 res/cardsfolder/despise.txt delete mode 100644 res/cardsfolder/despoil.txt delete mode 100644 res/cardsfolder/despondency.txt delete mode 100644 res/cardsfolder/despotic_scepter.txt delete mode 100644 res/cardsfolder/destructive_flow.txt delete mode 100644 res/cardsfolder/destructive_force.txt delete mode 100644 res/cardsfolder/destructive_urge.txt delete mode 100644 res/cardsfolder/detonate.txt delete mode 100644 res/cardsfolder/deus_of_calamity.txt delete mode 100644 res/cardsfolder/devastate.txt delete mode 100644 res/cardsfolder/devastating_summons.txt delete mode 100644 res/cardsfolder/devastation.txt delete mode 100644 res/cardsfolder/devoted_druid.txt delete mode 100644 res/cardsfolder/devoted_hero.txt delete mode 100644 res/cardsfolder/devoted_retainer.txt delete mode 100644 res/cardsfolder/devour_in_shadow.txt delete mode 100644 res/cardsfolder/devouring_deep.txt delete mode 100644 res/cardsfolder/devout_harpist.txt delete mode 100644 res/cardsfolder/devout_lightcaster.txt delete mode 100644 res/cardsfolder/devout_monk.txt delete mode 100644 res/cardsfolder/devout_witness.txt delete mode 100644 res/cardsfolder/dewdrop_spy.txt delete mode 100644 res/cardsfolder/diabolic_edict.txt delete mode 100644 res/cardsfolder/diabolic_intent.txt delete mode 100644 res/cardsfolder/diabolic_machine.txt delete mode 100644 res/cardsfolder/diabolic_tutor.txt delete mode 100644 res/cardsfolder/diabolic_vision.txt delete mode 100644 res/cardsfolder/diamond_faerie.txt delete mode 100644 res/cardsfolder/diamond_kaleidoscope.txt delete mode 100644 res/cardsfolder/diamond_valley.txt delete mode 100644 res/cardsfolder/didgeridoo.txt delete mode 100644 res/cardsfolder/diligent_farmhand.txt delete mode 100644 res/cardsfolder/diminish.txt delete mode 100644 res/cardsfolder/diminishing_returns.txt delete mode 100644 res/cardsfolder/dimir_aqueduct.txt delete mode 100644 res/cardsfolder/dimir_cutpurse.txt delete mode 100644 res/cardsfolder/dimir_guildmage.txt delete mode 100644 res/cardsfolder/dimir_house_guard.txt delete mode 100644 res/cardsfolder/dimir_infiltrator.txt delete mode 100644 res/cardsfolder/dimir_machinations.txt delete mode 100644 res/cardsfolder/dimir_signet.txt delete mode 100644 res/cardsfolder/din_of_the_fireherd.txt delete mode 100644 res/cardsfolder/dingus_egg.txt delete mode 100644 res/cardsfolder/dingus_staff.txt delete mode 100644 res/cardsfolder/diplomatic_escort.txt delete mode 100644 res/cardsfolder/diplomatic_immunity.txt delete mode 100644 res/cardsfolder/dire_undercurrents.txt delete mode 100644 res/cardsfolder/dirge_of_dread.txt delete mode 100644 res/cardsfolder/dirtcowl_wurm.txt delete mode 100644 res/cardsfolder/dirtwater_wraith.txt delete mode 100644 res/cardsfolder/dirty_wererat.txt delete mode 100644 res/cardsfolder/disappear.txt delete mode 100644 res/cardsfolder/disciple_of_grace.txt delete mode 100644 res/cardsfolder/disciple_of_kangee.txt delete mode 100644 res/cardsfolder/disciple_of_law.txt delete mode 100644 res/cardsfolder/disciple_of_malice.txt delete mode 100644 res/cardsfolder/disciple_of_tevesh_szat.txt delete mode 100644 res/cardsfolder/disciple_of_the_vault.txt delete mode 100644 res/cardsfolder/discombobulate.txt delete mode 100644 res/cardsfolder/discordant_dirge.txt delete mode 100644 res/cardsfolder/disease_carriers.txt delete mode 100644 res/cardsfolder/disembowel.txt delete mode 100644 res/cardsfolder/disempower.txt delete mode 100644 res/cardsfolder/disenchant.txt delete mode 100644 res/cardsfolder/disentomb.txt delete mode 100644 res/cardsfolder/disfigure.txt delete mode 100644 res/cardsfolder/disintegrate.txt delete mode 100644 res/cardsfolder/dismal_failure.txt delete mode 100644 res/cardsfolder/dismember.txt delete mode 100644 res/cardsfolder/dismiss.txt delete mode 100644 res/cardsfolder/disorient.txt delete mode 100644 res/cardsfolder/dispatch.txt delete mode 100644 res/cardsfolder/dispel.txt delete mode 100644 res/cardsfolder/dispellers_capsule.txt delete mode 100644 res/cardsfolder/dispense_justice.txt delete mode 100644 res/cardsfolder/disperse.txt delete mode 100644 res/cardsfolder/dispersing_orb.txt delete mode 100644 res/cardsfolder/disrupt.txt delete mode 100644 res/cardsfolder/disrupting_scepter.txt delete mode 100644 res/cardsfolder/disruptive_pitmage.txt delete mode 100644 res/cardsfolder/disruptive_student.txt delete mode 100644 res/cardsfolder/dissipate.txt delete mode 100644 res/cardsfolder/dissipation_field.txt delete mode 100644 res/cardsfolder/distress.txt delete mode 100644 res/cardsfolder/disturbed_burial.txt delete mode 100644 res/cardsfolder/dive_bomber.txt delete mode 100644 res/cardsfolder/divebomber_griffin.txt delete mode 100644 res/cardsfolder/diversionary_tactics.txt delete mode 100644 res/cardsfolder/divination.txt delete mode 100644 res/cardsfolder/divine_offering.txt delete mode 100644 res/cardsfolder/divine_presence.txt delete mode 100644 res/cardsfolder/divine_retribution.txt delete mode 100644 res/cardsfolder/divine_sacrament.txt delete mode 100644 res/cardsfolder/divine_transformation.txt delete mode 100644 res/cardsfolder/divine_verdict.txt delete mode 100644 res/cardsfolder/diving_griffin.txt delete mode 100644 res/cardsfolder/divinity_of_pride.txt delete mode 100644 res/cardsfolder/dizzy_spell.txt delete mode 100644 res/cardsfolder/djinn_of_the_lamp.txt delete mode 100644 res/cardsfolder/do_or_die.txt delete mode 100644 res/cardsfolder/dodecapod.txt delete mode 100644 res/cardsfolder/dogged_hunter.txt delete mode 100644 res/cardsfolder/dogpile.txt delete mode 100644 res/cardsfolder/dolmen_gate.txt delete mode 100644 res/cardsfolder/domestication.txt delete mode 100644 res/cardsfolder/dominate.txt delete mode 100644 res/cardsfolder/dominus_of_fealty.txt delete mode 100644 res/cardsfolder/donate.txt delete mode 100644 res/cardsfolder/doom_blade.txt delete mode 100644 res/cardsfolder/doomed_necromancer.txt delete mode 100644 res/cardsfolder/doomsday.txt delete mode 100644 res/cardsfolder/doomsday_specter.txt delete mode 100644 res/cardsfolder/door_to_nothingness.txt delete mode 100644 res/cardsfolder/doran_the_siege_tower.txt delete mode 100644 res/cardsfolder/dormant_gomazoa.txt delete mode 100644 res/cardsfolder/dormant_sliver.txt delete mode 100644 res/cardsfolder/dormant_volcano.txt delete mode 100644 res/cardsfolder/dosans_oldest_chant.txt delete mode 100644 res/cardsfolder/double_cleave.txt delete mode 100644 res/cardsfolder/doubling_season.txt delete mode 100644 res/cardsfolder/doubtless_one.txt delete mode 100644 res/cardsfolder/douse.txt delete mode 100644 res/cardsfolder/douse_in_gloom.txt delete mode 100644 res/cardsfolder/dovescape.txt delete mode 100644 res/cardsfolder/downdraft.txt delete mode 100755 res/cardsfolder/downhill_charge.txt delete mode 100644 res/cardsfolder/dowsing_shaman.txt delete mode 100644 res/cardsfolder/draconian_cylix.txt delete mode 100644 res/cardsfolder/drag_down.txt delete mode 100644 res/cardsfolder/dragon_appeasement.txt delete mode 100644 res/cardsfolder/dragon_arch.txt delete mode 100644 res/cardsfolder/dragon_blood.txt delete mode 100644 res/cardsfolder/dragon_broodmother.txt delete mode 100644 res/cardsfolder/dragon_engine.txt delete mode 100644 res/cardsfolder/dragon_fodder.txt delete mode 100644 res/cardsfolder/dragon_mage.txt delete mode 100644 res/cardsfolder/dragon_roost.txt delete mode 100644 res/cardsfolder/dragon_tyrant.txt delete mode 100644 res/cardsfolder/dragon_whelp.txt delete mode 100644 res/cardsfolder/dragonmaster_outcast.txt delete mode 100644 res/cardsfolder/dragons_claw.txt delete mode 100644 res/cardsfolder/dragonskull_summit.txt delete mode 100644 res/cardsfolder/dragonsoul_knight.txt delete mode 100644 res/cardsfolder/dragonspeaker_shaman.txt delete mode 100644 res/cardsfolder/dragonstalker.txt delete mode 100644 res/cardsfolder/dragonstorm.txt delete mode 100644 res/cardsfolder/drain_the_well.txt delete mode 100644 res/cardsfolder/drake_hatchling.txt delete mode 100644 res/cardsfolder/drake_skull_cameo.txt delete mode 100644 res/cardsfolder/drake_umbra.txt delete mode 100644 res/cardsfolder/dralnus_crusade.txt delete mode 100644 res/cardsfolder/dramatic_entrance.txt delete mode 100644 res/cardsfolder/drana_kalastria_bloodchief.txt delete mode 100644 res/cardsfolder/drastic_revelation.txt delete mode 100644 res/cardsfolder/dread.txt delete mode 100644 res/cardsfolder/dread_drone.txt delete mode 100644 res/cardsfolder/dread_of_night.txt delete mode 100644 res/cardsfolder/dread_reaper.txt delete mode 100644 res/cardsfolder/dread_return.txt delete mode 100644 res/cardsfolder/dread_slag.txt delete mode 100644 res/cardsfolder/dread_specter.txt delete mode 100644 res/cardsfolder/dread_statuary.txt delete mode 100644 res/cardsfolder/dread_warlock.txt delete mode 100644 res/cardsfolder/dreadship_reef.txt delete mode 100644 res/cardsfolder/dreadwing.txt delete mode 100644 res/cardsfolder/dream_cache.txt delete mode 100644 res/cardsfolder/dream_fracture.txt delete mode 100644 res/cardsfolder/dream_prowler.txt delete mode 100644 res/cardsfolder/dream_stalker.txt delete mode 100644 res/cardsfolder/dreamborn_muse.txt delete mode 100644 res/cardsfolder/dreamcatcher.txt delete mode 100644 res/cardsfolder/dreamscape_artist.txt delete mode 100644 res/cardsfolder/dreamspoiler_witches.txt delete mode 100644 res/cardsfolder/dreamstone_hedron.txt delete mode 100644 res/cardsfolder/dredge.txt delete mode 100644 res/cardsfolder/dreg_reaver.txt delete mode 100644 res/cardsfolder/dregs_of_sorrow.txt delete mode 100644 res/cardsfolder/dregscape_zombie.txt delete mode 100644 res/cardsfolder/drekavac.txt delete mode 100644 res/cardsfolder/drelnoch.txt delete mode 100644 res/cardsfolder/drift_of_phantasms.txt delete mode 100644 res/cardsfolder/drift_of_the_dead.txt delete mode 100644 res/cardsfolder/drifter_il_dal.txt delete mode 100644 res/cardsfolder/drifting_djinn.txt delete mode 100644 res/cardsfolder/drifting_meadow.txt delete mode 100644 res/cardsfolder/drill_skimmer.txt delete mode 100644 res/cardsfolder/dripping_dead.txt delete mode 100644 res/cardsfolder/dripping_tongue_zubera.txt delete mode 100644 res/cardsfolder/dromad_purebred.txt delete mode 100644 res/cardsfolder/dromars_attendant.txt delete mode 100644 res/cardsfolder/dromars_cavern.txt delete mode 100644 res/cardsfolder/dromosaur.txt delete mode 100644 res/cardsfolder/drooling_groodion.txt delete mode 100644 res/cardsfolder/drooling_ogre.txt delete mode 100644 res/cardsfolder/drop_of_honey.txt delete mode 100644 res/cardsfolder/dross_crocodile.txt delete mode 100644 res/cardsfolder/dross_golem.txt delete mode 100644 res/cardsfolder/dross_harvester.txt delete mode 100644 res/cardsfolder/dross_hopper.txt delete mode 100644 res/cardsfolder/dross_prowler.txt delete mode 100644 res/cardsfolder/dross_ripper.txt delete mode 100644 res/cardsfolder/dross_scorpion.txt delete mode 100644 res/cardsfolder/drove_of_elves.txt delete mode 100644 res/cardsfolder/drowned.txt delete mode 100644 res/cardsfolder/drowned_catacomb.txt delete mode 100644 res/cardsfolder/drowned_rusalka.txt delete mode 100644 res/cardsfolder/drowner_initiate.txt delete mode 100644 res/cardsfolder/drowner_of_secrets.txt delete mode 100644 res/cardsfolder/drudge_reavers.txt delete mode 100644 res/cardsfolder/drudge_skeletons.txt delete mode 100644 res/cardsfolder/drudge_spell.txt delete mode 100644 res/cardsfolder/druid_lyrist.txt delete mode 100644 res/cardsfolder/druid_of_the_anima.txt delete mode 100644 res/cardsfolder/druids_call.txt delete mode 100644 res/cardsfolder/drumhunter.txt delete mode 100644 res/cardsfolder/dry_spell.txt delete mode 100644 res/cardsfolder/dryad_arbor.txt delete mode 100644 res/cardsfolder/dryad_sophisticate.txt delete mode 100644 res/cardsfolder/dryads_favor.txt delete mode 100644 res/cardsfolder/dueling_grounds.txt delete mode 100644 res/cardsfolder/duergar_assailant.txt delete mode 100644 res/cardsfolder/duergar_cave_guard.txt delete mode 100644 res/cardsfolder/duergar_hedge_mage.txt delete mode 100644 res/cardsfolder/duergar_mine_captain.txt delete mode 100644 res/cardsfolder/dune_brood_nephilim.txt delete mode 100644 res/cardsfolder/dunerider_outlaw.txt delete mode 100644 res/cardsfolder/dungeon_shade.txt delete mode 100644 res/cardsfolder/duress.txt delete mode 100644 res/cardsfolder/durkwood_baloth.txt delete mode 100644 res/cardsfolder/durkwood_boars.txt delete mode 100644 res/cardsfolder/dusk_imp.txt delete mode 100644 res/cardsfolder/duskdale_wurm.txt delete mode 100644 res/cardsfolder/duskmantle_house_of_shadow.txt delete mode 100644 res/cardsfolder/duskrider_falcon.txt delete mode 100644 res/cardsfolder/duskrider_peregrine.txt delete mode 100644 res/cardsfolder/dust_bowl.txt delete mode 100644 res/cardsfolder/dust_corona.txt delete mode 100644 res/cardsfolder/dust_elemental.txt delete mode 100644 res/cardsfolder/dust_to_dust.txt delete mode 100644 res/cardsfolder/dwarven_armorer.txt delete mode 100644 res/cardsfolder/dwarven_armory.txt delete mode 100644 res/cardsfolder/dwarven_berserker.txt delete mode 100644 res/cardsfolder/dwarven_blastminer.txt delete mode 100644 res/cardsfolder/dwarven_bloodboiler.txt delete mode 100644 res/cardsfolder/dwarven_demolition_team.txt delete mode 100644 res/cardsfolder/dwarven_grunt.txt delete mode 100644 res/cardsfolder/dwarven_hold.txt delete mode 100644 res/cardsfolder/dwarven_lieutenant.txt delete mode 100644 res/cardsfolder/dwarven_miner.txt delete mode 100644 res/cardsfolder/dwarven_nomad.txt delete mode 100644 res/cardsfolder/dwarven_patrol.txt delete mode 100644 res/cardsfolder/dwarven_pony.txt delete mode 100644 res/cardsfolder/dwarven_ruins.txt delete mode 100644 res/cardsfolder/dwarven_soldier.txt delete mode 100644 res/cardsfolder/dwarven_song.txt delete mode 100644 res/cardsfolder/dwarven_strike_force.txt delete mode 100644 res/cardsfolder/dwarven_thaumaturgist.txt delete mode 100644 res/cardsfolder/dwarven_trader.txt delete mode 100644 res/cardsfolder/dwarven_vigilantes.txt delete mode 100644 res/cardsfolder/dwarven_warriors.txt delete mode 100644 res/cardsfolder/dwarven_weaponsmith.txt delete mode 100644 res/cardsfolder/dying_wail.txt delete mode 100644 res/cardsfolder/eager_cadet.txt delete mode 100644 res/cardsfolder/early_frost.txt delete mode 100644 res/cardsfolder/earnest_fellowship.txt delete mode 100644 res/cardsfolder/earsplitting_rats.txt delete mode 100644 res/cardsfolder/earth_elemental.txt delete mode 100644 res/cardsfolder/earth_rift.txt delete mode 100644 res/cardsfolder/earth_servant.txt delete mode 100644 res/cardsfolder/earth_surge.txt delete mode 100644 res/cardsfolder/earthbind.txt delete mode 100644 res/cardsfolder/earthblighter.txt delete mode 100644 res/cardsfolder/earthbrawn.txt delete mode 100644 res/cardsfolder/earthcraft.txt delete mode 100644 res/cardsfolder/earthen_goo.txt delete mode 100644 res/cardsfolder/earthlink.txt delete mode 100644 res/cardsfolder/earthquake.txt delete mode 100644 res/cardsfolder/earthshaker.txt delete mode 100644 res/cardsfolder/eastern_paladin.txt delete mode 100644 res/cardsfolder/eater_of_days.txt delete mode 100644 res/cardsfolder/ebon_dragon.txt delete mode 100644 res/cardsfolder/ebon_drake.txt delete mode 100644 res/cardsfolder/ebon_praetor.txt delete mode 100644 res/cardsfolder/ebon_stronghold.txt delete mode 100644 res/cardsfolder/ebony_horse.txt delete mode 100644 res/cardsfolder/ebony_owl_netsuke.txt delete mode 100644 res/cardsfolder/ebony_rhino.txt delete mode 100644 res/cardsfolder/ebony_treefolk.txt delete mode 100644 res/cardsfolder/echo_mage.txt delete mode 100644 res/cardsfolder/echo_tracer.txt delete mode 100644 res/cardsfolder/echoing_courage.txt delete mode 100644 res/cardsfolder/echoing_decay.txt delete mode 100644 res/cardsfolder/echoing_truth.txt delete mode 100644 res/cardsfolder/edge_of_autumn.txt delete mode 100644 res/cardsfolder/edge_of_the_divinity.txt delete mode 100644 res/cardsfolder/edgewalker.txt delete mode 100644 res/cardsfolder/eel_umbra.txt delete mode 100644 res/cardsfolder/eerie_procession.txt delete mode 100644 res/cardsfolder/eiganjo_castle.txt delete mode 100644 res/cardsfolder/eiganjo_free_riders.txt delete mode 100644 res/cardsfolder/eightfold_maze.txt delete mode 100644 res/cardsfolder/ekundu_griffin.txt delete mode 100644 res/cardsfolder/el_hajjaj.txt delete mode 100644 res/cardsfolder/eladamri_lord_of_leaves.txt delete mode 100644 res/cardsfolder/eladamris_call.txt delete mode 100644 res/cardsfolder/eladamris_vineyard.txt delete mode 100644 res/cardsfolder/eland_umbra.txt delete mode 100644 res/cardsfolder/elder_druid.txt delete mode 100644 res/cardsfolder/elder_mastery.txt delete mode 100644 res/cardsfolder/eldrazi_conscription.txt delete mode 100644 res/cardsfolder/eldrazi_monument.txt delete mode 100644 res/cardsfolder/electric_eel.txt delete mode 100644 res/cardsfolder/electrolyze.txt delete mode 100644 res/cardsfolder/electropotence.txt delete mode 100644 res/cardsfolder/elemental_augury.txt delete mode 100644 res/cardsfolder/elemental_mastery.txt delete mode 100644 res/cardsfolder/elephant_ambush.txt delete mode 100644 res/cardsfolder/elephant_graveyard.txt delete mode 100644 res/cardsfolder/elephant_guide.txt delete mode 100644 res/cardsfolder/elesh_norn_grand_cenobite.txt delete mode 100644 res/cardsfolder/elf_replica.txt delete mode 100644 res/cardsfolder/elfhame_palace.txt delete mode 100644 res/cardsfolder/elite_archers.txt delete mode 100644 res/cardsfolder/elite_cat_warrior.txt delete mode 100644 res/cardsfolder/elite_javelineer.txt delete mode 100644 res/cardsfolder/elite_vanguard.txt delete mode 100644 res/cardsfolder/elixir_of_immortality.txt delete mode 100644 res/cardsfolder/elixir_of_vitality.txt delete mode 100644 res/cardsfolder/elspeth_knight_errant.txt delete mode 100644 res/cardsfolder/elspeth_tirel.txt delete mode 100644 res/cardsfolder/elven_cache.txt delete mode 100644 res/cardsfolder/elven_fortress.txt delete mode 100644 res/cardsfolder/elven_lyre.txt delete mode 100644 res/cardsfolder/elven_palisade.txt delete mode 100644 res/cardsfolder/elven_riders.txt delete mode 100644 res/cardsfolder/elven_rite.txt delete mode 100644 res/cardsfolder/elven_warhounds.txt delete mode 100644 res/cardsfolder/elves_of_deep_shadow.txt delete mode 100644 res/cardsfolder/elvish_aberration.txt delete mode 100644 res/cardsfolder/elvish_archdruid.txt delete mode 100644 res/cardsfolder/elvish_archers.txt delete mode 100644 res/cardsfolder/elvish_bard.txt delete mode 100644 res/cardsfolder/elvish_berserker.txt delete mode 100644 res/cardsfolder/elvish_branchbender.txt delete mode 100644 res/cardsfolder/elvish_champion.txt delete mode 100644 res/cardsfolder/elvish_eulogist.txt delete mode 100644 res/cardsfolder/elvish_farmer.txt delete mode 100644 res/cardsfolder/elvish_fury.txt delete mode 100644 res/cardsfolder/elvish_guidance.txt delete mode 100644 res/cardsfolder/elvish_handservant.txt delete mode 100644 res/cardsfolder/elvish_harbinger.txt delete mode 100644 res/cardsfolder/elvish_herder.txt delete mode 100644 res/cardsfolder/elvish_hexhunter.txt delete mode 100644 res/cardsfolder/elvish_hunter.txt delete mode 100644 res/cardsfolder/elvish_lookout.txt delete mode 100644 res/cardsfolder/elvish_lyrist.txt delete mode 100644 res/cardsfolder/elvish_pathcutter.txt delete mode 100644 res/cardsfolder/elvish_pioneer.txt delete mode 100644 res/cardsfolder/elvish_piper.txt delete mode 100644 res/cardsfolder/elvish_promenade.txt delete mode 100644 res/cardsfolder/elvish_ranger.txt delete mode 100644 res/cardsfolder/elvish_scout.txt delete mode 100644 res/cardsfolder/elvish_scrapper.txt delete mode 100644 res/cardsfolder/elvish_skysweeper.txt delete mode 100644 res/cardsfolder/elvish_spirit_guide.txt delete mode 100644 res/cardsfolder/elvish_vanguard.txt delete mode 100644 res/cardsfolder/elvish_visionary.txt delete mode 100644 res/cardsfolder/elvish_warrior.txt delete mode 100644 res/cardsfolder/embargo.txt delete mode 100644 res/cardsfolder/ember_fist_zubera.txt delete mode 100644 res/cardsfolder/ember_hauler.txt delete mode 100644 res/cardsfolder/ember_shot.txt delete mode 100644 res/cardsfolder/ember_weaver.txt delete mode 100644 res/cardsfolder/embermage_goblin.txt delete mode 100644 res/cardsfolder/embersmith.txt delete mode 100644 res/cardsfolder/emberstrike_duo.txt delete mode 100644 res/cardsfolder/emberwilde_augur.txt delete mode 100644 res/cardsfolder/emberwilde_caliph.txt delete mode 100644 res/cardsfolder/emerald_dragonfly.txt delete mode 100644 res/cardsfolder/emerald_medallion.txt delete mode 100644 res/cardsfolder/emerald_oryx.txt delete mode 100644 res/cardsfolder/emeria_angel.txt delete mode 100644 res/cardsfolder/emeria_the_sky_ruin.txt delete mode 100644 res/cardsfolder/emissary_of_despair.txt delete mode 100644 res/cardsfolder/emissary_of_hope.txt delete mode 100644 res/cardsfolder/emmessi_tome.txt delete mode 100644 res/cardsfolder/emperor_crocodile.txt delete mode 100644 res/cardsfolder/empress_galina.txt delete mode 100644 res/cardsfolder/empty_shrine_kannushi.txt delete mode 100644 res/cardsfolder/empty_the_catacombs.txt delete mode 100644 res/cardsfolder/empty_the_warrens.txt delete mode 100644 res/cardsfolder/empyrial_armor.txt delete mode 100644 res/cardsfolder/empyrial_plate.txt delete mode 100644 res/cardsfolder/emrakul_the_aeons_torn.txt delete mode 100644 res/cardsfolder/emrakuls_hatcher.txt delete mode 100644 res/cardsfolder/enatu_golem.txt delete mode 100644 res/cardsfolder/enchanted_being.txt delete mode 100644 res/cardsfolder/enchanted_evening.txt delete mode 100644 res/cardsfolder/enchantresss_presence.txt delete mode 100644 res/cardsfolder/enclave_cryptologist.txt delete mode 100644 res/cardsfolder/enclave_elite.txt delete mode 100644 res/cardsfolder/encroach.txt delete mode 100644 res/cardsfolder/endbringers_revel.txt delete mode 100644 res/cardsfolder/endless_cockroaches.txt delete mode 100644 res/cardsfolder/enemy_of_the_guildpact.txt delete mode 100644 res/cardsfolder/energizer.txt delete mode 100644 res/cardsfolder/energy_arc.txt delete mode 100644 res/cardsfolder/energy_bolt.txt delete mode 100644 res/cardsfolder/energy_field.txt delete mode 100644 res/cardsfolder/energy_flux.txt delete mode 100644 res/cardsfolder/energy_storm.txt delete mode 100644 res/cardsfolder/energy_tap.txt delete mode 100644 res/cardsfolder/enervate.txt delete mode 100644 res/cardsfolder/enfeeblement.txt delete mode 100644 res/cardsfolder/engineered_plague.txt delete mode 100644 res/cardsfolder/engulfing_flames.txt delete mode 100644 res/cardsfolder/enigma_eidolon.txt delete mode 100644 res/cardsfolder/enigma_sphinx.txt delete mode 100644 res/cardsfolder/enlightened_tutor.txt delete mode 100644 res/cardsfolder/enlisted_wurm.txt delete mode 100644 res/cardsfolder/enlistment_officer.txt delete mode 100644 res/cardsfolder/enormous_baloth.txt delete mode 100644 res/cardsfolder/enrage.txt delete mode 100644 res/cardsfolder/enshrined_memories.txt delete mode 100644 res/cardsfolder/enslave.txt delete mode 100644 res/cardsfolder/enslaved_dwarf.txt delete mode 100644 res/cardsfolder/enslaved_scout.txt delete mode 100644 res/cardsfolder/ensnare.txt delete mode 100644 res/cardsfolder/ensnaring_bridge.txt delete mode 100644 res/cardsfolder/entangling_trap.txt delete mode 100644 res/cardsfolder/entangling_vines.txt delete mode 100644 res/cardsfolder/entomb.txt delete mode 100644 res/cardsfolder/entropic_eidolon.txt delete mode 100644 res/cardsfolder/entropic_specter.txt delete mode 100644 res/cardsfolder/envelop.txt delete mode 100644 res/cardsfolder/eon_hub.txt delete mode 100644 res/cardsfolder/ephemeron.txt delete mode 100644 res/cardsfolder/epic_proportions.txt delete mode 100644 res/cardsfolder/epic_struggle.txt delete mode 100644 res/cardsfolder/equilibrium.txt delete mode 100644 res/cardsfolder/erase.txt delete mode 100644 res/cardsfolder/erg_raiders.txt delete mode 100644 res/cardsfolder/eron_the_relentless.txt delete mode 100644 res/cardsfolder/errant_doomsayers.txt delete mode 100644 res/cardsfolder/errant_ephemeron.txt delete mode 100644 res/cardsfolder/erratic_explosion.txt delete mode 100644 res/cardsfolder/erratic_portal.txt delete mode 100644 res/cardsfolder/ertai_the_corrupted.txt delete mode 100644 res/cardsfolder/ertai_wizard_adept.txt delete mode 100644 res/cardsfolder/ertais_trickery.txt delete mode 100644 res/cardsfolder/escape_artist.txt delete mode 100644 res/cardsfolder/escape_routes.txt delete mode 100644 res/cardsfolder/escaped_null.txt delete mode 100644 res/cardsfolder/esper_battlemage.txt delete mode 100644 res/cardsfolder/esper_charm.txt delete mode 100644 res/cardsfolder/esper_cormorants.txt delete mode 100644 res/cardsfolder/esper_panorama.txt delete mode 100644 res/cardsfolder/esper_sojourners.txt delete mode 100644 res/cardsfolder/esper_stormblade.txt delete mode 100644 res/cardsfolder/esperzoa.txt delete mode 100644 res/cardsfolder/essence_drain.txt delete mode 100644 res/cardsfolder/essence_feed.txt delete mode 100644 res/cardsfolder/essence_flare.txt delete mode 100644 res/cardsfolder/essence_fracture.txt delete mode 100644 res/cardsfolder/essence_scatter.txt delete mode 100644 res/cardsfolder/essence_sliver.txt delete mode 100644 res/cardsfolder/essence_warden.txt delete mode 100644 res/cardsfolder/etched_champion.txt delete mode 100644 res/cardsfolder/etched_monstrosity.txt delete mode 100644 res/cardsfolder/etched_oracle.txt delete mode 100644 res/cardsfolder/eternal_dragon.txt delete mode 100644 res/cardsfolder/eternal_flame.txt delete mode 100644 res/cardsfolder/eternal_warrior.txt delete mode 100644 res/cardsfolder/eternal_witness.txt delete mode 100644 res/cardsfolder/eternity_snare.txt delete mode 100644 res/cardsfolder/eternity_vessel.txt delete mode 100644 res/cardsfolder/ethercaste_knight.txt delete mode 100644 res/cardsfolder/ethereal_champion.txt delete mode 100644 res/cardsfolder/ethereal_usher.txt delete mode 100644 res/cardsfolder/ethereal_whiskergill.txt delete mode 100644 res/cardsfolder/etherium_abomination.txt delete mode 100644 res/cardsfolder/etherium_astrolabe.txt delete mode 100644 res/cardsfolder/etherium_sculptor.txt delete mode 100644 res/cardsfolder/ethersworn_adjudicator.txt delete mode 100644 res/cardsfolder/evacuation.txt delete mode 100644 res/cardsfolder/evaporate.txt delete mode 100644 res/cardsfolder/evasive_action.txt delete mode 100644 res/cardsfolder/even_the_odds.txt delete mode 100644 res/cardsfolder/everbark_shaman.txt delete mode 100644 res/cardsfolder/everflowing_chalice.txt delete mode 100644 res/cardsfolder/everglades.txt delete mode 100644 res/cardsfolder/evil_eye_of_orms_by_gore.txt delete mode 100644 res/cardsfolder/evil_eye_of_urborg.txt delete mode 100644 res/cardsfolder/evil_presence.txt delete mode 100644 res/cardsfolder/evincars_justice.txt delete mode 100644 res/cardsfolder/eviscerator.txt delete mode 100644 res/cardsfolder/evolution_charm.txt delete mode 100644 res/cardsfolder/evolving_wilds.txt delete mode 100644 res/cardsfolder/exalted_angel.txt delete mode 100644 res/cardsfolder/excavation.txt delete mode 100644 res/cardsfolder/excise.txt delete mode 100644 res/cardsfolder/exclude.txt delete mode 100644 res/cardsfolder/excommunicate.txt delete mode 100644 res/cardsfolder/execute.txt delete mode 100644 res/cardsfolder/executioners_capsule.txt delete mode 100644 res/cardsfolder/exhaustion.txt delete mode 100644 res/cardsfolder/exhume.txt delete mode 100644 res/cardsfolder/exile.txt delete mode 100644 res/cardsfolder/exile_into_darkness.txt delete mode 100644 res/cardsfolder/exiled_boggart.txt delete mode 100644 res/cardsfolder/exorcist.txt delete mode 100644 res/cardsfolder/exoskeletal_armor.txt delete mode 100644 res/cardsfolder/exotic_curse.txt delete mode 100644 res/cardsfolder/exotic_disease.txt delete mode 100644 res/cardsfolder/exotic_orchard.txt delete mode 100644 res/cardsfolder/expedition_map.txt delete mode 100644 res/cardsfolder/expendable_troops.txt delete mode 100644 res/cardsfolder/exploding_borders.txt delete mode 100644 res/cardsfolder/exploration.txt delete mode 100644 res/cardsfolder/explore.txt delete mode 100644 res/cardsfolder/explosive_growth.txt delete mode 100644 res/cardsfolder/explosive_revelation.txt delete mode 100644 res/cardsfolder/explosive_vegetation.txt delete mode 100644 res/cardsfolder/expunge.txt delete mode 100644 res/cardsfolder/exsanguinate.txt delete mode 100644 res/cardsfolder/extinguish.txt delete mode 100755 res/cardsfolder/extortion.txt delete mode 100644 res/cardsfolder/extra_arms.txt delete mode 100644 res/cardsfolder/extract.txt delete mode 100644 res/cardsfolder/extractor_demon.txt delete mode 100644 res/cardsfolder/extruder.txt delete mode 100644 res/cardsfolder/exuberant_firestoker.txt delete mode 100644 res/cardsfolder/eye_of_nowhere.txt delete mode 100644 res/cardsfolder/eye_of_ramos.txt delete mode 100644 res/cardsfolder/eye_of_ugin.txt delete mode 100644 res/cardsfolder/eye_spy.txt delete mode 100644 res/cardsfolder/eyeblights_ending.txt delete mode 100644 res/cardsfolder/eyes_of_the_wisent.txt delete mode 100644 res/cardsfolder/ezuri_renegade_leader.txt delete mode 100644 res/cardsfolder/ezuris_archers.txt delete mode 100644 res/cardsfolder/ezuris_brigade.txt delete mode 100644 res/cardsfolder/fable_of_wolf_and_owl.txt delete mode 100644 res/cardsfolder/fabricate.txt delete mode 100644 res/cardsfolder/face_of_fear.txt delete mode 100644 res/cardsfolder/faceless_butcher.txt delete mode 100644 res/cardsfolder/faceless_devourer.txt delete mode 100644 res/cardsfolder/facevaulter.txt delete mode 100644 res/cardsfolder/fact_or_fiction.txt delete mode 100644 res/cardsfolder/fade_from_memory.txt delete mode 100644 res/cardsfolder/faerie_conclave.txt delete mode 100644 res/cardsfolder/faerie_harbinger.txt delete mode 100644 res/cardsfolder/faerie_macabre.txt delete mode 100644 res/cardsfolder/faerie_mechanist.txt delete mode 100644 res/cardsfolder/faerie_noble.txt delete mode 100644 res/cardsfolder/faerie_swarm.txt delete mode 100644 res/cardsfolder/faerie_tauntings.txt delete mode 100644 res/cardsfolder/faerie_trickery.txt delete mode 100644 res/cardsfolder/faith_healer.txt delete mode 100644 res/cardsfolder/fallen_angel.txt delete mode 100644 res/cardsfolder/fallen_askari.txt delete mode 100644 res/cardsfolder/fallen_cleric.txt delete mode 100644 res/cardsfolder/fallen_ferromancer.txt delete mode 100644 res/cardsfolder/fallen_ideal.txt delete mode 100644 res/cardsfolder/fallow_earth.txt delete mode 100644 res/cardsfolder/fallowsage.txt delete mode 100644 res/cardsfolder/false_cure.txt delete mode 100644 res/cardsfolder/false_defeat.txt delete mode 100644 res/cardsfolder/false_demise.txt delete mode 100644 res/cardsfolder/false_mourning.txt delete mode 100644 res/cardsfolder/false_prophet.txt delete mode 100644 res/cardsfolder/false_summoning.txt delete mode 100644 res/cardsfolder/falter.txt delete mode 100644 res/cardsfolder/familiar_ground.txt delete mode 100644 res/cardsfolder/familiars_ruse.txt delete mode 100644 res/cardsfolder/famine.txt delete mode 100644 res/cardsfolder/fanatical_devotion.txt delete mode 100644 res/cardsfolder/fanatical_fever.txt delete mode 100644 res/cardsfolder/fang_skulkin.txt delete mode 100644 res/cardsfolder/fangren_firstborn.txt delete mode 100644 res/cardsfolder/fangren_hunter.txt delete mode 100644 res/cardsfolder/fangren_marauder.txt delete mode 100644 res/cardsfolder/fangren_pathcutter.txt delete mode 100644 res/cardsfolder/fanning_the_flames.txt delete mode 100644 res/cardsfolder/far_wanderings.txt delete mode 100644 res/cardsfolder/farhaven_elf.txt delete mode 100644 res/cardsfolder/farmstead.txt delete mode 100644 res/cardsfolder/farrelite_priest.txt delete mode 100644 res/cardsfolder/farseek.txt delete mode 100644 res/cardsfolder/farsight_mask.txt delete mode 100644 res/cardsfolder/fastbond.txt delete mode 100644 res/cardsfolder/fatal_attraction.txt delete mode 100644 res/cardsfolder/fatal_blow.txt delete mode 100644 res/cardsfolder/fatal_frenzy.txt delete mode 100644 res/cardsfolder/fatal_mutation.txt delete mode 100644 res/cardsfolder/fatestitcher.txt delete mode 100644 res/cardsfolder/fathom_seer.txt delete mode 100644 res/cardsfolder/fault_line.txt delete mode 100644 res/cardsfolder/fault_riders.txt delete mode 100644 res/cardsfolder/faultgrinder.txt delete mode 100644 res/cardsfolder/fauna_shaman.txt delete mode 100644 res/cardsfolder/favor_of_the_mighty.txt delete mode 100644 res/cardsfolder/favor_of_the_overbeing.txt delete mode 100644 res/cardsfolder/favorable_destiny.txt delete mode 100644 res/cardsfolder/fear.txt delete mode 100644 res/cardsfolder/feast_of_blood.txt delete mode 100644 res/cardsfolder/feast_of_flesh.txt delete mode 100644 res/cardsfolder/feast_of_the_unicorn.txt delete mode 100644 res/cardsfolder/feast_of_worms.txt delete mode 100644 res/cardsfolder/feast_or_famine.txt delete mode 100644 res/cardsfolder/fecundity.txt delete mode 100644 res/cardsfolder/feebleness.txt delete mode 100644 res/cardsfolder/feedback.txt delete mode 100644 res/cardsfolder/feedback_bolt.txt delete mode 100644 res/cardsfolder/feeding_frenzy.txt delete mode 100644 res/cardsfolder/feldons_cane.txt delete mode 100644 res/cardsfolder/felidar_sovereign.txt delete mode 100644 res/cardsfolder/fellwar_stone.txt delete mode 100644 res/cardsfolder/femeref_archers.txt delete mode 100644 res/cardsfolder/femeref_enchantress.txt delete mode 100644 res/cardsfolder/femeref_healer.txt delete mode 100644 res/cardsfolder/femeref_knight.txt delete mode 100644 res/cardsfolder/femeref_scouts.txt delete mode 100644 res/cardsfolder/fen_stalker.txt delete mode 100644 res/cardsfolder/fencer_clique.txt delete mode 100644 res/cardsfolder/fencers_magemark.txt delete mode 100644 res/cardsfolder/fend_off.txt delete mode 100644 res/cardsfolder/fendeep_summoner.txt delete mode 100644 res/cardsfolder/feral_animist.txt delete mode 100644 res/cardsfolder/feral_hydra.txt delete mode 100644 res/cardsfolder/feral_instinct.txt delete mode 100644 res/cardsfolder/feral_lightning.txt delete mode 100644 res/cardsfolder/feral_shadow.txt delete mode 100644 res/cardsfolder/feral_thallid.txt delete mode 100644 res/cardsfolder/ferocious_charge.txt delete mode 100755 res/cardsfolder/ferocity.txt delete mode 100644 res/cardsfolder/ferozs_ban.txt delete mode 100644 res/cardsfolder/ferrovore.txt delete mode 100644 res/cardsfolder/fertilid.txt delete mode 100644 res/cardsfolder/fervent_charge.txt delete mode 100644 res/cardsfolder/fervent_denial.txt delete mode 100644 res/cardsfolder/fervor.txt delete mode 100644 res/cardsfolder/festercreep.txt delete mode 100644 res/cardsfolder/festering_evil.txt delete mode 100644 res/cardsfolder/festering_goblin.txt delete mode 100644 res/cardsfolder/festering_march.txt delete mode 100644 res/cardsfolder/festering_wound.txt delete mode 100644 res/cardsfolder/festival.txt delete mode 100644 res/cardsfolder/festival_of_trokin.txt delete mode 100644 res/cardsfolder/fetid_heath.txt delete mode 100644 res/cardsfolder/fetid_horror.txt delete mode 100644 res/cardsfolder/feudkillers_verdict.txt delete mode 100644 res/cardsfolder/fever_charm.txt delete mode 100644 res/cardsfolder/fevered_convulsions.txt delete mode 100644 res/cardsfolder/fevered_strength.txt delete mode 100644 res/cardsfolder/fiddlehead_kami.txt delete mode 100644 res/cardsfolder/field_marshal.txt delete mode 100644 res/cardsfolder/field_of_souls.txt delete mode 100644 res/cardsfolder/fieldmist_borderpost.txt delete mode 100644 res/cardsfolder/fierce_empath.txt delete mode 100644 res/cardsfolder/fiery_conclusion.txt delete mode 100644 res/cardsfolder/fiery_fall.txt delete mode 100644 res/cardsfolder/fiery_hellhound.txt delete mode 100644 res/cardsfolder/fiery_mantle.txt delete mode 100644 res/cardsfolder/fiery_temper.txt delete mode 100644 res/cardsfolder/fight_to_the_death.txt delete mode 100644 res/cardsfolder/fighting_drake.txt delete mode 100644 res/cardsfolder/figure_of_destiny.txt delete mode 100644 res/cardsfolder/filigree_angel.txt delete mode 100644 res/cardsfolder/filigree_fracture.txt delete mode 100644 res/cardsfolder/filigree_sages.txt delete mode 100644 res/cardsfolder/fill_with_fright.txt delete mode 100644 res/cardsfolder/filth.txt delete mode 100644 res/cardsfolder/filthy_cur.txt delete mode 100644 res/cardsfolder/final_judgment.txt delete mode 100644 res/cardsfolder/final_revels.txt delete mode 100644 res/cardsfolder/final_sting_faerie.txt delete mode 100644 res/cardsfolder/final_strike.txt delete mode 100644 res/cardsfolder/finest_hour.txt delete mode 100644 res/cardsfolder/fire_ambush.txt delete mode 100644 res/cardsfolder/fire_ants.txt delete mode 100644 res/cardsfolder/fire_at_will.txt delete mode 100644 res/cardsfolder/fire_belly_changeling.txt delete mode 100644 res/cardsfolder/fire_bowman.txt delete mode 100644 res/cardsfolder/fire_diamond.txt delete mode 100644 res/cardsfolder/fire_dragon.txt delete mode 100644 res/cardsfolder/fire_drake.txt delete mode 100644 res/cardsfolder/fire_elemental.txt delete mode 100644 res/cardsfolder/fire_field_ogre.txt delete mode 100644 res/cardsfolder/fire_imp.txt delete mode 100644 res/cardsfolder/fire_lit_thicket.txt delete mode 100644 res/cardsfolder/fire_servant.txt delete mode 100644 res/cardsfolder/fire_snake.txt delete mode 100644 res/cardsfolder/fire_sprites.txt delete mode 100644 res/cardsfolder/fire_tempest.txt delete mode 100644 res/cardsfolder/fireball.txt delete mode 100644 res/cardsfolder/fireblast.txt delete mode 100644 res/cardsfolder/firebolt.txt delete mode 100644 res/cardsfolder/firebreathing.txt delete mode 100644 res/cardsfolder/firecat_blitz.txt delete mode 100644 res/cardsfolder/firefly.txt delete mode 100644 res/cardsfolder/firemane_angel.txt delete mode 100644 res/cardsfolder/firemaw_kavu.txt delete mode 100644 res/cardsfolder/fires_of_yavimaya.txt delete mode 100644 res/cardsfolder/firescreamer.txt delete mode 100644 res/cardsfolder/fireshrieker.txt delete mode 100644 res/cardsfolder/fireslinger.txt delete mode 100644 res/cardsfolder/firestorm.txt delete mode 100644 res/cardsfolder/firestorm_hellkite.txt delete mode 100644 res/cardsfolder/firewake_sliver.txt delete mode 100644 res/cardsfolder/firewild_borderpost.txt delete mode 100644 res/cardsfolder/first_volley.txt delete mode 100644 res/cardsfolder/fishliver_oil.txt delete mode 100644 res/cardsfolder/fissure.txt delete mode 100644 res/cardsfolder/fissure_vent.txt delete mode 100644 res/cardsfolder/fistful_of_force.txt delete mode 100644 res/cardsfolder/fists_of_ironwood.txt delete mode 100644 res/cardsfolder/fists_of_the_anvil.txt delete mode 100644 res/cardsfolder/fists_of_the_demigod.txt delete mode 100644 res/cardsfolder/fit_of_rage.txt delete mode 100644 res/cardsfolder/flagstones_of_trokair.txt delete mode 100644 res/cardsfolder/flailing_manticore.txt delete mode 100644 res/cardsfolder/flailing_ogre.txt delete mode 100644 res/cardsfolder/flailing_soldier.txt delete mode 100644 res/cardsfolder/flame_burst.txt delete mode 100644 res/cardsfolder/flame_elemental.txt delete mode 100644 res/cardsfolder/flame_jab.txt delete mode 100644 res/cardsfolder/flame_javelin.txt delete mode 100644 res/cardsfolder/flame_jet.txt delete mode 100644 res/cardsfolder/flame_kin_zealot.txt delete mode 100644 res/cardsfolder/flame_rift.txt delete mode 100644 res/cardsfolder/flame_slash.txt delete mode 100644 res/cardsfolder/flame_spirit.txt delete mode 100644 res/cardsfolder/flameblast_dragon.txt delete mode 100644 res/cardsfolder/flameborn_hellion.txt delete mode 100644 res/cardsfolder/flameborn_viron.txt delete mode 100644 res/cardsfolder/flamebreak.txt delete mode 100644 res/cardsfolder/flamecore_elemental.txt delete mode 100644 res/cardsfolder/flamekin_brawler.txt delete mode 100644 res/cardsfolder/flamekin_harbinger.txt delete mode 100644 res/cardsfolder/flamekin_spitfire.txt delete mode 100644 res/cardsfolder/flameshot.txt delete mode 100644 res/cardsfolder/flametongue_kavu.txt delete mode 100644 res/cardsfolder/flamewave_invoker.txt delete mode 100644 res/cardsfolder/flaming_sword.txt delete mode 100644 res/cardsfolder/flanking_troops.txt delete mode 100644 res/cardsfolder/flare.txt delete mode 100644 res/cardsfolder/flaring_flame_kin.txt delete mode 100644 res/cardsfolder/flash_counter.txt delete mode 100644 res/cardsfolder/flash_flood.txt delete mode 100644 res/cardsfolder/flash_of_defiance.txt delete mode 100644 res/cardsfolder/flashfires.txt delete mode 100644 res/cardsfolder/flashfreeze.txt delete mode 100644 res/cardsfolder/flayed_nim.txt delete mode 100644 res/cardsfolder/flayer_husk.txt delete mode 100644 res/cardsfolder/fledgling_djinn.txt delete mode 100644 res/cardsfolder/fledgling_dragon.txt delete mode 100644 res/cardsfolder/fledgling_griffin.txt delete mode 100644 res/cardsfolder/fledgling_imp.txt delete mode 100644 res/cardsfolder/fledgling_mawcor.txt delete mode 100644 res/cardsfolder/fledgling_osprey.txt delete mode 100644 res/cardsfolder/fleet_footed_monk.txt delete mode 100644 res/cardsfolder/fleetfoot_panther.txt delete mode 100644 res/cardsfolder/fleeting_aven.txt delete mode 100644 res/cardsfolder/fleeting_distraction.txt delete mode 100644 res/cardsfolder/fleeting_image.txt delete mode 100644 res/cardsfolder/flensermite.txt delete mode 100644 res/cardsfolder/flesh_allergy.txt delete mode 100644 res/cardsfolder/flesh_eater_imp.txt delete mode 100644 res/cardsfolder/fleshbag_marauder.txt delete mode 100644 res/cardsfolder/fleshformer.txt delete mode 100644 res/cardsfolder/fleshgrafter.txt delete mode 100644 res/cardsfolder/fleshwrither.txt delete mode 100644 res/cardsfolder/flicker.txt delete mode 100644 res/cardsfolder/flickerwisp.txt delete mode 100644 res/cardsfolder/flight.txt delete mode 100644 res/cardsfolder/flight_of_fancy.txt delete mode 100644 res/cardsfolder/flight_spellbomb.txt delete mode 100644 res/cardsfolder/fling.txt delete mode 100644 res/cardsfolder/flint_golem.txt delete mode 100644 res/cardsfolder/floating_dream_zubera.txt delete mode 100644 res/cardsfolder/flood.txt delete mode 100644 res/cardsfolder/flood_plain.txt delete mode 100644 res/cardsfolder/floodbringer.txt delete mode 100644 res/cardsfolder/flooded_grove.txt delete mode 100644 res/cardsfolder/flooded_shoreline.txt delete mode 100644 res/cardsfolder/flooded_strand.txt delete mode 100644 res/cardsfolder/floodwater_dam.txt delete mode 100644 res/cardsfolder/flourishing_defenses.txt delete mode 100644 res/cardsfolder/flow_of_ideas.txt delete mode 100644 res/cardsfolder/flow_of_maggots.txt delete mode 100644 res/cardsfolder/flowstone_blade.txt delete mode 100644 res/cardsfolder/flowstone_charger.txt delete mode 100644 res/cardsfolder/flowstone_crusher.txt delete mode 100644 res/cardsfolder/flowstone_embrace.txt delete mode 100644 res/cardsfolder/flowstone_flood.txt delete mode 100644 res/cardsfolder/flowstone_giant.txt delete mode 100644 res/cardsfolder/flowstone_hellion.txt delete mode 100644 res/cardsfolder/flowstone_mauler.txt delete mode 100644 res/cardsfolder/flowstone_overseer.txt delete mode 100644 res/cardsfolder/flowstone_salamander.txt delete mode 100644 res/cardsfolder/flowstone_sculpture.txt delete mode 100644 res/cardsfolder/flowstone_shambler.txt delete mode 100644 res/cardsfolder/flowstone_slide.txt delete mode 100644 res/cardsfolder/flowstone_strike.txt delete mode 100644 res/cardsfolder/flowstone_surge.txt delete mode 100644 res/cardsfolder/flowstone_thopter.txt delete mode 100644 res/cardsfolder/flowstone_wall.txt delete mode 100644 res/cardsfolder/flowstone_wyvern.txt delete mode 100644 res/cardsfolder/fluctuator.txt delete mode 100644 res/cardsfolder/flurry_of_wings.txt delete mode 100644 res/cardsfolder/flying_carpet.txt delete mode 100644 res/cardsfolder/flying_men.txt delete mode 100644 res/cardsfolder/fodder_cannon.txt delete mode 100644 res/cardsfolder/fodder_launch.txt delete mode 100644 res/cardsfolder/fog.txt delete mode 100644 res/cardsfolder/fog_bank.txt delete mode 100644 res/cardsfolder/fog_elemental.txt delete mode 100644 res/cardsfolder/fog_of_gnats.txt delete mode 100644 res/cardsfolder/folk_medicine.txt delete mode 100644 res/cardsfolder/folk_of_an_havva.txt delete mode 100644 res/cardsfolder/folk_of_the_pines.txt delete mode 100644 res/cardsfolder/followed_footsteps.txt delete mode 100644 res/cardsfolder/fomori_nomad.txt delete mode 100644 res/cardsfolder/font_of_mythos.txt delete mode 100644 res/cardsfolder/fools_demise.txt delete mode 100644 res/cardsfolder/fools_tome.txt delete mode 100644 res/cardsfolder/foot_soldiers.txt delete mode 100644 res/cardsfolder/footbottom_feast.txt delete mode 100644 res/cardsfolder/foothill_guide.txt delete mode 100644 res/cardsfolder/footsteps_of_the_goryo.txt delete mode 100644 res/cardsfolder/foratog.txt delete mode 100644 res/cardsfolder/forbid.txt delete mode 100644 res/cardsfolder/forbidden_lore.txt delete mode 100644 res/cardsfolder/forbidden_orchard.txt delete mode 100644 res/cardsfolder/forbidding_watchtower.txt delete mode 100644 res/cardsfolder/force_of_nature.txt delete mode 100644 res/cardsfolder/force_of_savagery.txt delete mode 100644 res/cardsfolder/force_of_will.txt delete mode 100644 res/cardsfolder/force_spike.txt delete mode 100644 res/cardsfolder/force_void.txt delete mode 100644 res/cardsfolder/forced_fruition.txt delete mode 100755 res/cardsfolder/forced_march.txt delete mode 100644 res/cardsfolder/forced_retreat.txt delete mode 100644 res/cardsfolder/forced_worship.txt delete mode 100644 res/cardsfolder/forcemage_advocate.txt delete mode 100644 res/cardsfolder/foresee.txt delete mode 100644 res/cardsfolder/foresight.txt delete mode 100644 res/cardsfolder/forest.txt delete mode 100644 res/cardsfolder/forest_bear.txt delete mode 100644 res/cardsfolder/forethought_amulet.txt delete mode 100644 res/cardsfolder/forfend.txt delete mode 100644 res/cardsfolder/forge_armor.txt delete mode 100644 res/cardsfolder/forgotten_ancient.txt delete mode 100644 res/cardsfolder/forgotten_cave.txt delete mode 100644 res/cardsfolder/forgotten_harvest.txt delete mode 100644 res/cardsfolder/fork.txt delete mode 100644 res/cardsfolder/forked_bolt.txt delete mode 100644 res/cardsfolder/forked_branch_garami.txt delete mode 100644 res/cardsfolder/form_of_the_dragon.txt delete mode 100644 res/cardsfolder/forsaken_city.txt delete mode 100644 res/cardsfolder/forsaken_wastes.txt delete mode 100644 res/cardsfolder/fortify.txt delete mode 100644 res/cardsfolder/fortitude.txt delete mode 100644 res/cardsfolder/fortune_thief.txt delete mode 100644 res/cardsfolder/foul_familiar.txt delete mode 100644 res/cardsfolder/foul_imp.txt delete mode 100644 res/cardsfolder/foul_presence.txt delete mode 100644 res/cardsfolder/foul_spirit.txt delete mode 100644 res/cardsfolder/fountain_of_youth.txt delete mode 100644 res/cardsfolder/fountain_watch.txt delete mode 100644 res/cardsfolder/foxfire.txt delete mode 100644 res/cardsfolder/foxfire_oak.txt delete mode 100644 res/cardsfolder/fracturing_gust.txt delete mode 100644 res/cardsfolder/frantic_purification.txt delete mode 100644 res/cardsfolder/frantic_salvage.txt delete mode 100644 res/cardsfolder/frantic_search.txt delete mode 100644 res/cardsfolder/frazzle.txt delete mode 100644 res/cardsfolder/freed_from_the_real.txt delete mode 100644 res/cardsfolder/freewind_equenaut.txt delete mode 100644 res/cardsfolder/freewind_falcon.txt delete mode 100644 res/cardsfolder/frenetic_ogre.txt delete mode 100644 res/cardsfolder/frenetic_raptor.txt delete mode 100644 res/cardsfolder/frenzied_tilling.txt delete mode 100644 res/cardsfolder/fresh_meat.txt delete mode 100644 res/cardsfolder/fresh_volunteers.txt delete mode 100644 res/cardsfolder/freyalise_supplicant.txt delete mode 100644 res/cardsfolder/freyalises_charm.txt delete mode 100644 res/cardsfolder/freyalises_radiance.txt delete mode 100644 res/cardsfolder/freyalises_winds.txt delete mode 100644 res/cardsfolder/frightcrawler.txt delete mode 100644 res/cardsfolder/frog_tongue.txt delete mode 100644 res/cardsfolder/frogmite.txt delete mode 100644 res/cardsfolder/frogtosser_banneret.txt delete mode 100644 res/cardsfolder/frontier_guide.txt delete mode 100644 res/cardsfolder/frontline_sage.txt delete mode 100644 res/cardsfolder/frontline_strategist.txt delete mode 100644 res/cardsfolder/frost_giant.txt delete mode 100644 res/cardsfolder/frost_marsh.txt delete mode 100644 res/cardsfolder/frost_ogre.txt delete mode 100644 res/cardsfolder/frost_raptor.txt delete mode 100644 res/cardsfolder/frost_titan.txt delete mode 100644 res/cardsfolder/frostling.txt delete mode 100644 res/cardsfolder/frostweb_spider.txt delete mode 100644 res/cardsfolder/frostwind_invoker.txt delete mode 100644 res/cardsfolder/frozen_aether.txt delete mode 100644 res/cardsfolder/frozen_shade.txt delete mode 100644 res/cardsfolder/frozen_solid.txt delete mode 100644 res/cardsfolder/fruition.txt delete mode 100644 res/cardsfolder/fuel_for_the_cause.txt delete mode 100644 res/cardsfolder/fugitive_wizard.txt delete mode 100644 res/cardsfolder/fugue.txt delete mode 100644 res/cardsfolder/fulminator_mage.txt delete mode 100644 res/cardsfolder/fume_spitter.txt delete mode 100644 res/cardsfolder/fumiko_the_lowblood.txt delete mode 100644 res/cardsfolder/funeral_charm.txt delete mode 100644 res/cardsfolder/funeral_march.txt delete mode 100644 res/cardsfolder/funeral_pyre.txt delete mode 100644 res/cardsfolder/fungal_bloom.txt delete mode 100644 res/cardsfolder/fungal_reaches.txt delete mode 100644 res/cardsfolder/fungal_shambler.txt delete mode 100644 res/cardsfolder/fungus_elemental.txt delete mode 100644 res/cardsfolder/fungus_sliver.txt delete mode 100644 res/cardsfolder/fungusaur.txt delete mode 100644 res/cardsfolder/furious_assault.txt delete mode 100644 res/cardsfolder/furnace_brood.txt delete mode 100644 res/cardsfolder/furnace_celebration.txt delete mode 100644 res/cardsfolder/furnace_of_rath.txt delete mode 100644 res/cardsfolder/furnace_scamp.txt delete mode 100644 res/cardsfolder/furnace_spirit.txt delete mode 100644 res/cardsfolder/furnace_whelp.txt delete mode 100644 res/cardsfolder/fury_sliver.txt delete mode 100644 res/cardsfolder/fusion_elemental.txt delete mode 100644 res/cardsfolder/fylamarid.txt delete mode 100644 res/cardsfolder/fyndhorn_bow.txt delete mode 100644 res/cardsfolder/fyndhorn_brownie.txt delete mode 100644 res/cardsfolder/fyndhorn_elder.txt delete mode 100644 res/cardsfolder/fyndhorn_elves.txt delete mode 100644 res/cardsfolder/fyndhorn_pollen.txt delete mode 100644 res/cardsfolder/gaddock_teeg.txt delete mode 100644 res/cardsfolder/gaeas_anthem.txt delete mode 100644 res/cardsfolder/gaeas_avenger.txt delete mode 100644 res/cardsfolder/gaeas_bounty.txt delete mode 100644 res/cardsfolder/gaeas_cradle.txt delete mode 100644 res/cardsfolder/gaeas_embrace.txt delete mode 100644 res/cardsfolder/gaeas_herald.txt delete mode 100644 res/cardsfolder/gaeas_might.txt delete mode 100644 res/cardsfolder/gaeas_revenge.txt delete mode 100644 res/cardsfolder/gaeas_skyfolk.txt delete mode 100644 res/cardsfolder/gainsay.txt delete mode 100644 res/cardsfolder/gale_force.txt delete mode 100644 res/cardsfolder/galepowder_mage.txt delete mode 100644 res/cardsfolder/galinas_knight.txt delete mode 100644 res/cardsfolder/gallantry.txt delete mode 100644 res/cardsfolder/galvanic_arc.txt delete mode 100644 res/cardsfolder/galvanic_blast.txt delete mode 100644 res/cardsfolder/galvanic_key.txt delete mode 100644 res/cardsfolder/gamble.txt delete mode 100644 res/cardsfolder/game_trail_changeling.txt delete mode 100644 res/cardsfolder/gang_of_elk.txt delete mode 100644 res/cardsfolder/gangrenous_goliath.txt delete mode 100644 res/cardsfolder/gangrenous_zombies.txt delete mode 100644 res/cardsfolder/gargoyle_castle.txt delete mode 100644 res/cardsfolder/garruk_wildspeaker.txt delete mode 100644 res/cardsfolder/garruks_companion.txt delete mode 100644 res/cardsfolder/garruks_packleader.txt delete mode 100644 res/cardsfolder/garza_zol_plague_queen.txt delete mode 100644 res/cardsfolder/gaseous_form.txt delete mode 100644 res/cardsfolder/gate_hound.txt delete mode 100644 res/cardsfolder/gate_to_phyrexia.txt delete mode 100644 res/cardsfolder/gatekeeper_of_malakir.txt delete mode 100644 res/cardsfolder/gathan_raiders.txt delete mode 100644 res/cardsfolder/gatherer_of_graces.txt delete mode 100644 res/cardsfolder/gauntlet_of_might.txt delete mode 100644 res/cardsfolder/gaze_of_adamaro.txt delete mode 100644 res/cardsfolder/gaze_of_justice.txt delete mode 100644 res/cardsfolder/gelatinous_genesis.txt delete mode 100644 res/cardsfolder/gelectrode.txt delete mode 100644 res/cardsfolder/gelid_shackles.txt delete mode 100644 res/cardsfolder/gemhide_sliver.txt delete mode 100644 res/cardsfolder/gemini_engine.txt delete mode 100644 res/cardsfolder/gempalm_avenger.txt delete mode 100644 res/cardsfolder/gempalm_incinerator.txt delete mode 100644 res/cardsfolder/gempalm_polluter.txt delete mode 100644 res/cardsfolder/gempalm_sorcerer.txt delete mode 100644 res/cardsfolder/gempalm_strider.txt delete mode 100644 res/cardsfolder/gemstone_array.txt delete mode 100644 res/cardsfolder/gemstone_mine.txt delete mode 100644 res/cardsfolder/generals_kabuto.txt delete mode 100644 res/cardsfolder/genesis.txt delete mode 100644 res/cardsfolder/genesis_chamber.txt delete mode 100644 res/cardsfolder/genesis_wave.txt delete mode 100644 res/cardsfolder/genju_of_the_realm.txt delete mode 100644 res/cardsfolder/geothermal_crevice.txt delete mode 100644 res/cardsfolder/gerrards_battle_cry.txt delete mode 100644 res/cardsfolder/gerrards_command.txt delete mode 100644 res/cardsfolder/gerrards_irregulars.txt delete mode 100644 res/cardsfolder/gerrards_verdict.txt delete mode 100644 res/cardsfolder/gerrards_wisdom.txt delete mode 100644 res/cardsfolder/geth_lord_of_the_vault.txt delete mode 100644 res/cardsfolder/geths_grimoire.txt delete mode 100644 res/cardsfolder/geths_verdict.txt delete mode 100644 res/cardsfolder/geyser_glider.txt delete mode 100644 res/cardsfolder/ghalmas_warden.txt delete mode 100644 res/cardsfolder/ghastlord_of_fugue.txt delete mode 100644 res/cardsfolder/ghastly_demise.txt delete mode 100644 res/cardsfolder/ghitu_encampment.txt delete mode 100644 res/cardsfolder/ghitu_fire_eater.txt delete mode 100644 res/cardsfolder/ghitu_slinger.txt delete mode 100644 res/cardsfolder/ghitu_war_cry.txt delete mode 100644 res/cardsfolder/ghor_clan_bloodscale.txt delete mode 100644 res/cardsfolder/ghor_clan_savage.txt delete mode 100644 res/cardsfolder/ghost_hounds.txt delete mode 100644 res/cardsfolder/ghost_lit_nourisher.txt delete mode 100644 res/cardsfolder/ghost_lit_raider.txt delete mode 100644 res/cardsfolder/ghost_lit_redeemer.txt delete mode 100644 res/cardsfolder/ghost_lit_stalker.txt delete mode 100644 res/cardsfolder/ghost_lit_warder.txt delete mode 100644 res/cardsfolder/ghost_quarter.txt delete mode 100644 res/cardsfolder/ghost_ship.txt delete mode 100644 res/cardsfolder/ghost_tactician.txt delete mode 100644 res/cardsfolder/ghost_town.txt delete mode 100644 res/cardsfolder/ghost_warden.txt delete mode 100644 res/cardsfolder/ghostfire.txt delete mode 100644 res/cardsfolder/ghostflame_sliver.txt delete mode 100644 res/cardsfolder/ghostly_changeling.txt delete mode 100644 res/cardsfolder/ghostly_prison.txt delete mode 100644 res/cardsfolder/ghostly_visit.txt delete mode 100644 res/cardsfolder/ghostly_wings.txt delete mode 100644 res/cardsfolder/ghosts_of_the_damned.txt delete mode 100644 res/cardsfolder/ghostway.txt delete mode 100644 res/cardsfolder/ghouls_feast.txt delete mode 100644 res/cardsfolder/giant_badger.txt delete mode 100644 res/cardsfolder/giant_cockroach.txt delete mode 100644 res/cardsfolder/giant_crab.txt delete mode 100644 res/cardsfolder/giant_dustwasp.txt delete mode 100644 res/cardsfolder/giant_growth.txt delete mode 100644 res/cardsfolder/giant_harbinger.txt delete mode 100644 res/cardsfolder/giant_mantis.txt delete mode 100644 res/cardsfolder/giant_octopus.txt delete mode 100644 res/cardsfolder/giant_scorpion.txt delete mode 100644 res/cardsfolder/giant_shark.txt delete mode 100644 res/cardsfolder/giant_solifuge.txt delete mode 100644 res/cardsfolder/giant_spider.txt delete mode 100644 res/cardsfolder/giant_strength.txt delete mode 100644 res/cardsfolder/giant_tortoise.txt delete mode 100644 res/cardsfolder/giant_trap_door_spider.txt delete mode 100644 res/cardsfolder/giant_warthog.txt delete mode 100644 res/cardsfolder/giants_ire.txt delete mode 100644 res/cardsfolder/gibbering_hyenas.txt delete mode 100644 res/cardsfolder/gibbering_kami.txt delete mode 100644 res/cardsfolder/gift_of_estates.txt delete mode 100644 res/cardsfolder/gift_of_granite.txt delete mode 100644 res/cardsfolder/gift_of_the_deity.txt delete mode 100644 res/cardsfolder/gift_of_the_woods.txt delete mode 100644 res/cardsfolder/gigadrowse.txt delete mode 100644 res/cardsfolder/gigantomancer.txt delete mode 100644 res/cardsfolder/gigapede.txt delete mode 100644 res/cardsfolder/gilded_lotus.txt delete mode 100644 res/cardsfolder/gilder_bairn.txt delete mode 100644 res/cardsfolder/gilt_leaf_archdruid.txt delete mode 100644 res/cardsfolder/gilt_leaf_palace.txt delete mode 100644 res/cardsfolder/gilt_leaf_seer.txt delete mode 100644 res/cardsfolder/giltspire_avenger.txt delete mode 100644 res/cardsfolder/gitaxian_probe.txt delete mode 100644 res/cardsfolder/glacial_crevasses.txt delete mode 100644 res/cardsfolder/glacial_fortress.txt delete mode 100644 res/cardsfolder/glacial_wall.txt delete mode 100644 res/cardsfolder/glaciers.txt delete mode 100644 res/cardsfolder/glade_gnarr.txt delete mode 100644 res/cardsfolder/glare_of_subdual.txt delete mode 100644 res/cardsfolder/glarewielder.txt delete mode 100644 res/cardsfolder/glass_golem.txt delete mode 100644 res/cardsfolder/glassdust_hulk.txt delete mode 100644 res/cardsfolder/glasses_of_urza.txt delete mode 100644 res/cardsfolder/glaze_fiend.txt delete mode 100644 res/cardsfolder/gleam_of_resistance.txt delete mode 100644 res/cardsfolder/glen_elendra_archmage.txt delete mode 100644 res/cardsfolder/glen_elendra_liege.txt delete mode 100644 res/cardsfolder/glen_elendra_pranksters.txt delete mode 100644 res/cardsfolder/glimmerdust_nap.txt delete mode 100644 res/cardsfolder/glimmering_angel.txt delete mode 100644 res/cardsfolder/glimmerpoint_stag.txt delete mode 100644 res/cardsfolder/glimmerpost.txt delete mode 100644 res/cardsfolder/glimmervoid.txt delete mode 100644 res/cardsfolder/glimpse_of_nature.txt delete mode 100644 res/cardsfolder/glimpse_the_unthinkable.txt delete mode 100644 res/cardsfolder/glint_eye_nephilim.txt delete mode 100644 res/cardsfolder/glint_hawk_idol.txt delete mode 100644 res/cardsfolder/glintwing_invoker.txt delete mode 100644 res/cardsfolder/glissa_the_traitor.txt delete mode 100644 res/cardsfolder/glissas_courier.txt delete mode 100644 res/cardsfolder/glissas_scorn.txt delete mode 100644 res/cardsfolder/glistener_elf.txt delete mode 100644 res/cardsfolder/glistening_oil.txt delete mode 100644 res/cardsfolder/glitterfang.txt delete mode 100644 res/cardsfolder/global_ruin.txt delete mode 100644 res/cardsfolder/gloom.txt delete mode 100644 res/cardsfolder/gloomdrifter.txt delete mode 100644 res/cardsfolder/gloomhunter.txt delete mode 100644 res/cardsfolder/gloomlance.txt delete mode 100644 res/cardsfolder/gloomwidow.txt delete mode 100644 res/cardsfolder/gloomwidows_feast.txt delete mode 100644 res/cardsfolder/glorious_anthem.txt delete mode 100644 res/cardsfolder/glorious_charge.txt delete mode 100644 res/cardsfolder/glory.txt delete mode 100755 res/cardsfolder/glory_of_warfare.txt delete mode 100644 res/cardsfolder/glory_seeker.txt delete mode 100644 res/cardsfolder/gloryscale_viashino.txt delete mode 100644 res/cardsfolder/glowing_anemone.txt delete mode 100644 res/cardsfolder/glowrider.txt delete mode 100644 res/cardsfolder/gluttonous_slime.txt delete mode 100644 res/cardsfolder/gluttonous_zombie.txt delete mode 100644 res/cardsfolder/glyph_of_destruction.txt delete mode 100644 res/cardsfolder/gnarled_effigy.txt delete mode 100644 res/cardsfolder/gnarled_mass.txt delete mode 100644 res/cardsfolder/gnarlid_pack.txt delete mode 100644 res/cardsfolder/gnat_alley_creeper.txt delete mode 100644 res/cardsfolder/gnat_miser.txt delete mode 100644 res/cardsfolder/gnathosaur.txt delete mode 100644 res/cardsfolder/go_for_the_throat.txt delete mode 100644 res/cardsfolder/goatnapper.txt delete mode 100644 res/cardsfolder/gobhobbler_rats.txt delete mode 100644 res/cardsfolder/goblin_arsonist.txt delete mode 100644 res/cardsfolder/goblin_artillery.txt delete mode 100644 res/cardsfolder/goblin_assault.txt delete mode 100644 res/cardsfolder/goblin_balloon_brigade.txt delete mode 100644 res/cardsfolder/goblin_berserker.txt delete mode 100644 res/cardsfolder/goblin_bombardment.txt delete mode 100644 res/cardsfolder/goblin_brigand.txt delete mode 100644 res/cardsfolder/goblin_bully.txt delete mode 100644 res/cardsfolder/goblin_burrows.txt delete mode 100644 res/cardsfolder/goblin_bushwhacker.txt delete mode 100644 res/cardsfolder/goblin_cavaliers.txt delete mode 100644 res/cardsfolder/goblin_caves.txt delete mode 100644 res/cardsfolder/goblin_charbelcher.txt delete mode 100644 res/cardsfolder/goblin_chariot.txt delete mode 100644 res/cardsfolder/goblin_chieftain.txt delete mode 100644 res/cardsfolder/goblin_chirurgeon.txt delete mode 100644 res/cardsfolder/goblin_clearcutter.txt delete mode 100644 res/cardsfolder/goblin_commando.txt delete mode 100644 res/cardsfolder/goblin_deathraiders.txt delete mode 100644 res/cardsfolder/goblin_digging_team.txt delete mode 100644 res/cardsfolder/goblin_dirigible.txt delete mode 100644 res/cardsfolder/goblin_dynamo.txt delete mode 100644 res/cardsfolder/goblin_elite_infantry.txt delete mode 100644 res/cardsfolder/goblin_firebug.txt delete mode 100644 res/cardsfolder/goblin_firestarter.txt delete mode 100644 res/cardsfolder/goblin_gardener.txt delete mode 100644 res/cardsfolder/goblin_gaveleer.txt delete mode 100644 res/cardsfolder/goblin_general.txt delete mode 100644 res/cardsfolder/goblin_glider.txt delete mode 100644 res/cardsfolder/goblin_goon.txt delete mode 100644 res/cardsfolder/goblin_grenade.txt delete mode 100644 res/cardsfolder/goblin_grenadiers.txt delete mode 100644 res/cardsfolder/goblin_guide.txt delete mode 100644 res/cardsfolder/goblin_hero.txt delete mode 100644 res/cardsfolder/goblin_king.txt delete mode 100644 res/cardsfolder/goblin_lackey.txt delete mode 100644 res/cardsfolder/goblin_legionnaire.txt delete mode 100644 res/cardsfolder/goblin_lookout.txt delete mode 100644 res/cardsfolder/goblin_lore.txt delete mode 100644 res/cardsfolder/goblin_marshal.txt delete mode 100644 res/cardsfolder/goblin_masons.txt delete mode 100644 res/cardsfolder/goblin_matron.txt delete mode 100644 res/cardsfolder/goblin_medics.txt delete mode 100644 res/cardsfolder/goblin_mountaineer.txt delete mode 100644 res/cardsfolder/goblin_mutant.txt delete mode 100644 res/cardsfolder/goblin_offensive.txt delete mode 100644 res/cardsfolder/goblin_outlander.txt delete mode 100644 res/cardsfolder/goblin_patrol.txt delete mode 100644 res/cardsfolder/goblin_piker.txt delete mode 100644 res/cardsfolder/goblin_piledriver.txt delete mode 100644 res/cardsfolder/goblin_pyromancer.txt delete mode 100644 res/cardsfolder/goblin_raider.txt delete mode 100644 res/cardsfolder/goblin_razerunners.txt delete mode 100644 res/cardsfolder/goblin_replica.txt delete mode 100644 res/cardsfolder/goblin_rimerunner.txt delete mode 100644 res/cardsfolder/goblin_ringleader.txt delete mode 100644 res/cardsfolder/goblin_roughrider.txt delete mode 100644 res/cardsfolder/goblin_ruinblaster.txt delete mode 100644 res/cardsfolder/goblin_scouts.txt delete mode 100644 res/cardsfolder/goblin_settler.txt delete mode 100644 res/cardsfolder/goblin_sharpshooter.txt delete mode 100644 res/cardsfolder/goblin_shortcutter.txt delete mode 100644 res/cardsfolder/goblin_shrine.txt delete mode 100644 res/cardsfolder/goblin_ski_patrol.txt delete mode 100644 res/cardsfolder/goblin_sky_raider.txt delete mode 100644 res/cardsfolder/goblin_skycutter.txt delete mode 100644 res/cardsfolder/goblin_sledder.txt delete mode 100644 res/cardsfolder/goblin_soothsayer.txt delete mode 100644 res/cardsfolder/goblin_spelunkers.txt delete mode 100644 res/cardsfolder/goblin_spy.txt delete mode 100644 res/cardsfolder/goblin_striker.txt delete mode 100644 res/cardsfolder/goblin_swine_rider.txt delete mode 100644 res/cardsfolder/goblin_taskmaster.txt delete mode 100644 res/cardsfolder/goblin_tinkerer.txt delete mode 100644 res/cardsfolder/goblin_trenches.txt delete mode 100644 res/cardsfolder/goblin_tunneler.txt delete mode 100644 res/cardsfolder/goblin_turncoat.txt delete mode 100644 res/cardsfolder/goblin_vandal.txt delete mode 100644 res/cardsfolder/goblin_war_buggy.txt delete mode 100644 res/cardsfolder/goblin_war_paint.txt delete mode 100644 res/cardsfolder/goblin_war_strike.txt delete mode 100644 res/cardsfolder/goblin_war_wagon.txt delete mode 100644 res/cardsfolder/goblin_warchief.txt delete mode 100644 res/cardsfolder/goblin_wardriver.txt delete mode 100644 res/cardsfolder/goblin_warrens.txt delete mode 100644 res/cardsfolder/goblin_wizard.txt delete mode 100644 res/cardsfolder/godhead_of_awe.txt delete mode 100644 res/cardsfolder/godless_shrine.txt delete mode 100644 res/cardsfolder/godos_irregulars.txt delete mode 100644 res/cardsfolder/gods_eye_gate_to_the_reikai.txt delete mode 100644 res/cardsfolder/godsire.txt delete mode 100644 res/cardsfolder/godtoucher.txt delete mode 100644 res/cardsfolder/godtracker_of_jund.txt delete mode 100644 res/cardsfolder/gold_myr.txt delete mode 100644 res/cardsfolder/golden_bear.txt delete mode 100644 res/cardsfolder/golden_urn.txt delete mode 100644 res/cardsfolder/goldenglow_moth.txt delete mode 100644 res/cardsfolder/goldmeadow_dodger.txt delete mode 100644 res/cardsfolder/goldmeadow_harrier.txt delete mode 100644 res/cardsfolder/goldmeadow_lookout.txt delete mode 100644 res/cardsfolder/golem_artisan.txt delete mode 100644 res/cardsfolder/golem_foundry.txt delete mode 100644 res/cardsfolder/golems_heart.txt delete mode 100644 res/cardsfolder/golgari_brownscale.txt delete mode 100644 res/cardsfolder/golgari_germination.txt delete mode 100644 res/cardsfolder/golgari_grave_troll.txt delete mode 100644 res/cardsfolder/golgari_guildmage.txt delete mode 100644 res/cardsfolder/golgari_rot_farm.txt delete mode 100644 res/cardsfolder/golgari_rotwurm.txt delete mode 100644 res/cardsfolder/golgari_signet.txt delete mode 100644 res/cardsfolder/golgari_thug.txt delete mode 100644 res/cardsfolder/goliath_beetle.txt delete mode 100644 res/cardsfolder/goliath_sphinx.txt delete mode 100644 res/cardsfolder/goliath_spider.txt delete mode 100644 res/cardsfolder/gore_vassal.txt delete mode 100644 res/cardsfolder/goretusk_firebeast.txt delete mode 100644 res/cardsfolder/gorger_wurm.txt delete mode 100644 res/cardsfolder/gorgon_flail.txt delete mode 100644 res/cardsfolder/gorgon_recluse.txt delete mode 100644 res/cardsfolder/gorilla_chieftain.txt delete mode 100644 res/cardsfolder/gorilla_pack.txt delete mode 100644 res/cardsfolder/gorilla_shaman.txt delete mode 100644 res/cardsfolder/gorilla_warrior.txt delete mode 100644 res/cardsfolder/gossamer_chains.txt delete mode 100644 res/cardsfolder/gossamer_phantasm.txt delete mode 100644 res/cardsfolder/gosta_dirk.txt delete mode 100644 res/cardsfolder/graceful_adept.txt delete mode 100644 res/cardsfolder/grafted_exoskeleton.txt delete mode 100644 res/cardsfolder/grafted_skullcap.txt delete mode 100644 res/cardsfolder/grafted_wargear.txt delete mode 100644 res/cardsfolder/grand_arbiter_augustin_iv.txt delete mode 100644 res/cardsfolder/grand_coliseum.txt delete mode 100644 res/cardsfolder/grandmother_sengir.txt delete mode 100644 res/cardsfolder/granger_guildmage.txt delete mode 100644 res/cardsfolder/granite_gargoyle.txt delete mode 100644 res/cardsfolder/granite_grip.txt delete mode 100644 res/cardsfolder/granite_shard.txt delete mode 100644 res/cardsfolder/granulate.txt delete mode 100644 res/cardsfolder/grapeshot.txt delete mode 100644 res/cardsfolder/grapeshot_catapult.txt delete mode 100644 res/cardsfolder/grappler_spider.txt delete mode 100644 res/cardsfolder/grasp_of_darkness.txt delete mode 100644 res/cardsfolder/grassland_crusader.txt delete mode 100644 res/cardsfolder/grasslands.txt delete mode 100644 res/cardsfolder/gratuitous_violence.txt delete mode 100644 res/cardsfolder/grave_defiler.txt delete mode 100644 res/cardsfolder/grave_pact.txt delete mode 100644 res/cardsfolder/grave_robbers.txt delete mode 100644 res/cardsfolder/grave_shell_scarab.txt delete mode 100644 res/cardsfolder/grave_titan.txt delete mode 100644 res/cardsfolder/gravebind.txt delete mode 100644 res/cardsfolder/graveborn_muse.txt delete mode 100644 res/cardsfolder/gravedigger.txt delete mode 100644 res/cardsfolder/gravel_slinger.txt delete mode 100644 res/cardsfolder/gravelgill_axeshark.txt delete mode 100644 res/cardsfolder/gravelgill_duo.txt delete mode 100644 res/cardsfolder/graven_cairns.txt delete mode 100644 res/cardsfolder/gravespawn_sovereign.txt delete mode 100644 res/cardsfolder/gravitational_shift.txt delete mode 100644 res/cardsfolder/gray_ogre.txt delete mode 100644 res/cardsfolder/graypelt_hunter.txt delete mode 100644 res/cardsfolder/graypelt_refuge.txt delete mode 100644 res/cardsfolder/grayscaled_gharial.txt delete mode 100644 res/cardsfolder/grazing_gladehart.txt delete mode 100644 res/cardsfolder/grazing_kelpie.txt delete mode 100644 res/cardsfolder/great_defender.txt delete mode 100644 res/cardsfolder/great_furnace.txt delete mode 100644 res/cardsfolder/great_sable_stag.txt delete mode 100644 res/cardsfolder/great_wall.txt delete mode 100644 res/cardsfolder/great_whale.txt delete mode 100644 res/cardsfolder/greatbow_doyen.txt delete mode 100644 res/cardsfolder/greater_auramancy.txt delete mode 100644 res/cardsfolder/greater_basilisk.txt delete mode 100644 res/cardsfolder/greater_forgeling.txt delete mode 100644 res/cardsfolder/greater_good.txt delete mode 100644 res/cardsfolder/greater_mossdog.txt delete mode 100644 res/cardsfolder/greed.txt delete mode 100644 res/cardsfolder/greel_mind_raker.txt delete mode 100644 res/cardsfolder/greels_caress.txt delete mode 100644 res/cardsfolder/green_mana_battery.txt delete mode 100644 res/cardsfolder/green_scarab.txt delete mode 100644 res/cardsfolder/green_suns_zenith.txt delete mode 100644 res/cardsfolder/green_ward.txt delete mode 100644 res/cardsfolder/greener_pastures.txt delete mode 100644 res/cardsfolder/greenhilt_trainee.txt delete mode 100644 res/cardsfolder/greenseeker.txt delete mode 100644 res/cardsfolder/greenweaver_druid.txt delete mode 100644 res/cardsfolder/gremlin_mine.txt delete mode 100644 res/cardsfolder/griffin_canyon.txt delete mode 100644 res/cardsfolder/griffin_guide.txt delete mode 100644 res/cardsfolder/griffin_sentinel.txt delete mode 100644 res/cardsfolder/grim_affliction.txt delete mode 100644 res/cardsfolder/grim_feast.txt delete mode 100644 res/cardsfolder/grim_harvest.txt delete mode 100644 res/cardsfolder/grim_lavamancer.txt delete mode 100644 res/cardsfolder/grim_monolith.txt delete mode 100644 res/cardsfolder/grim_poppet.txt delete mode 100644 res/cardsfolder/grim_tutor.txt delete mode 100644 res/cardsfolder/grimclaw_bats.txt delete mode 100644 res/cardsfolder/grindclock.txt delete mode 100644 res/cardsfolder/grinding_station.txt delete mode 100644 res/cardsfolder/grindstone.txt delete mode 100644 res/cardsfolder/grinning_demon.txt delete mode 100644 res/cardsfolder/grinning_ignus.txt delete mode 100644 res/cardsfolder/gristle_grinner.txt delete mode 100644 res/cardsfolder/gristleback.txt delete mode 100644 res/cardsfolder/grixis_battlemage.txt delete mode 100644 res/cardsfolder/grixis_charm.txt delete mode 100644 res/cardsfolder/grixis_grimblade.txt delete mode 100644 res/cardsfolder/grixis_panorama.txt delete mode 100644 res/cardsfolder/grixis_slavedriver.txt delete mode 100644 res/cardsfolder/grixis_sojourners.txt delete mode 100644 res/cardsfolder/grizzled_leotau.txt delete mode 100644 res/cardsfolder/grizzled_wolverine.txt delete mode 100644 res/cardsfolder/grizzly_bears.txt delete mode 100644 res/cardsfolder/grizzly_fate.txt delete mode 100644 res/cardsfolder/groffskithur.txt delete mode 100644 res/cardsfolder/grollub.txt delete mode 100644 res/cardsfolder/grotag_siege_runner.txt delete mode 100644 res/cardsfolder/grotag_thrasher.txt delete mode 100644 res/cardsfolder/grotesque_hybrid.txt delete mode 100644 res/cardsfolder/ground_rift.txt delete mode 100644 res/cardsfolder/groundbreaker.txt delete mode 100644 res/cardsfolder/groundling_pouncer.txt delete mode 100644 res/cardsfolder/groundskeeper.txt delete mode 100644 res/cardsfolder/grove_of_the_burnwillows.txt delete mode 100644 res/cardsfolder/growth_spasm.txt delete mode 100644 res/cardsfolder/gruesome_encore.txt delete mode 100644 res/cardsfolder/gruul_guildmage.txt delete mode 100644 res/cardsfolder/gruul_signet.txt delete mode 100644 res/cardsfolder/gruul_turf.txt delete mode 100644 res/cardsfolder/gruul_war_plow.txt delete mode 100644 res/cardsfolder/guan_yu_sainted_warrior.txt delete mode 100644 res/cardsfolder/guan_yus_1000_li_march.txt delete mode 100644 res/cardsfolder/guard_duty.txt delete mode 100644 res/cardsfolder/guard_gomazoa.txt delete mode 100644 res/cardsfolder/guardian_idol.txt delete mode 100644 res/cardsfolder/guardian_of_cloverdell.txt delete mode 100644 res/cardsfolder/guardian_of_solitude.txt delete mode 100644 res/cardsfolder/guardian_of_the_guildpact.txt delete mode 100644 res/cardsfolder/guardian_seraph.txt delete mode 100644 res/cardsfolder/guardian_zendikon.txt delete mode 100644 res/cardsfolder/guardians_magemark.txt delete mode 100644 res/cardsfolder/guardians_of_akrasa.txt delete mode 100644 res/cardsfolder/guerrilla_tactics.txt delete mode 100644 res/cardsfolder/guided_strike.txt delete mode 100644 res/cardsfolder/guiltfeeder.txt delete mode 100644 res/cardsfolder/guilty_conscience.txt delete mode 100644 res/cardsfolder/guma.txt delete mode 100644 res/cardsfolder/gush.txt delete mode 100644 res/cardsfolder/gust_skimmer.txt delete mode 100644 res/cardsfolder/gustrider_exuberant.txt delete mode 100644 res/cardsfolder/gut_shot.txt delete mode 100644 res/cardsfolder/gutless_ghoul.txt delete mode 100644 res/cardsfolder/guttural_response.txt delete mode 100644 res/cardsfolder/gutwrencher_oni.txt delete mode 100644 res/cardsfolder/guul_draz_assassin.txt delete mode 100644 res/cardsfolder/guul_draz_specter.txt delete mode 100644 res/cardsfolder/guul_draz_vampire.txt delete mode 100644 res/cardsfolder/gwafa_hazid_profiteer.txt delete mode 100644 res/cardsfolder/gwendlyn_di_corci.txt delete mode 100644 res/cardsfolder/gwyllion_hedge_mage.txt delete mode 100644 res/cardsfolder/haazda_exonerator.txt delete mode 100644 res/cardsfolder/hada_freeblade.txt delete mode 100644 res/cardsfolder/hada_spy_patrol.txt delete mode 100644 res/cardsfolder/hag_hedge_mage.txt delete mode 100644 res/cardsfolder/hagra_crocodile.txt delete mode 100644 res/cardsfolder/hagra_diabolist.txt delete mode 100644 res/cardsfolder/hail_storm.txt delete mode 100644 res/cardsfolder/hair_strung_koto.txt delete mode 100644 res/cardsfolder/halberdier.txt delete mode 100644 res/cardsfolder/halcyon_glaze.txt delete mode 100644 res/cardsfolder/halimar_depths.txt delete mode 100644 res/cardsfolder/halimar_excavator.txt delete mode 100644 res/cardsfolder/halimar_wavewatch.txt delete mode 100644 res/cardsfolder/hallowed_burial.txt delete mode 100644 res/cardsfolder/hallowed_fountain.txt delete mode 100644 res/cardsfolder/hallowed_ground.txt delete mode 100644 res/cardsfolder/halo_hunter.txt delete mode 100644 res/cardsfolder/halt_order.txt delete mode 100644 res/cardsfolder/hamletback_goliath.txt delete mode 100644 res/cardsfolder/hammer_mage.txt delete mode 100644 res/cardsfolder/hammer_of_bogardan.txt delete mode 100644 res/cardsfolder/hammer_of_ruin.txt delete mode 100644 res/cardsfolder/hammerfist_giant.txt delete mode 100644 res/cardsfolder/hammerhead_shark.txt delete mode 100644 res/cardsfolder/hammerheim_deadeye.txt delete mode 100644 res/cardsfolder/hana_kami.txt delete mode 100644 res/cardsfolder/hand_of_cruelty.txt delete mode 100644 res/cardsfolder/hand_of_death.txt delete mode 100644 res/cardsfolder/hand_of_emrakul.txt delete mode 100644 res/cardsfolder/hand_of_honor.txt delete mode 100644 res/cardsfolder/hand_of_justice.txt delete mode 100644 res/cardsfolder/hand_of_the_praetors.txt delete mode 100644 res/cardsfolder/hanna_ships_navigator.txt delete mode 100644 res/cardsfolder/hannas_custody.txt delete mode 100644 res/cardsfolder/hapless_researcher.txt delete mode 100644 res/cardsfolder/harabaz_druid.txt delete mode 100644 res/cardsfolder/harbinger_of_night.txt delete mode 100644 res/cardsfolder/harbinger_of_spring.txt delete mode 100644 res/cardsfolder/harbor_guardian.txt delete mode 100644 res/cardsfolder/harbor_serpent.txt delete mode 100644 res/cardsfolder/harmattan_efreet.txt delete mode 100644 res/cardsfolder/harmonic_convergence.txt delete mode 100644 res/cardsfolder/harmonize.txt delete mode 100644 res/cardsfolder/harpoon_sniper.txt delete mode 100644 res/cardsfolder/harrier_griffin.txt delete mode 100644 res/cardsfolder/harrow.txt delete mode 100644 res/cardsfolder/haru_onna.txt delete mode 100644 res/cardsfolder/harvest_gwyllion.txt delete mode 100644 res/cardsfolder/harvester_druid.txt delete mode 100644 res/cardsfolder/hasran_ogress.txt delete mode 100644 res/cardsfolder/hatchet_bully.txt delete mode 100644 res/cardsfolder/hatching_plans.txt delete mode 100644 res/cardsfolder/hate_weaver.txt delete mode 100644 res/cardsfolder/hateflayer.txt delete mode 100644 res/cardsfolder/haunted_angel.txt delete mode 100644 res/cardsfolder/haunted_cadaver.txt delete mode 100644 res/cardsfolder/haunted_crossroads.txt delete mode 100644 res/cardsfolder/haunting_apparition.txt delete mode 100644 res/cardsfolder/haunting_echoes.txt delete mode 100644 res/cardsfolder/haunting_hymn.txt delete mode 100644 res/cardsfolder/haunting_misery.txt delete mode 100644 res/cardsfolder/haunting_wind.txt delete mode 100644 res/cardsfolder/havenwood_battleground.txt delete mode 100644 res/cardsfolder/havenwood_wurm.txt delete mode 100644 res/cardsfolder/havoc.txt delete mode 100644 res/cardsfolder/havoc_demon.txt delete mode 100644 res/cardsfolder/hawkeater_moth.txt delete mode 100644 res/cardsfolder/haze_of_rage.txt delete mode 100644 res/cardsfolder/hazerider_drake.txt delete mode 100644 res/cardsfolder/hazy_homunculus.txt delete mode 100644 res/cardsfolder/he_who_hungers.txt delete mode 100644 res/cardsfolder/headhunter.txt delete mode 100644 res/cardsfolder/headless_horseman.txt delete mode 100644 res/cardsfolder/headlong_rush.txt delete mode 100644 res/cardsfolder/headstone.txt delete mode 100644 res/cardsfolder/heal.txt delete mode 100644 res/cardsfolder/healing_leaves.txt delete mode 100644 res/cardsfolder/healing_salve.txt delete mode 100644 res/cardsfolder/heap_doll.txt delete mode 100644 res/cardsfolder/heart_of_light.txt delete mode 100644 res/cardsfolder/heart_of_ramos.txt delete mode 100644 res/cardsfolder/heart_of_yavimaya.txt delete mode 100644 res/cardsfolder/heart_sliver.txt delete mode 100644 res/cardsfolder/heart_warden.txt delete mode 100644 res/cardsfolder/hearth_charm.txt delete mode 100644 res/cardsfolder/hearthcage_giant.txt delete mode 100644 res/cardsfolder/hearthfire_hobgoblin.txt delete mode 100644 res/cardsfolder/heartlash_cinder.txt delete mode 100644 res/cardsfolder/heartless_hidetsugu.txt delete mode 100644 res/cardsfolder/heartmender.txt delete mode 100644 res/cardsfolder/heartstabber_mosquito.txt delete mode 100644 res/cardsfolder/heartstone.txt delete mode 100644 res/cardsfolder/heartwood_dryad.txt delete mode 100644 res/cardsfolder/heartwood_shard.txt delete mode 100644 res/cardsfolder/heartwood_treefolk.txt delete mode 100644 res/cardsfolder/heat_of_battle.txt delete mode 100644 res/cardsfolder/heat_ray.txt delete mode 100644 res/cardsfolder/heat_shimmer.txt delete mode 100644 res/cardsfolder/heavens_gate.txt delete mode 100644 res/cardsfolder/heavy_arbalest.txt delete mode 100644 res/cardsfolder/heavy_ballista.txt delete mode 100644 res/cardsfolder/hedge_troll.txt delete mode 100644 res/cardsfolder/hedron_crab.txt delete mode 100644 res/cardsfolder/hedron_matrix.txt delete mode 100644 res/cardsfolder/hedron_rover.txt delete mode 100644 res/cardsfolder/hedron_scrabbler.txt delete mode 100644 res/cardsfolder/heedless_one.txt delete mode 100644 res/cardsfolder/heidar_rimewind_master.txt delete mode 100644 res/cardsfolder/heightened_awareness.txt delete mode 100644 res/cardsfolder/helionaut.txt delete mode 100644 res/cardsfolder/heliophial.txt delete mode 100644 res/cardsfolder/helix_pinnacle.txt delete mode 100644 res/cardsfolder/hell_bent_raider.txt delete mode 100644 res/cardsfolder/hell_swarm.txt delete mode 100644 res/cardsfolder/helldozer.txt delete mode 100644 res/cardsfolder/hellfire.txt delete mode 100644 res/cardsfolder/hellfire_mongrel.txt delete mode 100644 res/cardsfolder/hellhole_rats.txt delete mode 100644 res/cardsfolder/hellion_eruption.txt delete mode 100644 res/cardsfolder/hellkite_igniter.txt delete mode 100644 res/cardsfolder/hellkite_overlord.txt delete mode 100644 res/cardsfolder/hells_caretaker.txt delete mode 100644 res/cardsfolder/hells_thunder.txt delete mode 100644 res/cardsfolder/hellspark_elemental.txt delete mode 100644 res/cardsfolder/helm_of_awakening.txt delete mode 100644 res/cardsfolder/helm_of_possession.txt delete mode 100644 res/cardsfolder/helm_of_the_ghastlord.txt delete mode 100644 res/cardsfolder/hematite_golem.txt delete mode 100644 res/cardsfolder/hematite_talisman.txt delete mode 100644 res/cardsfolder/henchfiend_of_ukor.txt delete mode 100644 res/cardsfolder/henge_guardian.txt delete mode 100644 res/cardsfolder/henge_of_ramos.txt delete mode 100644 res/cardsfolder/herald_of_serra.txt delete mode 100644 res/cardsfolder/herbal_poultice.txt delete mode 100644 res/cardsfolder/herd_gnarr.txt delete mode 100644 res/cardsfolder/heritage_druid.txt delete mode 100644 res/cardsfolder/hermetic_study.txt delete mode 100644 res/cardsfolder/hermit_druid.txt delete mode 100644 res/cardsfolder/hero_of_bladehold.txt delete mode 100644 res/cardsfolder/hero_of_oxid_ridge.txt delete mode 100644 res/cardsfolder/heroes_remembered.txt delete mode 100644 res/cardsfolder/heroes_reunion.txt delete mode 100644 res/cardsfolder/heros_demise.txt delete mode 100644 res/cardsfolder/heros_resolve.txt delete mode 100644 res/cardsfolder/hex.txt delete mode 100644 res/cardsfolder/hexplate_golem.txt delete mode 100644 res/cardsfolder/hibernation.txt delete mode 100644 res/cardsfolder/hibernation_sliver.txt delete mode 100644 res/cardsfolder/hickory_woodlot.txt delete mode 100644 res/cardsfolder/hidden_ancients.txt delete mode 100644 res/cardsfolder/hidden_gibbons.txt delete mode 100644 res/cardsfolder/hidden_guerrillas.txt delete mode 100644 res/cardsfolder/hidden_herd.txt delete mode 100644 res/cardsfolder/hidden_path.txt delete mode 100644 res/cardsfolder/hidden_spider.txt delete mode 100644 res/cardsfolder/hideous_end.txt delete mode 100644 res/cardsfolder/hidetsugus_second_rite.txt delete mode 100644 res/cardsfolder/high_market.txt delete mode 100644 res/cardsfolder/high_seas.txt delete mode 100644 res/cardsfolder/high_tide.txt delete mode 100644 res/cardsfolder/highland_berserker.txt delete mode 100644 res/cardsfolder/highland_giant.txt delete mode 100644 res/cardsfolder/highland_weald.txt delete mode 100644 res/cardsfolder/highway_robber.txt delete mode 100644 res/cardsfolder/higure_the_still_wind.txt delete mode 100644 res/cardsfolder/hill_giant.txt delete mode 100644 res/cardsfolder/hillcomber_giant.txt delete mode 100644 res/cardsfolder/hindering_light.txt delete mode 100644 res/cardsfolder/hindering_touch.txt delete mode 100644 res/cardsfolder/hired_giant.txt delete mode 100644 res/cardsfolder/hisokas_defiance.txt delete mode 100644 res/cardsfolder/hissing_iguanar.txt delete mode 100644 res/cardsfolder/hissing_miasma.txt delete mode 100644 res/cardsfolder/hivestone.txt delete mode 100644 res/cardsfolder/hivis_of_the_scale.txt delete mode 100644 res/cardsfolder/hoar_shade.txt delete mode 100644 res/cardsfolder/hoard_smelter_dragon.txt delete mode 100644 res/cardsfolder/hoarders_greed.txt delete mode 100644 res/cardsfolder/hobble.txt delete mode 100644 res/cardsfolder/hobgoblin_dragoon.txt delete mode 100644 res/cardsfolder/hokori_dust_drinker.txt delete mode 100644 res/cardsfolder/hold_the_line.txt delete mode 100644 res/cardsfolder/hollow_dogs.txt delete mode 100644 res/cardsfolder/hollow_trees.txt delete mode 100644 res/cardsfolder/hollowborn_barghest.txt delete mode 100644 res/cardsfolder/hollowsage.txt delete mode 100644 res/cardsfolder/holy_armor.txt delete mode 100644 res/cardsfolder/holy_day.txt delete mode 100644 res/cardsfolder/holy_light.txt delete mode 100644 res/cardsfolder/holy_strength.txt delete mode 100644 res/cardsfolder/homarid.txt delete mode 100644 res/cardsfolder/homarid_shaman.txt delete mode 100644 res/cardsfolder/homarid_spawning_bed.txt delete mode 100644 res/cardsfolder/homarid_warrior.txt delete mode 100644 res/cardsfolder/honden_of_cleansing_fire.txt delete mode 100644 res/cardsfolder/honden_of_infinite_rage.txt delete mode 100644 res/cardsfolder/honden_of_lifes_web.txt delete mode 100644 res/cardsfolder/honden_of_nights_reach.txt delete mode 100644 res/cardsfolder/honden_of_seeing_winds.txt delete mode 100644 res/cardsfolder/honor_guard.txt delete mode 100644 res/cardsfolder/honor_of_the_pure.txt delete mode 100644 res/cardsfolder/honor_worn_shaku.txt delete mode 100644 res/cardsfolder/hooded_kavu.txt delete mode 100644 res/cardsfolder/hoodwink.txt delete mode 100644 res/cardsfolder/hoof_skulkin.txt delete mode 100644 res/cardsfolder/hoofprints_of_the_stag.txt delete mode 100644 res/cardsfolder/hope_and_glory.txt delete mode 100644 res/cardsfolder/hope_charm.txt delete mode 100644 res/cardsfolder/hopping_automaton.txt delete mode 100644 res/cardsfolder/horde_of_notions.txt delete mode 100644 res/cardsfolder/horizon_canopy.txt delete mode 100644 res/cardsfolder/horizon_drake.txt delete mode 100644 res/cardsfolder/horizon_spellbomb.txt delete mode 100644 res/cardsfolder/horn_of_deafening.txt delete mode 100644 res/cardsfolder/horn_of_greed.txt delete mode 100644 res/cardsfolder/horn_of_ramos.txt delete mode 100644 res/cardsfolder/horned_cheetah.txt delete mode 100644 res/cardsfolder/horned_kavu.txt delete mode 100644 res/cardsfolder/horned_sliver.txt delete mode 100644 res/cardsfolder/horned_troll.txt delete mode 100644 res/cardsfolder/horned_turtle.txt delete mode 100644 res/cardsfolder/hornet_cannon.txt delete mode 100644 res/cardsfolder/hornet_cobra.txt delete mode 100644 res/cardsfolder/hornet_harasser.txt delete mode 100644 res/cardsfolder/hornet_sting.txt delete mode 100644 res/cardsfolder/horobi_deaths_wail.txt delete mode 100644 res/cardsfolder/horrible_hordes.txt delete mode 100644 res/cardsfolder/horrifying_revelation.txt delete mode 100644 res/cardsfolder/horror_of_horrors.txt delete mode 100644 res/cardsfolder/horseshoe_crab.txt delete mode 100644 res/cardsfolder/hostile_realm.txt delete mode 100644 res/cardsfolder/hoverguard_observer.txt delete mode 100644 res/cardsfolder/hoverguard_sweepers.txt delete mode 100644 res/cardsfolder/hovermyr.txt delete mode 100644 res/cardsfolder/howl_from_beyond.txt delete mode 100644 res/cardsfolder/howl_of_the_night_pack.txt delete mode 100644 res/cardsfolder/howling_banshee.txt delete mode 100644 res/cardsfolder/howling_fury.txt delete mode 100644 res/cardsfolder/howling_gale.txt delete mode 100644 res/cardsfolder/howling_mine.txt delete mode 100644 res/cardsfolder/howling_wolf.txt delete mode 100644 res/cardsfolder/hua_tuo_honored_physician.txt delete mode 100644 res/cardsfolder/huang_zhong_shu_general.txt delete mode 100644 res/cardsfolder/hulking_cyclops.txt delete mode 100644 res/cardsfolder/hulking_goblin.txt delete mode 100644 res/cardsfolder/hulking_ogre.txt delete mode 100644 res/cardsfolder/hull_breach.txt delete mode 100644 res/cardsfolder/hum_of_the_radix.txt delete mode 100644 res/cardsfolder/humble_budoka.txt delete mode 100644 res/cardsfolder/hunding_gjornersen.txt delete mode 100644 res/cardsfolder/hundroog.txt delete mode 100644 res/cardsfolder/hunger_of_the_nim.txt delete mode 100644 res/cardsfolder/hungry_mist.txt delete mode 100644 res/cardsfolder/hungry_spriggan.txt delete mode 100644 res/cardsfolder/hunted_dragon.txt delete mode 100644 res/cardsfolder/hunted_horror.txt delete mode 100644 res/cardsfolder/hunted_lammasu.txt delete mode 100644 res/cardsfolder/hunted_phantasm.txt delete mode 100644 res/cardsfolder/hunted_troll.txt delete mode 100644 res/cardsfolder/hunted_wumpus.txt delete mode 100644 res/cardsfolder/hunting_cheetah.txt delete mode 100644 res/cardsfolder/hunting_drake.txt delete mode 100644 res/cardsfolder/hunting_grounds.txt delete mode 100644 res/cardsfolder/hunting_moa.txt delete mode 100644 res/cardsfolder/hunting_pack.txt delete mode 100644 res/cardsfolder/hunting_triad.txt delete mode 100644 res/cardsfolder/hurkyls_recall.txt delete mode 100644 res/cardsfolder/hurloon_minotaur.txt delete mode 100644 res/cardsfolder/hurloon_shaman.txt delete mode 100644 res/cardsfolder/hurly_burly.txt delete mode 100644 res/cardsfolder/hurr_jackal.txt delete mode 100644 res/cardsfolder/hurricane.txt delete mode 100644 res/cardsfolder/hush.txt delete mode 100644 res/cardsfolder/hyalopterous_lemure.txt delete mode 100644 res/cardsfolder/hydromorph_guardian.txt delete mode 100644 res/cardsfolder/hydromorph_gull.txt delete mode 100644 res/cardsfolder/hyena_umbra.txt delete mode 100644 res/cardsfolder/hymn_of_rebirth.txt delete mode 100644 res/cardsfolder/hymn_to_tourach.txt delete mode 100644 res/cardsfolder/hyperion_blacksmith.txt delete mode 100644 res/cardsfolder/hypervolt_grasp.txt delete mode 100644 res/cardsfolder/hypnotic_specter.txt delete mode 100644 res/cardsfolder/hypochondria.txt delete mode 100644 res/cardsfolder/hystrodon.txt delete mode 100644 res/cardsfolder/icatian_crier.txt delete mode 100644 res/cardsfolder/icatian_javelineers.txt delete mode 100644 res/cardsfolder/icatian_lieutenant.txt delete mode 100644 res/cardsfolder/icatian_moneychanger.txt delete mode 100644 res/cardsfolder/icatian_priest.txt delete mode 100644 res/cardsfolder/icatian_scout.txt delete mode 100644 res/cardsfolder/icatian_store.txt delete mode 100644 res/cardsfolder/icatian_town.txt delete mode 100644 res/cardsfolder/ice_cage.txt delete mode 100644 res/cardsfolder/ice_storm.txt delete mode 100644 res/cardsfolder/iceberg.txt delete mode 100644 res/cardsfolder/icefall.txt delete mode 100644 res/cardsfolder/icequake.txt delete mode 100644 res/cardsfolder/ichneumon_druid.txt delete mode 100644 res/cardsfolder/ichor_explosion.txt delete mode 100644 res/cardsfolder/ichor_rats.txt delete mode 100644 res/cardsfolder/ichor_slick.txt delete mode 100644 res/cardsfolder/ichor_wellspring.txt delete mode 100644 res/cardsfolder/ichorclaw_myr.txt delete mode 100644 res/cardsfolder/ichorid.txt delete mode 100644 res/cardsfolder/icy_manipulator.txt delete mode 100644 res/cardsfolder/identity_crisis.txt delete mode 100644 res/cardsfolder/idle_thoughts.txt delete mode 100644 res/cardsfolder/idyllic_tutor.txt delete mode 100644 res/cardsfolder/ifh_biff_efreet.txt delete mode 100644 res/cardsfolder/igneous_golem.txt delete mode 100644 res/cardsfolder/igneous_pouncer.txt delete mode 100644 res/cardsfolder/ignite_disorder.txt delete mode 100644 res/cardsfolder/ignite_memories.txt delete mode 100644 res/cardsfolder/ihsans_shade.txt delete mode 100644 res/cardsfolder/iizuka_the_ruthless.txt delete mode 100644 res/cardsfolder/ikiral_outrider.txt delete mode 100644 res/cardsfolder/ill_gotten_gains.txt delete mode 100644 res/cardsfolder/illuminated_wings.txt delete mode 100644 res/cardsfolder/illumination.txt delete mode 100644 res/cardsfolder/illusionary_forces.txt delete mode 100644 res/cardsfolder/illusionary_servant.txt delete mode 100644 res/cardsfolder/illusionary_wall.txt delete mode 100644 res/cardsfolder/illusions_of_grandeur.txt delete mode 100644 res/cardsfolder/illusory_demon.txt delete mode 100644 res/cardsfolder/imaginary_pet.txt delete mode 100644 res/cardsfolder/imi_statue.txt delete mode 100644 res/cardsfolder/immaculate_magistrate.txt delete mode 100644 res/cardsfolder/immobilizing_ink.txt delete mode 100644 res/cardsfolder/immolating_souleater.txt delete mode 100644 res/cardsfolder/immolation.txt delete mode 100644 res/cardsfolder/impaler_shrike.txt delete mode 100644 res/cardsfolder/impending_disaster.txt delete mode 100644 res/cardsfolder/imperial_edict.txt delete mode 100644 res/cardsfolder/imperial_hellkite.txt delete mode 100644 res/cardsfolder/imperial_recruiter.txt delete mode 100644 res/cardsfolder/imperial_seal.txt delete mode 100644 res/cardsfolder/imperiosaur.txt delete mode 100644 res/cardsfolder/imperious_perfect.txt delete mode 100644 res/cardsfolder/implements_of_sacrifice.txt delete mode 100644 res/cardsfolder/implode.txt delete mode 100644 res/cardsfolder/improvised_armor.txt delete mode 100644 res/cardsfolder/impulse.txt delete mode 100644 res/cardsfolder/in_the_web_of_war.txt delete mode 100644 res/cardsfolder/incendiary.txt delete mode 100644 res/cardsfolder/incendiary_command.txt delete mode 100644 res/cardsfolder/incinerate.txt delete mode 100644 res/cardsfolder/incurable_ogre.txt delete mode 100644 res/cardsfolder/indebted_samurai.txt delete mode 100644 res/cardsfolder/independent_troops.txt delete mode 100644 res/cardsfolder/indestructible_aura.txt delete mode 100644 res/cardsfolder/index.txt delete mode 100644 res/cardsfolder/indigo_faerie.txt delete mode 100644 res/cardsfolder/indomitable_ancients.txt delete mode 100644 res/cardsfolder/indomitable_archangel.txt delete mode 100644 res/cardsfolder/indomitable_will.txt delete mode 100644 res/cardsfolder/indrik_stomphowler.txt delete mode 100644 res/cardsfolder/inexorable_tide.txt delete mode 100644 res/cardsfolder/infantry_veteran.txt delete mode 100644 res/cardsfolder/infected_vermin.txt delete mode 100644 res/cardsfolder/infectious_horror.txt delete mode 100644 res/cardsfolder/infectious_host.txt delete mode 100644 res/cardsfolder/infernal_caretaker.txt delete mode 100644 res/cardsfolder/infernal_contract.txt delete mode 100644 res/cardsfolder/infernal_kirin.txt delete mode 100644 res/cardsfolder/infernal_medusa.txt delete mode 100644 res/cardsfolder/infernal_tribute.txt delete mode 100644 res/cardsfolder/inferno.txt delete mode 100644 res/cardsfolder/inferno_titan.txt delete mode 100644 res/cardsfolder/infest.txt delete mode 100644 res/cardsfolder/infested_roothold.txt delete mode 100644 res/cardsfolder/infiltrate.txt delete mode 100644 res/cardsfolder/infiltration_lens.txt delete mode 100644 res/cardsfolder/infiltrator_il_kor.txt delete mode 100644 res/cardsfolder/inflame.txt delete mode 100644 res/cardsfolder/information_dealer.txt delete mode 100644 res/cardsfolder/infuse.txt delete mode 100644 res/cardsfolder/ingenious_thief.txt delete mode 100644 res/cardsfolder/ingot_chewer.txt delete mode 100644 res/cardsfolder/inheritance.txt delete mode 100644 res/cardsfolder/initiates_of_the_ebon_hand.txt delete mode 100644 res/cardsfolder/ink_dissolver.txt delete mode 100644 res/cardsfolder/ink_eyes_servant_of_oni.txt delete mode 100644 res/cardsfolder/inkfathom_divers.txt delete mode 100644 res/cardsfolder/inkfathom_infiltrator.txt delete mode 100644 res/cardsfolder/inkmoth_nexus.txt delete mode 100644 res/cardsfolder/inkwell_leviathan.txt delete mode 100644 res/cardsfolder/inner_calm_outer_strength.txt delete mode 100644 res/cardsfolder/inner_chamber_guard.txt delete mode 100644 res/cardsfolder/inner_fire.txt delete mode 100644 res/cardsfolder/inner_flame_acolyte.txt delete mode 100644 res/cardsfolder/innocence_kami.txt delete mode 100644 res/cardsfolder/innocent_blood.txt delete mode 100644 res/cardsfolder/inquisition_of_kozilek.txt delete mode 100644 res/cardsfolder/insatiable_souleater.txt delete mode 100644 res/cardsfolder/inside_out.txt delete mode 100644 res/cardsfolder/insidious_bookworms.txt delete mode 100644 res/cardsfolder/insight.txt delete mode 100644 res/cardsfolder/insolence.txt delete mode 100644 res/cardsfolder/inspiration.txt delete mode 100644 res/cardsfolder/inspired_charge.txt delete mode 100644 res/cardsfolder/inspired_sprite.txt delete mode 100644 res/cardsfolder/inspirit.txt delete mode 100644 res/cardsfolder/instill_energy.txt delete mode 100644 res/cardsfolder/instill_furor.txt delete mode 100644 res/cardsfolder/instill_infection.txt delete mode 100644 res/cardsfolder/insurrection.txt delete mode 100644 res/cardsfolder/intervene.txt delete mode 100644 res/cardsfolder/intimidation.txt delete mode 100644 res/cardsfolder/intimidator_initiate.txt delete mode 100644 res/cardsfolder/into_the_core.txt delete mode 100644 res/cardsfolder/into_the_north.txt delete mode 100644 res/cardsfolder/into_the_roil.txt delete mode 100644 res/cardsfolder/into_thin_air.txt delete mode 100644 res/cardsfolder/intrepid_hero.txt delete mode 100644 res/cardsfolder/intruder_alarm.txt delete mode 100644 res/cardsfolder/intuition.txt delete mode 100644 res/cardsfolder/inundate.txt delete mode 100644 res/cardsfolder/invigorating_boon.txt delete mode 100644 res/cardsfolder/invigorating_falls.txt delete mode 100644 res/cardsfolder/invincible_hymn.txt delete mode 100644 res/cardsfolder/inviolability.txt delete mode 100644 res/cardsfolder/invisibility.txt delete mode 100644 res/cardsfolder/invoke_the_firemind.txt delete mode 100644 res/cardsfolder/iona_shield_of_emeria.txt delete mode 100644 res/cardsfolder/ionas_judgment.txt delete mode 100644 res/cardsfolder/ior_ruin_expedition.txt delete mode 100644 res/cardsfolder/ire_of_kaminari.txt delete mode 100644 res/cardsfolder/iridescent_angel.txt delete mode 100644 res/cardsfolder/irini_sengir.txt delete mode 100644 res/cardsfolder/iron_barb_hellion.txt delete mode 100644 res/cardsfolder/iron_heart_chimera.txt delete mode 100644 res/cardsfolder/iron_lance.txt delete mode 100644 res/cardsfolder/iron_maiden.txt delete mode 100644 res/cardsfolder/iron_myr.txt delete mode 100644 res/cardsfolder/iron_star.txt delete mode 100644 res/cardsfolder/iron_tusk_elephant.txt delete mode 100644 res/cardsfolder/iron_will.txt delete mode 100644 res/cardsfolder/ironclaw_buzzardiers.txt delete mode 100644 res/cardsfolder/ironclaw_curse.txt delete mode 100644 res/cardsfolder/ironclaw_orcs.txt delete mode 100644 res/cardsfolder/ironhoof_ox.txt delete mode 100644 res/cardsfolder/ironroot_treefolk.txt delete mode 100644 res/cardsfolder/ironshell_beetle.txt delete mode 100644 res/cardsfolder/irradiate.txt delete mode 100644 res/cardsfolder/irrigation_ditch.txt delete mode 100644 res/cardsfolder/isamaru_hound_of_konda.txt delete mode 100644 res/cardsfolder/isao_enlightened_bushi.txt delete mode 100644 res/cardsfolder/ishi_ishi_akki_crackshot.txt delete mode 100644 res/cardsfolder/island.txt delete mode 100644 res/cardsfolder/island_fish_jasconius.txt delete mode 100644 res/cardsfolder/island_of_wak_wak.txt delete mode 100644 res/cardsfolder/isleback_spawn.txt delete mode 100644 res/cardsfolder/isochron_scepter.txt delete mode 100644 res/cardsfolder/isolation_cell.txt delete mode 100644 res/cardsfolder/it_that_betrays.txt delete mode 100644 res/cardsfolder/ith_high_arcanist.txt delete mode 100644 res/cardsfolder/ivory_crane_netsuke.txt delete mode 100644 res/cardsfolder/ivory_cup.txt delete mode 100644 res/cardsfolder/ivory_giant.txt delete mode 100644 res/cardsfolder/ivory_guardians.txt delete mode 100644 res/cardsfolder/ivory_tower.txt delete mode 100644 res/cardsfolder/ivy_dancer.txt delete mode 100644 res/cardsfolder/ivy_elemental.txt delete mode 100644 res/cardsfolder/iwamori_of_the_open_fist.txt delete mode 100644 res/cardsfolder/ixidors_will.txt delete mode 100644 res/cardsfolder/izzet_boilerworks.txt delete mode 100644 res/cardsfolder/izzet_chronarch.txt delete mode 100644 res/cardsfolder/izzet_signet.txt delete mode 100644 res/cardsfolder/jabaris_banner.txt delete mode 100644 res/cardsfolder/jace_beleren.txt delete mode 100644 res/cardsfolder/jace_the_mind_sculptor.txt delete mode 100644 res/cardsfolder/jaces_erasure.txt delete mode 100644 res/cardsfolder/jaces_ingenuity.txt delete mode 100644 res/cardsfolder/jackal_pup.txt delete mode 100644 res/cardsfolder/jackalope_herd.txt delete mode 100644 res/cardsfolder/jacques_le_vert.txt delete mode 100644 res/cardsfolder/jade_idol.txt delete mode 100644 res/cardsfolder/jade_leech.txt delete mode 100644 res/cardsfolder/jade_statue.txt delete mode 100644 res/cardsfolder/jagged_lightning.txt delete mode 100644 res/cardsfolder/jagged_poppet.txt delete mode 100644 res/cardsfolder/jagged_scar_archers.txt delete mode 100644 res/cardsfolder/jagwasp_swarm.txt delete mode 100644 res/cardsfolder/jalum_tome.txt delete mode 100644 res/cardsfolder/jamuraan_lion.txt delete mode 100644 res/cardsfolder/jandors_ring.txt delete mode 100644 res/cardsfolder/jandors_saddlebags.txt delete mode 100644 res/cardsfolder/jangling_automaton.txt delete mode 100644 res/cardsfolder/jareth_leonine_titan.txt delete mode 100644 res/cardsfolder/jasmine_boreal.txt delete mode 100644 res/cardsfolder/jawbone_skulkin.txt delete mode 100644 res/cardsfolder/jaya_ballard_task_mage.txt delete mode 100644 res/cardsfolder/jayemdae_tome.txt delete mode 100644 res/cardsfolder/jedit_ojanen.txt delete mode 100644 res/cardsfolder/jedit_ojanen_of_efrava.txt delete mode 100644 res/cardsfolder/jedits_dragoons.txt delete mode 100644 res/cardsfolder/jenara_asura_of_war.txt delete mode 100644 res/cardsfolder/jerrard_of_the_closed_fist.txt delete mode 100644 res/cardsfolder/jeska_warrior_adept.txt delete mode 100644 res/cardsfolder/jesters_cap.txt delete mode 100644 res/cardsfolder/jet_medallion.txt delete mode 100644 res/cardsfolder/jeweled_spirit.txt delete mode 100644 res/cardsfolder/jhessian_infiltrator.txt delete mode 100644 res/cardsfolder/jhessian_lookout.txt delete mode 100644 res/cardsfolder/jhessian_zombies.txt delete mode 100644 res/cardsfolder/jhoira_of_the_ghitu.txt delete mode 100644 res/cardsfolder/jhoiras_toolbox.txt delete mode 100644 res/cardsfolder/jhovall_queen.txt delete mode 100644 res/cardsfolder/jhovall_rider.txt delete mode 100644 res/cardsfolder/jin_gitaxias_core_augur.txt delete mode 100644 res/cardsfolder/jiwari_the_earth_aflame.txt delete mode 100644 res/cardsfolder/jodahs_avenger.txt delete mode 100644 res/cardsfolder/join_the_ranks.txt delete mode 100644 res/cardsfolder/joiner_adept.txt delete mode 100644 res/cardsfolder/jokulhaups.txt delete mode 100644 res/cardsfolder/jolraels_centaur.txt delete mode 100644 res/cardsfolder/jolraels_favor.txt delete mode 100644 res/cardsfolder/jolt.txt delete mode 100644 res/cardsfolder/jolting_merfolk.txt delete mode 100644 res/cardsfolder/jor_kadeen_the_prevailer.txt delete mode 100644 res/cardsfolder/joraga_bard.txt delete mode 100644 res/cardsfolder/joraga_treespeaker.txt delete mode 100644 res/cardsfolder/joraga_warcaller.txt delete mode 100644 res/cardsfolder/journey_to_nowhere.txt delete mode 100644 res/cardsfolder/journeyers_kite.txt delete mode 100644 res/cardsfolder/joven.txt delete mode 100644 res/cardsfolder/jovens_tools.txt delete mode 100644 res/cardsfolder/jovial_evil.txt delete mode 100644 res/cardsfolder/joyous_respite.txt delete mode 100644 res/cardsfolder/judge_of_currents.txt delete mode 100644 res/cardsfolder/jugan_the_rising_star.txt delete mode 100644 res/cardsfolder/juggernaut.txt delete mode 100644 res/cardsfolder/juju_bubble.txt delete mode 100644 res/cardsfolder/jukai_messenger.txt delete mode 100644 res/cardsfolder/jump.txt delete mode 100644 res/cardsfolder/jund_battlemage.txt delete mode 100644 res/cardsfolder/jund_charm.txt delete mode 100644 res/cardsfolder/jund_hackblade.txt delete mode 100644 res/cardsfolder/jund_panorama.txt delete mode 100644 res/cardsfolder/jund_sojourners.txt delete mode 100644 res/cardsfolder/jungle_barrier.txt delete mode 100644 res/cardsfolder/jungle_basin.txt delete mode 100644 res/cardsfolder/jungle_lion.txt delete mode 100644 res/cardsfolder/jungle_patrol.txt delete mode 100644 res/cardsfolder/jungle_shrine.txt delete mode 100644 res/cardsfolder/jungle_troll.txt delete mode 100644 res/cardsfolder/jungle_weaver.txt delete mode 100644 res/cardsfolder/jungle_wurm.txt delete mode 100644 res/cardsfolder/juniper_order_advocate.txt delete mode 100644 res/cardsfolder/juniper_order_druid.txt delete mode 100644 res/cardsfolder/juniper_order_ranger.txt delete mode 100644 res/cardsfolder/junk_diver.txt delete mode 100644 res/cardsfolder/junktroller.txt delete mode 100644 res/cardsfolder/juntu_stakes.txt delete mode 100644 res/cardsfolder/junun_efreet.txt delete mode 100644 res/cardsfolder/just_fate.txt delete mode 100644 res/cardsfolder/juvenile_gloomwidow.txt delete mode 100644 res/cardsfolder/juzam_djinn.txt delete mode 100644 res/cardsfolder/jwar_isle_refuge.txt delete mode 100644 res/cardsfolder/jwari_scuttler.txt delete mode 100644 res/cardsfolder/jwari_shapeshifter.txt delete mode 100644 res/cardsfolder/kabira_crossroads.txt delete mode 100644 res/cardsfolder/kabira_vindicator.txt delete mode 100644 res/cardsfolder/kabuto_moth.txt delete mode 100644 res/cardsfolder/kaervek_the_merciless.txt delete mode 100644 res/cardsfolder/kaerveks_hex.txt delete mode 100644 res/cardsfolder/kaerveks_spite.txt delete mode 100644 res/cardsfolder/kaijin_of_the_vanishing_touch.txt delete mode 100644 res/cardsfolder/kalastria_highborn.txt delete mode 100644 res/cardsfolder/kaleidostone.txt delete mode 100644 res/cardsfolder/kalonian_behemoth.txt delete mode 100644 res/cardsfolder/kamahl_fist_of_krosa.txt delete mode 100644 res/cardsfolder/kamahl_pit_fighter.txt delete mode 100644 res/cardsfolder/kamahls_desire.txt delete mode 100644 res/cardsfolder/kami_of_ancient_law.txt delete mode 100644 res/cardsfolder/kami_of_empty_graves.txt delete mode 100644 res/cardsfolder/kami_of_false_hope.txt delete mode 100644 res/cardsfolder/kami_of_fires_roar.txt delete mode 100644 res/cardsfolder/kami_of_lunacy.txt delete mode 100644 res/cardsfolder/kami_of_old_stone.txt delete mode 100644 res/cardsfolder/kami_of_tattered_shoji.txt delete mode 100644 res/cardsfolder/kami_of_the_crescent_moon.txt delete mode 100644 res/cardsfolder/kami_of_the_honored_dead.txt delete mode 100644 res/cardsfolder/kami_of_the_hunt.txt delete mode 100644 res/cardsfolder/kami_of_the_palace_fields.txt delete mode 100644 res/cardsfolder/kami_of_the_tended_garden.txt delete mode 100644 res/cardsfolder/kami_of_the_waning_moon.txt delete mode 100644 res/cardsfolder/kami_of_twisted_reflection.txt delete mode 100644 res/cardsfolder/karakas.txt delete mode 100644 res/cardsfolder/kargan_dragonlord.txt delete mode 100644 res/cardsfolder/karma.txt delete mode 100644 res/cardsfolder/karmic_guide.txt delete mode 100644 res/cardsfolder/karn_silver_golem.txt delete mode 100644 res/cardsfolder/karns_touch.txt delete mode 100644 res/cardsfolder/karoo.txt delete mode 100644 res/cardsfolder/karoo_meerkat.txt delete mode 100644 res/cardsfolder/karplusan_forest.txt delete mode 100644 res/cardsfolder/karplusan_giant.txt delete mode 100644 res/cardsfolder/karplusan_strider.txt delete mode 100644 res/cardsfolder/karplusan_wolverine.txt delete mode 100644 res/cardsfolder/karplusan_yeti.txt delete mode 100644 res/cardsfolder/karstoderm.txt delete mode 100644 res/cardsfolder/kashi_tribe_elite.txt delete mode 100644 res/cardsfolder/kashi_tribe_reaver.txt delete mode 100644 res/cardsfolder/kashi_tribe_warriors.txt delete mode 100644 res/cardsfolder/kasimir_the_lone_wolf.txt delete mode 100644 res/cardsfolder/kataki_wars_wage.txt delete mode 100644 res/cardsfolder/kathari_bomber.txt delete mode 100644 res/cardsfolder/kathari_remnant.txt delete mode 100644 res/cardsfolder/kathari_screecher.txt delete mode 100644 res/cardsfolder/kavu_aggressor.txt delete mode 100644 res/cardsfolder/kavu_climber.txt delete mode 100644 res/cardsfolder/kavu_glider.txt delete mode 100644 res/cardsfolder/kavu_howler.txt delete mode 100644 res/cardsfolder/kavu_lair.txt delete mode 100644 res/cardsfolder/kavu_mauler.txt delete mode 100644 res/cardsfolder/kavu_monarch.txt delete mode 100644 res/cardsfolder/kavu_predator.txt delete mode 100644 res/cardsfolder/kavu_runner.txt delete mode 100644 res/cardsfolder/kavu_scout.txt delete mode 100644 res/cardsfolder/kavu_titan.txt delete mode 100644 res/cardsfolder/kaysa.txt delete mode 100644 res/cardsfolder/kazandu_blademaster.txt delete mode 100644 res/cardsfolder/kazandu_refuge.txt delete mode 100644 res/cardsfolder/kazandu_tuskcaller.txt delete mode 100644 res/cardsfolder/kazuul_warlord.txt delete mode 100644 res/cardsfolder/kederekt_leviathan.txt delete mode 100644 res/cardsfolder/kederekt_parasite.txt delete mode 100644 res/cardsfolder/keen_eyed_archers.txt delete mode 100644 res/cardsfolder/keen_sense.txt delete mode 100644 res/cardsfolder/keeneye_aven.txt delete mode 100644 res/cardsfolder/keening_banshee.txt delete mode 100644 res/cardsfolder/keening_stone.txt delete mode 100644 res/cardsfolder/keep_watch.txt delete mode 100644 res/cardsfolder/keeper_of_kookus.txt delete mode 100644 res/cardsfolder/keeper_of_the_nine_gales.txt delete mode 100644 res/cardsfolder/keeper_of_tresserhorn.txt delete mode 100644 res/cardsfolder/keepers_of_the_faith.txt delete mode 100644 res/cardsfolder/kei_takahashi.txt delete mode 100644 res/cardsfolder/keiga_the_tide_star.txt delete mode 100644 res/cardsfolder/keldon_arsonist.txt delete mode 100644 res/cardsfolder/keldon_battlewagon.txt delete mode 100644 res/cardsfolder/keldon_berserker.txt delete mode 100644 res/cardsfolder/keldon_champion.txt delete mode 100644 res/cardsfolder/keldon_halberdier.txt delete mode 100644 res/cardsfolder/keldon_mantle.txt delete mode 100644 res/cardsfolder/keldon_marauders.txt delete mode 100644 res/cardsfolder/keldon_megaliths.txt delete mode 100644 res/cardsfolder/keldon_necropolis.txt delete mode 100644 res/cardsfolder/keldon_vandals.txt delete mode 100644 res/cardsfolder/keldon_warlord.txt delete mode 100644 res/cardsfolder/kelinore_bat.txt delete mode 100644 res/cardsfolder/kelsinko_ranger.txt delete mode 100644 res/cardsfolder/kemba_kha_regent.txt delete mode 100644 res/cardsfolder/kembas_skyguard.txt delete mode 100644 res/cardsfolder/kemuri_onna.txt delete mode 100644 res/cardsfolder/kezzerdrix.txt delete mode 100644 res/cardsfolder/khabal_ghoul.txt delete mode 100644 res/cardsfolder/khalni_garden.txt delete mode 100644 res/cardsfolder/khalni_gem.txt delete mode 100644 res/cardsfolder/khalni_heart_expedition.txt delete mode 100644 res/cardsfolder/khalni_hydra.txt delete mode 100644 res/cardsfolder/kher_keep.txt delete mode 100644 res/cardsfolder/kiki_jiki_mirror_breaker.txt delete mode 100644 res/cardsfolder/kiku_nights_flower.txt delete mode 100644 res/cardsfolder/kikus_shadow.txt delete mode 100644 res/cardsfolder/killer_bees.txt delete mode 100644 res/cardsfolder/killer_whale.txt delete mode 100644 res/cardsfolder/kiln_fiend.txt delete mode 100644 res/cardsfolder/kiln_walker.txt delete mode 100644 res/cardsfolder/kindle.txt delete mode 100644 res/cardsfolder/kindled_fury.txt delete mode 100644 res/cardsfolder/king_cheetah.txt delete mode 100644 res/cardsfolder/king_crab.txt delete mode 100644 res/cardsfolder/king_suleiman.txt delete mode 100644 res/cardsfolder/kingfisher.txt delete mode 100644 res/cardsfolder/kings_assassin.txt delete mode 100644 res/cardsfolder/kinsbaile_balloonist.txt delete mode 100644 res/cardsfolder/kinsbaile_borderguard.txt delete mode 100644 res/cardsfolder/kinsbaile_cavalier.txt delete mode 100644 res/cardsfolder/kinsbaile_skirmisher.txt delete mode 100644 res/cardsfolder/kird_ape.txt delete mode 100644 res/cardsfolder/kiri_onna.txt delete mode 100644 res/cardsfolder/kirtars_desire.txt delete mode 100644 res/cardsfolder/kismet.txt delete mode 100644 res/cardsfolder/kiss_of_death.txt delete mode 100644 res/cardsfolder/kiss_of_the_amesha.txt delete mode 100644 res/cardsfolder/kitchen_finks.txt delete mode 100644 res/cardsfolder/kitesail.txt delete mode 100644 res/cardsfolder/kitesail_apprentice.txt delete mode 100644 res/cardsfolder/kithkin_daggerdare.txt delete mode 100644 res/cardsfolder/kithkin_greatheart.txt delete mode 100644 res/cardsfolder/kithkin_harbinger.txt delete mode 100644 res/cardsfolder/kithkin_healer.txt delete mode 100644 res/cardsfolder/kithkin_rabble.txt delete mode 100644 res/cardsfolder/kithkin_shielddare.txt delete mode 100644 res/cardsfolder/kithkin_spellduster.txt delete mode 100644 res/cardsfolder/kithkin_zephyrnaut.txt delete mode 100644 res/cardsfolder/kitsune_blademaster.txt delete mode 100644 res/cardsfolder/kitsune_dawnblade.txt delete mode 100644 res/cardsfolder/kitsune_diviner.txt delete mode 100644 res/cardsfolder/kitsune_loreweaver.txt delete mode 100644 res/cardsfolder/kitsune_riftwalker.txt delete mode 100644 res/cardsfolder/kjeldoran_dead.txt delete mode 100644 res/cardsfolder/kjeldoran_gargoyle.txt delete mode 100644 res/cardsfolder/kjeldoran_home_guard.txt delete mode 100644 res/cardsfolder/kjeldoran_javelineer.txt delete mode 100644 res/cardsfolder/kjeldoran_outpost.txt delete mode 100644 res/cardsfolder/kjeldoran_outrider.txt delete mode 100644 res/cardsfolder/kjeldoran_war_cry.txt delete mode 100644 res/cardsfolder/knight_captain_of_eos.txt delete mode 100644 res/cardsfolder/knight_errant.txt delete mode 100644 res/cardsfolder/knight_exemplar.txt delete mode 100644 res/cardsfolder/knight_of_cliffhaven.txt delete mode 100644 res/cardsfolder/knight_of_dawn.txt delete mode 100644 res/cardsfolder/knight_of_dusk.txt delete mode 100644 res/cardsfolder/knight_of_meadowgrain.txt delete mode 100644 res/cardsfolder/knight_of_new_alara.txt delete mode 100644 res/cardsfolder/knight_of_stromgald.txt delete mode 100644 res/cardsfolder/knight_of_sursi.txt delete mode 100644 res/cardsfolder/knight_of_the_reliquary.txt delete mode 100644 res/cardsfolder/knight_of_the_skyward_eye.txt delete mode 100644 res/cardsfolder/knight_of_the_white_orchid.txt delete mode 100644 res/cardsfolder/knight_of_valor.txt delete mode 100644 res/cardsfolder/knighthood.txt delete mode 100644 res/cardsfolder/knotvine_mystic.txt delete mode 100644 res/cardsfolder/knotvine_paladin.txt delete mode 100644 res/cardsfolder/knucklebone_witch.txt delete mode 100644 res/cardsfolder/kobold_drill_sergeant.txt delete mode 100644 res/cardsfolder/kobold_overlord.txt delete mode 100644 res/cardsfolder/kobold_taskmaster.txt delete mode 100644 res/cardsfolder/kobolds_of_kher_keep.txt delete mode 100644 res/cardsfolder/kodama_of_the_center_tree.txt delete mode 100644 res/cardsfolder/kodama_of_the_north_tree.txt delete mode 100644 res/cardsfolder/kodama_of_the_south_tree.txt delete mode 100644 res/cardsfolder/kodamas_reach.txt delete mode 100644 res/cardsfolder/kokusho_the_evening_star.txt delete mode 100644 res/cardsfolder/konda_lord_of_eiganjo.txt delete mode 100644 res/cardsfolder/kondas_hatamoto.txt delete mode 100644 res/cardsfolder/kongming_sleeping_dragon.txt delete mode 100644 res/cardsfolder/kookus.txt delete mode 100644 res/cardsfolder/kor_aeronaut.txt delete mode 100644 res/cardsfolder/kor_cartographer.txt delete mode 100644 res/cardsfolder/kor_duelist.txt delete mode 100644 res/cardsfolder/kor_firewalker.txt delete mode 100644 res/cardsfolder/kor_haven.txt delete mode 100644 res/cardsfolder/kor_hookmaster.txt delete mode 100644 res/cardsfolder/kor_line_slinger.txt delete mode 100644 res/cardsfolder/kor_sanctifiers.txt delete mode 100644 res/cardsfolder/kor_skyfisher.txt delete mode 100644 res/cardsfolder/kor_spiritdancer.txt delete mode 100644 res/cardsfolder/korlash_heir_to_blackblade.txt delete mode 100644 res/cardsfolder/kormus_bell.txt delete mode 100644 res/cardsfolder/koskun_keep.txt delete mode 100644 res/cardsfolder/koth_of_the_hammer.txt delete mode 100644 res/cardsfolder/koths_courier.txt delete mode 100644 res/cardsfolder/kozilek_butcher_of_truth.txt delete mode 100644 res/cardsfolder/kozileks_predator.txt delete mode 100644 res/cardsfolder/kraken_hatchling.txt delete mode 100644 res/cardsfolder/krakens_eye.txt delete mode 100644 res/cardsfolder/krakilin.txt delete mode 100644 res/cardsfolder/kranioceros.txt delete mode 100644 res/cardsfolder/krark_clan_engineers.txt delete mode 100644 res/cardsfolder/krark_clan_grunt.txt delete mode 100644 res/cardsfolder/krark_clan_ironworks.txt delete mode 100644 res/cardsfolder/krark_clan_ogre.txt delete mode 100644 res/cardsfolder/krark_clan_shaman.txt delete mode 100644 res/cardsfolder/krark_clan_stoker.txt delete mode 100644 res/cardsfolder/kresh_the_bloodbraided.txt delete mode 100644 res/cardsfolder/kris_mage.txt delete mode 100644 res/cardsfolder/krosan_archer.txt delete mode 100644 res/cardsfolder/krosan_avenger.txt delete mode 100644 res/cardsfolder/krosan_beast.txt delete mode 100644 res/cardsfolder/krosan_cloudscraper.txt delete mode 100644 res/cardsfolder/krosan_colossus.txt delete mode 100644 res/cardsfolder/krosan_constrictor.txt delete mode 100644 res/cardsfolder/krosan_grip.txt delete mode 100644 res/cardsfolder/krosan_groundshaker.txt delete mode 100644 res/cardsfolder/krosan_restorer.txt delete mode 100644 res/cardsfolder/krosan_tusker.txt delete mode 100644 res/cardsfolder/krosan_verge.txt delete mode 100644 res/cardsfolder/krosan_warchief.txt delete mode 100644 res/cardsfolder/krosan_wayfarer.txt delete mode 100644 res/cardsfolder/krovikan_elementalist.txt delete mode 100644 res/cardsfolder/krovikan_fetish.txt delete mode 100644 res/cardsfolder/krovikan_horror.txt delete mode 100644 res/cardsfolder/krovikan_mist.txt delete mode 100644 res/cardsfolder/krovikan_rot.txt delete mode 100644 res/cardsfolder/krovikan_scoundrel.txt delete mode 100644 res/cardsfolder/kry_shield.txt delete mode 100644 res/cardsfolder/kuldotha_flamefiend.txt delete mode 100644 res/cardsfolder/kuldotha_forgemaster.txt delete mode 100644 res/cardsfolder/kuldotha_phoenix.txt delete mode 100644 res/cardsfolder/kuldotha_rebirth.txt delete mode 100644 res/cardsfolder/kuldotha_ringleader.txt delete mode 100644 res/cardsfolder/kulrath_knight.txt delete mode 100644 res/cardsfolder/kurgadon.txt delete mode 100644 res/cardsfolder/kuro_pitlord.txt delete mode 100644 res/cardsfolder/kuros_taken.txt delete mode 100644 res/cardsfolder/kyoki_sanitys_eclipse.txt delete mode 100644 res/cardsfolder/kyren_glider.txt delete mode 100644 res/cardsfolder/kyren_negotiations.txt delete mode 100644 res/cardsfolder/kyren_sniper.txt delete mode 100644 res/cardsfolder/lab_rats.txt delete mode 100644 res/cardsfolder/labyrinth_minotaur.txt delete mode 100644 res/cardsfolder/laccolith_grunt.txt delete mode 100644 res/cardsfolder/laccolith_titan.txt delete mode 100644 res/cardsfolder/laccolith_warrior.txt delete mode 100644 res/cardsfolder/laccolith_whelp.txt delete mode 100644 res/cardsfolder/lace_with_moonglove.txt delete mode 100644 res/cardsfolder/lady_caleria.txt delete mode 100644 res/cardsfolder/lady_evangela.txt delete mode 100644 res/cardsfolder/lady_orca.txt delete mode 100644 res/cardsfolder/lady_zhurong_warrior_queen.txt delete mode 100644 res/cardsfolder/lagac_lizard.txt delete mode 100644 res/cardsfolder/lake_of_the_dead.txt delete mode 100644 res/cardsfolder/lance.txt delete mode 100644 res/cardsfolder/land_cap.txt delete mode 100644 res/cardsfolder/land_equilibrium.txt delete mode 100644 res/cardsfolder/land_leeches.txt delete mode 100644 res/cardsfolder/land_tax.txt delete mode 100644 res/cardsfolder/landbind_ritual.txt delete mode 100644 res/cardsfolder/lantern_kami.txt delete mode 100644 res/cardsfolder/lantern_lit_graveyard.txt delete mode 100644 res/cardsfolder/lapis_lazuli_talisman.txt delete mode 100644 res/cardsfolder/lapse_of_certainty.txt delete mode 100644 res/cardsfolder/laquatuss_champion.txt delete mode 100755 res/cardsfolder/larceny.txt delete mode 100644 res/cardsfolder/lash_out.txt delete mode 100644 res/cardsfolder/lashknife_barrier.txt delete mode 100644 res/cardsfolder/lashwrithe.txt delete mode 100644 res/cardsfolder/last_breath.txt delete mode 100644 res/cardsfolder/last_caress.txt delete mode 100644 res/cardsfolder/last_gasp.txt delete mode 100644 res/cardsfolder/last_kiss.txt delete mode 100644 res/cardsfolder/last_laugh.txt delete mode 100644 res/cardsfolder/last_stand.txt delete mode 100644 res/cardsfolder/last_word.txt delete mode 100644 res/cardsfolder/latulla_keldon_overseer.txt delete mode 100644 res/cardsfolder/latullas_orders.txt delete mode 100644 res/cardsfolder/launch.txt delete mode 100644 res/cardsfolder/lava_axe.txt delete mode 100644 res/cardsfolder/lava_dart.txt delete mode 100644 res/cardsfolder/lava_flow.txt delete mode 100644 res/cardsfolder/lava_hounds.txt delete mode 100755 res/cardsfolder/lava_runner.txt delete mode 100644 res/cardsfolder/lava_spike.txt delete mode 100644 res/cardsfolder/lava_storm.txt delete mode 100644 res/cardsfolder/lava_tubes.txt delete mode 100644 res/cardsfolder/lava_zombie.txt delete mode 100644 res/cardsfolder/lavaborn_muse.txt delete mode 100644 res/cardsfolder/lavaclaw_reaches.txt delete mode 100644 res/cardsfolder/lavacore_elemental.txt delete mode 100644 res/cardsfolder/lavafume_invoker.txt delete mode 100644 res/cardsfolder/lavalanche.txt delete mode 100644 res/cardsfolder/lavamancers_skill.txt delete mode 100644 res/cardsfolder/lawbringer.txt delete mode 100644 res/cardsfolder/lay_bare.txt delete mode 100644 res/cardsfolder/lay_of_the_land.txt delete mode 100644 res/cardsfolder/lay_waste.txt delete mode 100644 res/cardsfolder/lead_astray.txt delete mode 100644 res/cardsfolder/lead_belly_chimera.txt delete mode 100644 res/cardsfolder/lead_golem.txt delete mode 100644 res/cardsfolder/lead_the_stampede.txt delete mode 100644 res/cardsfolder/leaden_fists.txt delete mode 100644 res/cardsfolder/leaden_myr.txt delete mode 100644 res/cardsfolder/leaf_arrow.txt delete mode 100644 res/cardsfolder/leaf_crowned_elder.txt delete mode 100644 res/cardsfolder/leaf_dancer.txt delete mode 100644 res/cardsfolder/leaf_gilder.txt delete mode 100644 res/cardsfolder/leafdrake_roost.txt delete mode 100644 res/cardsfolder/leap.txt delete mode 100644 res/cardsfolder/leap_of_flame.txt delete mode 100644 res/cardsfolder/leaping_lizard.txt delete mode 100644 res/cardsfolder/leatherback_baloth.txt delete mode 100644 res/cardsfolder/leeches.txt delete mode 100644 res/cardsfolder/leechridden_swamp.txt delete mode 100644 res/cardsfolder/leering_emblem.txt delete mode 100644 res/cardsfolder/legacy_weapon.txt delete mode 100644 res/cardsfolder/legacys_allure.txt delete mode 100644 res/cardsfolder/legions_of_lim_dul.txt delete mode 100644 res/cardsfolder/leonin_abunas.txt delete mode 100644 res/cardsfolder/leonin_armorguard.txt delete mode 100644 res/cardsfolder/leonin_battlemage.txt delete mode 100644 res/cardsfolder/leonin_den_guard.txt delete mode 100644 res/cardsfolder/leonin_elder.txt delete mode 100644 res/cardsfolder/leonin_relic_warder.txt delete mode 100644 res/cardsfolder/leonin_scimitar.txt delete mode 100644 res/cardsfolder/leonin_skyhunter.txt delete mode 100644 res/cardsfolder/leonin_squire.txt delete mode 100644 res/cardsfolder/leonin_sun_standard.txt delete mode 100644 res/cardsfolder/leshracs_rite.txt delete mode 100644 res/cardsfolder/leshracs_sigil.txt delete mode 100644 res/cardsfolder/lesser_gargadon.txt delete mode 100644 res/cardsfolder/lethargy_trap.txt delete mode 100644 res/cardsfolder/leveler.txt delete mode 100644 res/cardsfolder/levitation.txt delete mode 100644 res/cardsfolder/ley_druid.txt delete mode 100644 res/cardsfolder/leyline_of_anticipation.txt delete mode 100644 res/cardsfolder/leyline_of_lifeforce.txt delete mode 100644 res/cardsfolder/leyline_of_lightning.txt delete mode 100644 res/cardsfolder/leyline_of_punishment.txt delete mode 100644 res/cardsfolder/leyline_of_singularity.txt delete mode 100644 res/cardsfolder/leyline_of_the_meek.txt delete mode 100644 res/cardsfolder/leyline_of_the_void.txt delete mode 100644 res/cardsfolder/leyline_of_vitality.txt delete mode 100644 res/cardsfolder/lhurgoyf.txt delete mode 100755 res/cardsfolder/liability.txt delete mode 100644 res/cardsfolder/liberated_dwarf.txt delete mode 100644 res/cardsfolder/library_of_alexandria.txt delete mode 100644 res/cardsfolder/lich.txt delete mode 100644 res/cardsfolder/lich_lord_of_unx.txt delete mode 100644 res/cardsfolder/lichenthrope.txt delete mode 100644 res/cardsfolder/liege_of_the_axe.txt delete mode 100644 res/cardsfolder/liege_of_the_pit.txt delete mode 100644 res/cardsfolder/liege_of_the_tangle.txt delete mode 100644 res/cardsfolder/lieutenant_kirtar.txt delete mode 100644 res/cardsfolder/life_and_limb.txt delete mode 100644 res/cardsfolder/life_burst.txt delete mode 100644 res/cardsfolder/life_chisel.txt delete mode 100644 res/cardsfolder/life_from_the_loam.txt delete mode 100644 res/cardsfolder/lifeblood.txt delete mode 100644 res/cardsfolder/lifeforce.txt delete mode 100644 res/cardsfolder/lifegift.txt delete mode 100644 res/cardsfolder/lifelink.txt delete mode 100644 res/cardsfolder/lifes_finale.txt delete mode 100644 res/cardsfolder/lifesmith.txt delete mode 100644 res/cardsfolder/lifespark_spellbomb.txt delete mode 100644 res/cardsfolder/lifespinner.txt delete mode 100644 res/cardsfolder/lifetap.txt delete mode 100644 res/cardsfolder/light_of_day.txt delete mode 100644 res/cardsfolder/light_of_sanction.txt delete mode 100644 res/cardsfolder/lightbringer.txt delete mode 100644 res/cardsfolder/lighthouse_chronologist.txt delete mode 100644 res/cardsfolder/lightkeeper_of_emeria.txt delete mode 100644 res/cardsfolder/lightmine_field.txt delete mode 100644 res/cardsfolder/lightning_angel.txt delete mode 100644 res/cardsfolder/lightning_blast.txt delete mode 100644 res/cardsfolder/lightning_blow.txt delete mode 100644 res/cardsfolder/lightning_bolt.txt delete mode 100644 res/cardsfolder/lightning_cloud.txt delete mode 100644 res/cardsfolder/lightning_crafter.txt delete mode 100644 res/cardsfolder/lightning_dragon.txt delete mode 100644 res/cardsfolder/lightning_elemental.txt delete mode 100644 res/cardsfolder/lightning_greaves.txt delete mode 100644 res/cardsfolder/lightning_helix.txt delete mode 100644 res/cardsfolder/lightning_hounds.txt delete mode 100644 res/cardsfolder/lightning_reaver.txt delete mode 100644 res/cardsfolder/lightning_rift.txt delete mode 100644 res/cardsfolder/lightning_serpent.txt delete mode 100644 res/cardsfolder/lightning_surge.txt delete mode 100644 res/cardsfolder/lightning_talons.txt delete mode 100644 res/cardsfolder/lightwielder_paladin.txt delete mode 100644 res/cardsfolder/lignify.txt delete mode 100644 res/cardsfolder/liliana_vess.txt delete mode 100644 res/cardsfolder/lilianas_caress.txt delete mode 100644 res/cardsfolder/lilianas_specter.txt delete mode 100644 res/cardsfolder/lilting_refrain.txt delete mode 100644 res/cardsfolder/lim_dul_the_necromancer.txt delete mode 100644 res/cardsfolder/lim_duls_cohort.txt delete mode 100644 res/cardsfolder/lim_duls_high_guard.txt delete mode 100644 res/cardsfolder/limestone_golem.txt delete mode 100644 res/cardsfolder/lin_sivvi_defiant_hero.txt delete mode 100644 res/cardsfolder/lingering_death.txt delete mode 100644 res/cardsfolder/lingering_mirage.txt delete mode 100644 res/cardsfolder/lingering_tormentor.txt delete mode 100644 res/cardsfolder/linvala_keeper_of_silence.txt delete mode 100644 res/cardsfolder/lionheart_maverick.txt delete mode 100644 res/cardsfolder/liquify.txt delete mode 100644 res/cardsfolder/liquimetal_coating.txt delete mode 100644 res/cardsfolder/lithatog.txt delete mode 100644 res/cardsfolder/liu_bei_lord_of_shu.txt delete mode 100644 res/cardsfolder/living_airship.txt delete mode 100644 res/cardsfolder/living_armor.txt delete mode 100644 res/cardsfolder/living_artifact.txt delete mode 100644 res/cardsfolder/living_death.txt delete mode 100644 res/cardsfolder/living_hive.txt delete mode 100644 res/cardsfolder/living_lands.txt delete mode 100644 res/cardsfolder/living_plane.txt delete mode 100644 res/cardsfolder/living_wall.txt delete mode 100644 res/cardsfolder/livonya_silone.txt delete mode 100644 res/cardsfolder/lizard_warrior.txt delete mode 100644 res/cardsfolder/llanowar_augur.txt delete mode 100644 res/cardsfolder/llanowar_behemoth.txt delete mode 100644 res/cardsfolder/llanowar_cavalry.txt delete mode 100644 res/cardsfolder/llanowar_dead.txt delete mode 100644 res/cardsfolder/llanowar_druid.txt delete mode 100644 res/cardsfolder/llanowar_elite.txt delete mode 100644 res/cardsfolder/llanowar_elves.txt delete mode 100644 res/cardsfolder/llanowar_empath.txt delete mode 100644 res/cardsfolder/llanowar_knight.txt delete mode 100644 res/cardsfolder/llanowar_mentor.txt delete mode 100644 res/cardsfolder/llanowar_sentinel.txt delete mode 100644 res/cardsfolder/llanowar_wastes.txt delete mode 100644 res/cardsfolder/loam_dweller.txt delete mode 100644 res/cardsfolder/loam_lion.txt delete mode 100644 res/cardsfolder/loamdragger_giant.txt delete mode 100644 res/cardsfolder/lobotomy.txt delete mode 100644 res/cardsfolder/loch_korrigan.txt delete mode 100644 res/cardsfolder/lockjaw_snapper.txt delete mode 100644 res/cardsfolder/locust_miser.txt delete mode 100644 res/cardsfolder/locust_swarm.txt delete mode 100644 res/cardsfolder/lodestone_bauble.txt delete mode 100644 res/cardsfolder/lodestone_golem.txt delete mode 100644 res/cardsfolder/lodestone_myr.txt delete mode 100644 res/cardsfolder/lone_missionary.txt delete mode 100644 res/cardsfolder/lonely_sandbar.txt delete mode 100644 res/cardsfolder/long_forgotten_gohei.txt delete mode 100644 res/cardsfolder/long_term_plans.txt delete mode 100644 res/cardsfolder/longbow_archer.txt delete mode 100644 res/cardsfolder/looming_hoverguard.txt delete mode 100644 res/cardsfolder/looming_shade.txt delete mode 100644 res/cardsfolder/looter_il_kor.txt delete mode 100644 res/cardsfolder/lord_magnus.txt delete mode 100644 res/cardsfolder/lord_of_atlantis.txt delete mode 100644 res/cardsfolder/lord_of_extinction.txt delete mode 100644 res/cardsfolder/lord_of_shatterskull_pass.txt delete mode 100644 res/cardsfolder/lord_of_the_pit.txt delete mode 100644 res/cardsfolder/lord_of_the_undead.txt delete mode 100644 res/cardsfolder/lord_of_tresserhorn.txt delete mode 100644 res/cardsfolder/lore_broker.txt delete mode 100644 res/cardsfolder/lorescale_coatl.txt delete mode 100644 res/cardsfolder/lorthos_the_tidemaker.txt delete mode 100644 res/cardsfolder/lose_hope.txt delete mode 100644 res/cardsfolder/lost_auramancers.txt delete mode 100644 res/cardsfolder/lost_hours.txt delete mode 100644 res/cardsfolder/lost_leonin.txt delete mode 100644 res/cardsfolder/lost_soul.txt delete mode 100644 res/cardsfolder/lotus_bloom.txt delete mode 100644 res/cardsfolder/lotus_blossom.txt delete mode 100644 res/cardsfolder/lotus_cobra.txt delete mode 100644 res/cardsfolder/lotus_guardian.txt delete mode 100644 res/cardsfolder/lotus_petal.txt delete mode 100644 res/cardsfolder/lotus_vale.txt delete mode 100644 res/cardsfolder/lovisa_coldeyes.txt delete mode 100644 res/cardsfolder/lowland_giant.txt delete mode 100644 res/cardsfolder/loxodon_anchorite.txt delete mode 100644 res/cardsfolder/loxodon_convert.txt delete mode 100644 res/cardsfolder/loxodon_gatekeeper.txt delete mode 100644 res/cardsfolder/loxodon_hierarch.txt delete mode 100644 res/cardsfolder/loxodon_mender.txt delete mode 100644 res/cardsfolder/loxodon_mystic.txt delete mode 100644 res/cardsfolder/loxodon_partisan.txt delete mode 100644 res/cardsfolder/loxodon_punisher.txt delete mode 100644 res/cardsfolder/loxodon_stalwart.txt delete mode 100644 res/cardsfolder/loxodon_warhammer.txt delete mode 100644 res/cardsfolder/loxodon_wayfarer.txt delete mode 100644 res/cardsfolder/loyal_retainers.txt delete mode 100644 res/cardsfolder/loyal_sentry.txt delete mode 100644 res/cardsfolder/lu_bu_master_at_arms.txt delete mode 100644 res/cardsfolder/lu_meng_wu_general.txt delete mode 100644 res/cardsfolder/lu_su_wu_advisor.txt delete mode 100644 res/cardsfolder/lu_xun_scholar_general.txt delete mode 100644 res/cardsfolder/lucent_liminid.txt delete mode 100644 res/cardsfolder/lull.txt delete mode 100644 res/cardsfolder/lumbering_satyr.txt delete mode 100644 res/cardsfolder/lumengrid_drake.txt delete mode 100644 res/cardsfolder/lumengrid_gargoyle.txt delete mode 100644 res/cardsfolder/lumengrid_warden.txt delete mode 100644 res/cardsfolder/luminous_angel.txt delete mode 100644 res/cardsfolder/luminous_wake.txt delete mode 100644 res/cardsfolder/lunar_avenger.txt delete mode 100644 res/cardsfolder/lunge.txt delete mode 100644 res/cardsfolder/lunk_errant.txt delete mode 100644 res/cardsfolder/lure.txt delete mode 100644 res/cardsfolder/lurking_informant.txt delete mode 100644 res/cardsfolder/lurking_nightstalker.txt delete mode 100644 res/cardsfolder/lurking_predators.txt delete mode 100644 res/cardsfolder/lurking_skirge.txt delete mode 100644 res/cardsfolder/lush_growth.txt delete mode 100644 res/cardsfolder/lust_for_war.txt delete mode 100644 res/cardsfolder/lux_cannon.txt delete mode 100644 res/cardsfolder/lymph_sliver.txt delete mode 100644 res/cardsfolder/lynx.txt delete mode 100644 res/cardsfolder/lys_alana_bowmaster.txt delete mode 100644 res/cardsfolder/lys_alana_huntmaster.txt delete mode 100644 res/cardsfolder/lyzolda_the_blood_witch.txt delete mode 100644 res/cardsfolder/ma_chao_western_warrior.txt delete mode 100644 res/cardsfolder/macabre_waltz.txt delete mode 100644 res/cardsfolder/macetail_hystrodon.txt delete mode 100644 res/cardsfolder/machinate.txt delete mode 100644 res/cardsfolder/mad_auntie.txt delete mode 100644 res/cardsfolder/maddening_wind.txt delete mode 100644 res/cardsfolder/madrush_cyclops.txt delete mode 100644 res/cardsfolder/maelstrom_nexus.txt delete mode 100644 res/cardsfolder/maelstrom_pulse.txt delete mode 100644 res/cardsfolder/maga_traitor_to_mortals.txt delete mode 100644 res/cardsfolder/mage_il_vec.txt delete mode 100644 res/cardsfolder/mage_slayer.txt delete mode 100644 res/cardsfolder/magefire_wings.txt delete mode 100644 res/cardsfolder/mages_guile.txt delete mode 100644 res/cardsfolder/mageta_the_lion.txt delete mode 100644 res/cardsfolder/magetas_boon.txt delete mode 100644 res/cardsfolder/maggot_carrier.txt delete mode 100644 res/cardsfolder/maggot_therapy.txt delete mode 100644 res/cardsfolder/magister_sphinx.txt delete mode 100644 res/cardsfolder/magistrates_scepter.txt delete mode 100644 res/cardsfolder/magistrates_veto.txt delete mode 100644 res/cardsfolder/magma_giant.txt delete mode 100644 res/cardsfolder/magma_jet.txt delete mode 100644 res/cardsfolder/magma_mine.txt delete mode 100644 res/cardsfolder/magma_phoenix.txt delete mode 100644 res/cardsfolder/magma_rift.txt delete mode 100644 res/cardsfolder/magma_sliver.txt delete mode 100644 res/cardsfolder/magma_spray.txt delete mode 100644 res/cardsfolder/magma_vein.txt delete mode 100644 res/cardsfolder/magmaw.txt delete mode 100644 res/cardsfolder/magnetic_flux.txt delete mode 100644 res/cardsfolder/magnetic_mine.txt delete mode 100644 res/cardsfolder/magnify.txt delete mode 100644 res/cardsfolder/magnigoth_treefolk.txt delete mode 100644 res/cardsfolder/magnivore.txt delete mode 100644 res/cardsfolder/magosi_the_waterveil.txt delete mode 100644 res/cardsfolder/magus_of_the_abyss.txt delete mode 100644 res/cardsfolder/magus_of_the_bazaar.txt delete mode 100644 res/cardsfolder/magus_of_the_candelabra.txt delete mode 100644 res/cardsfolder/magus_of_the_coffers.txt delete mode 100644 res/cardsfolder/magus_of_the_disk.txt delete mode 100644 res/cardsfolder/magus_of_the_library.txt delete mode 100644 res/cardsfolder/magus_of_the_moat.txt delete mode 100644 res/cardsfolder/magus_of_the_moon.txt delete mode 100644 res/cardsfolder/magus_of_the_tabernacle.txt delete mode 100644 res/cardsfolder/magus_of_the_unseen.txt delete mode 100644 res/cardsfolder/magus_of_the_vineyard.txt delete mode 100644 res/cardsfolder/mahamoti_djinn.txt delete mode 100644 res/cardsfolder/major_teroh.txt delete mode 100644 res/cardsfolder/makindi_griffin.txt delete mode 100644 res/cardsfolder/makindi_shieldmate.txt delete mode 100644 res/cardsfolder/malach_of_the_dawn.txt delete mode 100644 res/cardsfolder/malachite_golem.txt delete mode 100644 res/cardsfolder/malachite_talisman.txt delete mode 100644 res/cardsfolder/malakir_bloodwitch.txt delete mode 100644 res/cardsfolder/malevolent_awakening.txt delete mode 100644 res/cardsfolder/malicious_advice.txt delete mode 100644 res/cardsfolder/malignant_growth.txt delete mode 100644 res/cardsfolder/mammoth_umbra.txt delete mode 100644 res/cardsfolder/man_o_war.txt delete mode 100644 res/cardsfolder/mana_breach.txt delete mode 100644 res/cardsfolder/mana_crypt.txt delete mode 100644 res/cardsfolder/mana_cylix.txt delete mode 100644 res/cardsfolder/mana_drain.txt delete mode 100644 res/cardsfolder/mana_geyser.txt delete mode 100644 res/cardsfolder/mana_leak.txt delete mode 100644 res/cardsfolder/mana_matrix.txt delete mode 100644 res/cardsfolder/mana_prism.txt delete mode 100644 res/cardsfolder/mana_severance.txt delete mode 100644 res/cardsfolder/mana_short.txt delete mode 100644 res/cardsfolder/mana_tithe.txt delete mode 100644 res/cardsfolder/mana_vault.txt delete mode 100644 res/cardsfolder/mana_vortex.txt delete mode 100644 res/cardsfolder/manabarbs.txt delete mode 100644 res/cardsfolder/manabond.txt delete mode 100644 res/cardsfolder/manacles_of_decay.txt delete mode 100644 res/cardsfolder/manaforce_mace.txt delete mode 100644 res/cardsfolder/manakin.txt delete mode 100644 res/cardsfolder/manaplasm.txt delete mode 100644 res/cardsfolder/mangara_of_corondor.txt delete mode 100644 res/cardsfolder/maniacal_rage.txt delete mode 100644 res/cardsfolder/manic_vandal.txt delete mode 100644 res/cardsfolder/manipulate_fate.txt delete mode 100644 res/cardsfolder/mannichi_the_fevered_dream.txt delete mode 100644 res/cardsfolder/manta_ray.txt delete mode 100644 res/cardsfolder/manta_riders.txt delete mode 100644 res/cardsfolder/mantis_engine.txt delete mode 100644 res/cardsfolder/mantle_of_leadership.txt delete mode 100644 res/cardsfolder/marauding_knight.txt delete mode 100644 res/cardsfolder/maraxus_of_keld.txt delete mode 100644 res/cardsfolder/marble_chalice.txt delete mode 100644 res/cardsfolder/marble_diamond.txt delete mode 100644 res/cardsfolder/marble_titan.txt delete mode 100644 res/cardsfolder/march_of_souls.txt delete mode 100644 res/cardsfolder/march_of_the_machines.txt delete mode 100644 res/cardsfolder/marhault_elsdragon.txt delete mode 100644 res/cardsfolder/marisis_twinclaws.txt delete mode 100644 res/cardsfolder/maritime_guard.txt delete mode 100644 res/cardsfolder/marjhan.txt delete mode 100644 res/cardsfolder/mark_of_asylum.txt delete mode 100644 res/cardsfolder/mark_of_fury.txt delete mode 100644 res/cardsfolder/mark_of_mutiny.txt delete mode 100644 res/cardsfolder/mark_of_the_oni.txt delete mode 100644 res/cardsfolder/marker_beetles.txt delete mode 100644 res/cardsfolder/maro.txt delete mode 100644 res/cardsfolder/marrow_gnawer.txt delete mode 100644 res/cardsfolder/marrow_shards.txt delete mode 100644 res/cardsfolder/marsh_boa.txt delete mode 100644 res/cardsfolder/marsh_crocodile.txt delete mode 100644 res/cardsfolder/marsh_flats.txt delete mode 100644 res/cardsfolder/marsh_gas.txt delete mode 100644 res/cardsfolder/marsh_goblins.txt delete mode 100644 res/cardsfolder/marsh_lurker.txt delete mode 100644 res/cardsfolder/marsh_threader.txt delete mode 100644 res/cardsfolder/marsh_viper.txt delete mode 100644 res/cardsfolder/marshaling_cry.txt delete mode 100644 res/cardsfolder/marshals_anthem.txt delete mode 100644 res/cardsfolder/marshdrinker_giant.txt delete mode 100644 res/cardsfolder/martial_coup.txt delete mode 100644 res/cardsfolder/marton_stromgald.txt delete mode 100644 res/cardsfolder/martyred_rusalka.txt delete mode 100644 res/cardsfolder/martyrs_tomb.txt delete mode 100644 res/cardsfolder/masako_the_humorless.txt delete mode 100644 res/cardsfolder/mask_of_intolerance.txt delete mode 100644 res/cardsfolder/mask_of_law_and_grace.txt delete mode 100644 res/cardsfolder/mask_of_memory.txt delete mode 100644 res/cardsfolder/mask_of_riddles.txt delete mode 100644 res/cardsfolder/masked_admirers.txt delete mode 100644 res/cardsfolder/masked_gorgon.txt delete mode 100644 res/cardsfolder/mass_calcify.txt delete mode 100644 res/cardsfolder/mass_hysteria.txt delete mode 100644 res/cardsfolder/mass_of_ghouls.txt delete mode 100644 res/cardsfolder/massacre_wurm.txt delete mode 100644 res/cardsfolder/master_decoy.txt delete mode 100644 res/cardsfolder/master_healer.txt delete mode 100644 res/cardsfolder/master_of_etherium.txt delete mode 100644 res/cardsfolder/master_of_the_wild_hunt.txt delete mode 100644 res/cardsfolder/master_splicer.txt delete mode 100644 res/cardsfolder/master_transmuter.txt delete mode 100644 res/cardsfolder/masters_call.txt delete mode 100644 res/cardsfolder/masticore.txt delete mode 100644 res/cardsfolder/masumaro_first_to_live.txt delete mode 100644 res/cardsfolder/matca_rioters.txt delete mode 100644 res/cardsfolder/matsu_tribe_birdstalker.txt delete mode 100644 res/cardsfolder/matsu_tribe_sniper.txt delete mode 100644 res/cardsfolder/maul_splicer.txt delete mode 100644 res/cardsfolder/mawcor.txt delete mode 100644 res/cardsfolder/mayael_the_anima.txt delete mode 100644 res/cardsfolder/mayaels_aria.txt delete mode 100644 res/cardsfolder/maze_of_ith.txt delete mode 100644 res/cardsfolder/maze_of_shadows.txt delete mode 100644 res/cardsfolder/meadowboon.txt delete mode 100644 res/cardsfolder/meddling_mage.txt delete mode 100644 res/cardsfolder/medicine_bag.txt delete mode 100644 res/cardsfolder/meditate.txt delete mode 100644 res/cardsfolder/meekstone.txt delete mode 100644 res/cardsfolder/megatog.txt delete mode 100644 res/cardsfolder/meglonoth.txt delete mode 100644 res/cardsfolder/megrim.txt delete mode 100644 res/cardsfolder/meishin_the_mind_cage.txt delete mode 100644 res/cardsfolder/melancholy.txt delete mode 100644 res/cardsfolder/melesse_spirit.txt delete mode 100644 res/cardsfolder/meliras_keepers.txt delete mode 100644 res/cardsfolder/meloku_the_clouded_mirror.txt delete mode 100644 res/cardsfolder/melt_terrain.txt delete mode 100644 res/cardsfolder/meltdown.txt delete mode 100644 res/cardsfolder/memnarch.txt delete mode 100644 res/cardsfolder/memnite.txt delete mode 100644 res/cardsfolder/memory_erosion.txt delete mode 100644 res/cardsfolder/memory_lapse.txt delete mode 100644 res/cardsfolder/mending_hands.txt delete mode 100644 res/cardsfolder/meng_huo_barbarian_king.txt delete mode 100644 res/cardsfolder/meng_huos_horde.txt delete mode 100644 res/cardsfolder/mental_discipline.txt delete mode 100644 res/cardsfolder/mental_misstep.txt delete mode 100644 res/cardsfolder/mental_note.txt delete mode 100644 res/cardsfolder/mephidross_vampire.txt delete mode 100644 res/cardsfolder/mephitic_ooze.txt delete mode 100644 res/cardsfolder/mercenary_informer.txt delete mode 100644 res/cardsfolder/merchant_of_secrets.txt delete mode 100644 res/cardsfolder/merchant_scroll.txt delete mode 100644 res/cardsfolder/merchant_ship.txt delete mode 100644 res/cardsfolder/mercurial_kite.txt delete mode 100644 res/cardsfolder/merfolk_assassin.txt delete mode 100644 res/cardsfolder/merfolk_looter.txt delete mode 100644 res/cardsfolder/merfolk_observer.txt delete mode 100644 res/cardsfolder/merfolk_of_the_pearl_trident.txt delete mode 100644 res/cardsfolder/merfolk_seastalkers.txt delete mode 100644 res/cardsfolder/merfolk_seer.txt delete mode 100644 res/cardsfolder/merfolk_skyscout.txt delete mode 100644 res/cardsfolder/merfolk_sovereign.txt delete mode 100644 res/cardsfolder/merfolk_thaumaturgist.txt delete mode 100644 res/cardsfolder/merfolk_traders.txt delete mode 100644 res/cardsfolder/merieke_ri_berit.txt delete mode 100644 res/cardsfolder/merrow_commerce.txt delete mode 100644 res/cardsfolder/merrow_grimeblotter.txt delete mode 100644 res/cardsfolder/merrow_harbinger.txt delete mode 100644 res/cardsfolder/merrow_levitator.txt delete mode 100644 res/cardsfolder/merrow_reejerey.txt delete mode 100644 res/cardsfolder/merrow_wavebreakers.txt delete mode 100644 res/cardsfolder/merrow_witsniper.txt delete mode 100644 res/cardsfolder/mesa_enchantress.txt delete mode 100644 res/cardsfolder/mesa_falcon.txt delete mode 100644 res/cardsfolder/mesmeric_orb.txt delete mode 100644 res/cardsfolder/mesmeric_trance.txt delete mode 100644 res/cardsfolder/messenger_falcons.txt delete mode 100644 res/cardsfolder/metal_fatigue.txt delete mode 100644 res/cardsfolder/metallic_mastery.txt delete mode 100644 res/cardsfolder/metallic_sliver.txt delete mode 100644 res/cardsfolder/metallurgeon.txt delete mode 100644 res/cardsfolder/metalworker.txt delete mode 100644 res/cardsfolder/metamorphic_wurm.txt delete mode 100644 res/cardsfolder/metathran_elite.txt delete mode 100644 res/cardsfolder/metathran_soldier.txt delete mode 100644 res/cardsfolder/metathran_transport.txt delete mode 100644 res/cardsfolder/metathran_zombie.txt delete mode 100644 res/cardsfolder/meteor_crater.txt delete mode 100644 res/cardsfolder/meteor_storm.txt delete mode 100644 res/cardsfolder/midnight_banshee.txt delete mode 100644 res/cardsfolder/midnight_covenant.txt delete mode 100644 res/cardsfolder/midsummer_revel.txt delete mode 100644 res/cardsfolder/might_of_alara.txt delete mode 100644 res/cardsfolder/might_of_oaks.txt delete mode 100644 res/cardsfolder/might_of_the_masses.txt delete mode 100644 res/cardsfolder/might_sliver.txt delete mode 100644 res/cardsfolder/might_weaver.txt delete mode 100644 res/cardsfolder/mightstone.txt delete mode 100644 res/cardsfolder/mighty_emergence.txt delete mode 100644 res/cardsfolder/mighty_leap.txt delete mode 100644 res/cardsfolder/mijae_djinn.txt delete mode 100644 res/cardsfolder/mikokoro_center_of_the_sea.txt delete mode 100644 res/cardsfolder/militant_monk.txt delete mode 100644 res/cardsfolder/millikin.txt delete mode 100644 res/cardsfolder/millstone.txt delete mode 100644 res/cardsfolder/minamo_school_at_waters_edge.txt delete mode 100644 res/cardsfolder/minamo_scrollkeeper.txt delete mode 100644 res/cardsfolder/minamo_sightbender.txt delete mode 100644 res/cardsfolder/mind_burst.txt delete mode 100644 res/cardsfolder/mind_control.txt delete mode 100644 res/cardsfolder/mind_funeral.txt delete mode 100644 res/cardsfolder/mind_games.txt delete mode 100644 res/cardsfolder/mind_harness.txt delete mode 100644 res/cardsfolder/mind_knives.txt delete mode 100644 res/cardsfolder/mind_over_matter.txt delete mode 100644 res/cardsfolder/mind_peel.txt delete mode 100644 res/cardsfolder/mind_ravel.txt delete mode 100644 res/cardsfolder/mind_rot.txt delete mode 100644 res/cardsfolder/mind_shatter.txt delete mode 100644 res/cardsfolder/mind_slash.txt delete mode 100644 res/cardsfolder/mind_sludge.txt delete mode 100644 res/cardsfolder/mind_spring.txt delete mode 100644 res/cardsfolder/mind_stone.txt delete mode 100644 res/cardsfolder/mind_swords.txt delete mode 100644 res/cardsfolder/mind_twist.txt delete mode 100644 res/cardsfolder/mind_warp.txt delete mode 100644 res/cardsfolder/mindcrank.txt delete mode 100644 res/cardsfolder/mindculling.txt delete mode 100644 res/cardsfolder/mindlash_sliver.txt delete mode 100644 res/cardsfolder/mindless_automaton.txt delete mode 100644 res/cardsfolder/minds_desire.txt delete mode 100644 res/cardsfolder/minds_eye.txt delete mode 100644 res/cardsfolder/mindslicer.txt delete mode 100644 res/cardsfolder/mindstab.txt delete mode 100644 res/cardsfolder/mindstab_thrull.txt delete mode 100644 res/cardsfolder/mindwarper.txt delete mode 100644 res/cardsfolder/mindwhip_sliver.txt delete mode 100644 res/cardsfolder/mindwrack_liege.txt delete mode 100644 res/cardsfolder/mine_bearer.txt delete mode 100644 res/cardsfolder/minion_of_tevesh_szat.txt delete mode 100644 res/cardsfolder/minions_murmurs.txt delete mode 100644 res/cardsfolder/minister_of_impediments.txt delete mode 100644 res/cardsfolder/minotaur_explorer.txt delete mode 100644 res/cardsfolder/minotaur_illusionist.txt delete mode 100644 res/cardsfolder/minotaur_tactician.txt delete mode 100644 res/cardsfolder/minotaur_warrior.txt delete mode 100644 res/cardsfolder/miraculous_recovery.txt delete mode 100644 res/cardsfolder/mirari.txt delete mode 100644 res/cardsfolder/miraris_wake.txt delete mode 100644 res/cardsfolder/mire_blight.txt delete mode 100644 res/cardsfolder/mire_boa.txt delete mode 100644 res/cardsfolder/mire_kavu.txt delete mode 100644 res/cardsfolder/mire_shade.txt delete mode 100644 res/cardsfolder/miren_the_moaning_well.txt delete mode 100644 res/cardsfolder/mirozel.txt delete mode 100644 res/cardsfolder/mirran_crusader.txt delete mode 100644 res/cardsfolder/mirran_mettle.txt delete mode 100644 res/cardsfolder/mirran_spy.txt delete mode 100644 res/cardsfolder/mirri_cat_warrior.txt delete mode 100644 res/cardsfolder/mirri_the_cursed.txt delete mode 100644 res/cardsfolder/mirris_guile.txt delete mode 100644 res/cardsfolder/mirrodins_core.txt delete mode 100644 res/cardsfolder/mirror_entity.txt delete mode 100644 res/cardsfolder/mirror_gallery.txt delete mode 100644 res/cardsfolder/mirror_sigil_sergeant.txt delete mode 100644 res/cardsfolder/mirror_universe.txt delete mode 100644 res/cardsfolder/mirror_wall.txt delete mode 100644 res/cardsfolder/mirrorworks.txt delete mode 100644 res/cardsfolder/miscalculation.txt delete mode 100755 res/cardsfolder/mischievous_poltergeist.txt delete mode 100644 res/cardsfolder/misers_cage.txt delete mode 100644 res/cardsfolder/misery_charm.txt delete mode 100644 res/cardsfolder/misfortunes_gain.txt delete mode 100644 res/cardsfolder/misguided_rage.txt delete mode 100644 res/cardsfolder/mishra_artificer_prodigy.txt delete mode 100644 res/cardsfolder/mishras_factory.txt delete mode 100644 res/cardsfolder/mishras_groundbreaker.txt delete mode 100644 res/cardsfolder/mishras_helix.txt delete mode 100644 res/cardsfolder/misinformation.txt delete mode 100644 res/cardsfolder/misshapen_fiend.txt delete mode 100644 res/cardsfolder/mist_leopard.txt delete mode 100644 res/cardsfolder/mistbind_clique.txt delete mode 100644 res/cardsfolder/mistblade_shinobi.txt delete mode 100644 res/cardsfolder/mistfolk.txt delete mode 100644 res/cardsfolder/mistform_dreamer.txt delete mode 100644 res/cardsfolder/mistform_mutant.txt delete mode 100644 res/cardsfolder/mistform_shrieker.txt delete mode 100644 res/cardsfolder/mistform_skyreaver.txt delete mode 100644 res/cardsfolder/mistform_stalker.txt delete mode 100644 res/cardsfolder/mistform_ultimus.txt delete mode 100644 res/cardsfolder/mistmeadow_skulk.txt delete mode 100644 res/cardsfolder/mistral_charger.txt delete mode 100644 res/cardsfolder/mistveil_plains.txt delete mode 100644 res/cardsfolder/mistvein_borderpost.txt delete mode 100644 res/cardsfolder/misty_rainforest.txt delete mode 100644 res/cardsfolder/mitotic_manipulation.txt delete mode 100644 res/cardsfolder/mitotic_slime.txt delete mode 100644 res/cardsfolder/mnemonic_nexus.txt delete mode 100644 res/cardsfolder/mnemonic_sliver.txt delete mode 100644 res/cardsfolder/mnemonic_wall.txt delete mode 100644 res/cardsfolder/moaning_spirit.txt delete mode 100644 res/cardsfolder/moat.txt delete mode 100644 res/cardsfolder/mob_justice.txt delete mode 100644 res/cardsfolder/mobile_fort.txt delete mode 100644 res/cardsfolder/mobilization.txt delete mode 100644 res/cardsfolder/mobilize.txt delete mode 100755 res/cardsfolder/mogg_alarm.txt delete mode 100644 res/cardsfolder/mogg_fanatic.txt delete mode 100644 res/cardsfolder/mogg_hollows.txt delete mode 100644 res/cardsfolder/mogg_jailer.txt delete mode 100644 res/cardsfolder/mogg_maniac.txt delete mode 100644 res/cardsfolder/mogg_raider.txt delete mode 100644 res/cardsfolder/mogg_sentry.txt delete mode 100644 res/cardsfolder/mogg_squad.txt delete mode 100644 res/cardsfolder/mogg_war_marshal.txt delete mode 100644 res/cardsfolder/moggcatcher.txt delete mode 100644 res/cardsfolder/mold_adder.txt delete mode 100644 res/cardsfolder/mold_shambler.txt delete mode 100644 res/cardsfolder/molder_beast.txt delete mode 100644 res/cardsfolder/molder_slug.txt delete mode 100644 res/cardsfolder/moldervine_cloak.txt delete mode 100644 res/cardsfolder/molimo_maro_sorcerer.txt delete mode 100644 res/cardsfolder/molten_frame.txt delete mode 100644 res/cardsfolder/molten_hydra.txt delete mode 100644 res/cardsfolder/molten_psyche.txt delete mode 100644 res/cardsfolder/molten_rain.txt delete mode 100644 res/cardsfolder/molten_ravager.txt delete mode 100644 res/cardsfolder/molten_slagheap.txt delete mode 100644 res/cardsfolder/moltensteel_dragon.txt delete mode 100644 res/cardsfolder/molting_harpy.txt delete mode 100644 res/cardsfolder/molting_skin.txt delete mode 100644 res/cardsfolder/momentary_blink.txt delete mode 100644 res/cardsfolder/momentous_fall.txt delete mode 100644 res/cardsfolder/moments_peace.txt delete mode 100644 res/cardsfolder/momentum.txt delete mode 100644 res/cardsfolder/momir_vig_simic_visionary.txt delete mode 100644 res/cardsfolder/mongrel_pack.txt delete mode 100644 res/cardsfolder/monk_idealist.txt delete mode 100644 res/cardsfolder/monk_realist.txt delete mode 100644 res/cardsfolder/monss_goblin_raiders.txt delete mode 100644 res/cardsfolder/monstrify.txt delete mode 100644 res/cardsfolder/monstrous_carabid.txt delete mode 100644 res/cardsfolder/monstrous_growth.txt delete mode 100644 res/cardsfolder/monstrous_hound.txt delete mode 100644 res/cardsfolder/moon_sprite.txt delete mode 100644 res/cardsfolder/moonglove_changeling.txt delete mode 100644 res/cardsfolder/moonglove_extract.txt delete mode 100644 res/cardsfolder/moonglove_winnower.txt delete mode 100644 res/cardsfolder/moonlit_strider.txt delete mode 100644 res/cardsfolder/moonlit_wake.txt delete mode 100644 res/cardsfolder/moonwing_moth.txt delete mode 100644 res/cardsfolder/moor_fiend.txt delete mode 100644 res/cardsfolder/moorish_cavalry.txt delete mode 100644 res/cardsfolder/morale.txt delete mode 100644 res/cardsfolder/morbid_bloom.txt delete mode 100644 res/cardsfolder/morbid_hunger.txt delete mode 100644 res/cardsfolder/morbid_plunder.txt delete mode 100644 res/cardsfolder/mordant_dragon.txt delete mode 100644 res/cardsfolder/morgue_theft.txt delete mode 100644 res/cardsfolder/morgue_thrull.txt delete mode 100644 res/cardsfolder/morgue_toad.txt delete mode 100644 res/cardsfolder/moriok_reaver.txt delete mode 100644 res/cardsfolder/moriok_replica.txt delete mode 100644 res/cardsfolder/moriok_rigger.txt delete mode 100644 res/cardsfolder/moriok_scavenger.txt delete mode 100644 res/cardsfolder/morningtide.txt delete mode 100644 res/cardsfolder/moroii.txt delete mode 100644 res/cardsfolder/morphling.txt delete mode 100644 res/cardsfolder/morsel_theft.txt delete mode 100644 res/cardsfolder/morselhoarder.txt delete mode 100644 res/cardsfolder/mortal_combat.txt delete mode 100644 res/cardsfolder/mortal_wound.txt delete mode 100644 res/cardsfolder/mortarpod.txt delete mode 100644 res/cardsfolder/mortician_beetle.txt delete mode 100644 res/cardsfolder/mortify.txt delete mode 100644 res/cardsfolder/mortipede.txt delete mode 100644 res/cardsfolder/mortiphobia.txt delete mode 100644 res/cardsfolder/mortis_dogs.txt delete mode 100644 res/cardsfolder/mortivore.txt delete mode 100644 res/cardsfolder/mortuary.txt delete mode 100644 res/cardsfolder/mosquito_guard.txt delete mode 100644 res/cardsfolder/moss_diamond.txt delete mode 100644 res/cardsfolder/moss_kami.txt delete mode 100644 res/cardsfolder/moss_monster.txt delete mode 100644 res/cardsfolder/mossdog.txt delete mode 100644 res/cardsfolder/mossfire_egg.txt delete mode 100644 res/cardsfolder/mossfire_valley.txt delete mode 100644 res/cardsfolder/mosstodon.txt delete mode 100644 res/cardsfolder/mother_of_runes.txt delete mode 100644 res/cardsfolder/mothrider_samurai.txt delete mode 100644 res/cardsfolder/mountain.txt delete mode 100644 res/cardsfolder/mountain_bandit.txt delete mode 100644 res/cardsfolder/mountain_goat.txt delete mode 100644 res/cardsfolder/mountain_valley.txt delete mode 100644 res/cardsfolder/mountain_yeti.txt delete mode 100644 res/cardsfolder/mournful_zombie.txt delete mode 100644 res/cardsfolder/mourning.txt delete mode 100644 res/cardsfolder/mourning_thrull.txt delete mode 100644 res/cardsfolder/mournwhelk.txt delete mode 100644 res/cardsfolder/mouth_of_ronom.txt delete mode 100644 res/cardsfolder/mox_diamond.txt delete mode 100644 res/cardsfolder/mox_emerald.txt delete mode 100644 res/cardsfolder/mox_jet.txt delete mode 100644 res/cardsfolder/mox_opal.txt delete mode 100644 res/cardsfolder/mox_pearl.txt delete mode 100644 res/cardsfolder/mox_ruby.txt delete mode 100644 res/cardsfolder/mox_sapphire.txt delete mode 100644 res/cardsfolder/mtenda_griffin.txt delete mode 100644 res/cardsfolder/mtenda_herder.txt delete mode 100644 res/cardsfolder/muck_rats.txt delete mode 100644 res/cardsfolder/mudbrawler_cohort.txt delete mode 100644 res/cardsfolder/mudbrawler_raiders.txt delete mode 100644 res/cardsfolder/mudbutton_clanger.txt delete mode 100644 res/cardsfolder/mudbutton_torchrunner.txt delete mode 100644 res/cardsfolder/muddle_the_mixture.txt delete mode 100644 res/cardsfolder/mul_daya_channelers.txt delete mode 100644 res/cardsfolder/mulch.txt delete mode 100644 res/cardsfolder/mulldrifter.txt delete mode 100644 res/cardsfolder/multani_maro_sorcerer.txt delete mode 100644 res/cardsfolder/multanis_acolyte.txt delete mode 100644 res/cardsfolder/multanis_decree.txt delete mode 100644 res/cardsfolder/mungha_wurm.txt delete mode 100644 res/cardsfolder/muraganda_petroglyphs.txt delete mode 100644 res/cardsfolder/murasa_pyromancer.txt delete mode 100644 res/cardsfolder/murderous_redcap.txt delete mode 100644 res/cardsfolder/murk_dwellers.txt delete mode 100644 res/cardsfolder/murkfiend_liege.txt delete mode 100644 res/cardsfolder/murmuring_bosk.txt delete mode 100644 res/cardsfolder/muscle_burst.txt delete mode 100644 res/cardsfolder/muscle_sliver.txt delete mode 100644 res/cardsfolder/mutagenic_growth.txt delete mode 100644 res/cardsfolder/mutavault.txt delete mode 100644 res/cardsfolder/mutilate.txt delete mode 100644 res/cardsfolder/muzzle.txt delete mode 100644 res/cardsfolder/mwonvuli_acid_moss.txt delete mode 100644 res/cardsfolder/mwonvuli_ooze.txt delete mode 100644 res/cardsfolder/mycoid_shepherd.txt delete mode 100644 res/cardsfolder/mycologist.txt delete mode 100644 res/cardsfolder/mycoloth.txt delete mode 100644 res/cardsfolder/mycosynth_fiend.txt delete mode 100644 res/cardsfolder/mycosynth_golem.txt delete mode 100644 res/cardsfolder/mycosynth_wellspring.txt delete mode 100644 res/cardsfolder/myr_adapter.txt delete mode 100644 res/cardsfolder/myr_enforcer.txt delete mode 100644 res/cardsfolder/myr_galvanizer.txt delete mode 100644 res/cardsfolder/myr_landshaper.txt delete mode 100644 res/cardsfolder/myr_matrix.txt delete mode 100644 res/cardsfolder/myr_moonvessel.txt delete mode 100644 res/cardsfolder/myr_propagator.txt delete mode 100644 res/cardsfolder/myr_quadropod.txt delete mode 100644 res/cardsfolder/myr_retriever.txt delete mode 100644 res/cardsfolder/myr_sire.txt delete mode 100644 res/cardsfolder/myr_turbine.txt delete mode 100644 res/cardsfolder/myrsmith.txt delete mode 100644 res/cardsfolder/mystic_crusader.txt delete mode 100644 res/cardsfolder/mystic_denial.txt delete mode 100644 res/cardsfolder/mystic_enforcer.txt delete mode 100644 res/cardsfolder/mystic_familiar.txt delete mode 100644 res/cardsfolder/mystic_gate.txt delete mode 100644 res/cardsfolder/mystic_melting.txt delete mode 100644 res/cardsfolder/mystic_penitent.txt delete mode 100644 res/cardsfolder/mystic_restraints.txt delete mode 100644 res/cardsfolder/mystic_snake.txt delete mode 100644 res/cardsfolder/mystic_speculation.txt delete mode 100644 res/cardsfolder/mystic_visionary.txt delete mode 100644 res/cardsfolder/mystic_zealot.txt delete mode 100644 res/cardsfolder/mystical_tutor.txt delete mode 100644 res/cardsfolder/mythic_proportions.txt delete mode 100644 res/cardsfolder/nacatl_outlander.txt delete mode 100644 res/cardsfolder/nacatl_savage.txt delete mode 100644 res/cardsfolder/nacre_talisman.txt delete mode 100644 res/cardsfolder/nagao_bound_by_honor.txt delete mode 100644 res/cardsfolder/nameless_inversion.txt delete mode 100644 res/cardsfolder/nameless_one.txt delete mode 100644 res/cardsfolder/nameless_race.txt delete mode 100644 res/cardsfolder/nantuko_blightcutter.txt delete mode 100644 res/cardsfolder/nantuko_calmer.txt delete mode 100644 res/cardsfolder/nantuko_disciple.txt delete mode 100644 res/cardsfolder/nantuko_elder.txt delete mode 100644 res/cardsfolder/nantuko_husk.txt delete mode 100644 res/cardsfolder/nantuko_monastery.txt delete mode 100644 res/cardsfolder/nantuko_shade.txt delete mode 100644 res/cardsfolder/nantuko_tracer.txt delete mode 100644 res/cardsfolder/nantuko_vigilante.txt delete mode 100644 res/cardsfolder/narcissism.txt delete mode 100644 res/cardsfolder/narcolepsy.txt delete mode 100644 res/cardsfolder/narcomoeba.txt delete mode 100644 res/cardsfolder/narrow_escape.txt delete mode 100644 res/cardsfolder/narwhal.txt delete mode 100644 res/cardsfolder/nath_of_the_gilt_leaf.txt delete mode 100644 res/cardsfolder/naths_buffoon.txt delete mode 100644 res/cardsfolder/naths_elite.txt delete mode 100644 res/cardsfolder/natural_affinity.txt delete mode 100644 res/cardsfolder/natural_order.txt delete mode 100644 res/cardsfolder/natural_selection.txt delete mode 100644 res/cardsfolder/natural_spring.txt delete mode 100644 res/cardsfolder/naturalize.txt delete mode 100644 res/cardsfolder/natures_chosen.txt delete mode 100644 res/cardsfolder/natures_claim.txt delete mode 100644 res/cardsfolder/natures_cloak.txt delete mode 100644 res/cardsfolder/natures_lore.txt delete mode 100644 res/cardsfolder/natures_resurgence.txt delete mode 100644 res/cardsfolder/natures_revolt.txt delete mode 100644 res/cardsfolder/natures_ruin.txt delete mode 100644 res/cardsfolder/natures_spiral.txt delete mode 100644 res/cardsfolder/natures_wrath.txt delete mode 100644 res/cardsfolder/nausea.txt delete mode 100644 res/cardsfolder/naya_battlemage.txt delete mode 100644 res/cardsfolder/naya_hushblade.txt delete mode 100644 res/cardsfolder/naya_panorama.txt delete mode 100644 res/cardsfolder/naya_sojourners.txt delete mode 100644 res/cardsfolder/near_death_experience.txt delete mode 100644 res/cardsfolder/nebuchadnezzar.txt delete mode 100644 res/cardsfolder/neck_snap.txt delete mode 100644 res/cardsfolder/necra_disciple.txt delete mode 100644 res/cardsfolder/necratog.txt delete mode 100644 res/cardsfolder/necrite.txt delete mode 100644 res/cardsfolder/necrogen_censer.txt delete mode 100644 res/cardsfolder/necrogen_mists.txt delete mode 100644 res/cardsfolder/necrogen_scudder.txt delete mode 100644 res/cardsfolder/necrogen_spellbomb.txt delete mode 100644 res/cardsfolder/necrogenesis.txt delete mode 100644 res/cardsfolder/necromantic_thirst.txt delete mode 100644 res/cardsfolder/necropede.txt delete mode 100644 res/cardsfolder/necroplasm.txt delete mode 100644 res/cardsfolder/necropolis.txt delete mode 100644 res/cardsfolder/necropotence.txt delete mode 100644 res/cardsfolder/necropouncer.txt delete mode 100644 res/cardsfolder/necrosavant.txt delete mode 100644 res/cardsfolder/necroskitter.txt delete mode 100644 res/cardsfolder/necrotic_sliver.txt delete mode 100644 res/cardsfolder/need_for_speed.txt delete mode 100644 res/cardsfolder/needle_specter.txt delete mode 100644 res/cardsfolder/needle_storm.txt delete mode 100644 res/cardsfolder/needlebug.txt delete mode 100644 res/cardsfolder/needlepeak_spider.txt delete mode 100644 res/cardsfolder/needleshot_gourna.txt delete mode 100644 res/cardsfolder/nefashu.txt delete mode 100644 res/cardsfolder/negate.txt delete mode 100644 res/cardsfolder/nekrataal.txt delete mode 100644 res/cardsfolder/nema_siltlurker.txt delete mode 100644 res/cardsfolder/nemata_grove_guardian.txt delete mode 100644 res/cardsfolder/nemesis_mask.txt delete mode 100644 res/cardsfolder/nemesis_of_reason.txt delete mode 100644 res/cardsfolder/nessian_courser.txt delete mode 100644 res/cardsfolder/nest_invader.txt delete mode 100644 res/cardsfolder/nested_ghoul.txt delete mode 100644 res/cardsfolder/nesting_wurm.txt delete mode 100644 res/cardsfolder/nether_horror.txt delete mode 100644 res/cardsfolder/nether_spirit.txt delete mode 100644 res/cardsfolder/nether_traitor.txt delete mode 100644 res/cardsfolder/nether_void.txt delete mode 100644 res/cardsfolder/netherborn_phalanx.txt delete mode 100644 res/cardsfolder/netter_en_dal.txt delete mode 100644 res/cardsfolder/nettle_sentinel.txt delete mode 100644 res/cardsfolder/nettletooth_djinn.txt delete mode 100644 res/cardsfolder/nettling_curse.txt delete mode 100644 res/cardsfolder/neurok_commando.txt delete mode 100644 res/cardsfolder/neurok_familiar.txt delete mode 100644 res/cardsfolder/neurok_hoversail.txt delete mode 100644 res/cardsfolder/neurok_invisimancer.txt delete mode 100644 res/cardsfolder/neurok_prodigy.txt delete mode 100644 res/cardsfolder/neurok_replica.txt delete mode 100644 res/cardsfolder/neurok_spy.txt delete mode 100644 res/cardsfolder/nevermaker.txt delete mode 100644 res/cardsfolder/nevinyrrals_disk.txt delete mode 100644 res/cardsfolder/new_benalia.txt delete mode 100644 res/cardsfolder/nezumi_bone_reader.txt delete mode 100644 res/cardsfolder/nezumi_cutthroat.txt delete mode 100644 res/cardsfolder/nezumi_ronin.txt delete mode 100644 res/cardsfolder/nezumi_shadow_watcher.txt delete mode 100644 res/cardsfolder/niall_silvain.txt delete mode 100644 res/cardsfolder/nicol_bolas.txt delete mode 100644 res/cardsfolder/nicol_bolas_planeswalker.txt delete mode 100644 res/cardsfolder/night_of_souls_betrayal.txt delete mode 100644 res/cardsfolder/night_soil.txt delete mode 100644 res/cardsfolder/nightcreep.txt delete mode 100644 res/cardsfolder/nightguard_patrol.txt delete mode 100644 res/cardsfolder/nighthaze.txt delete mode 100644 res/cardsfolder/nightmare.txt delete mode 100644 res/cardsfolder/nightmare_incursion.txt delete mode 100644 res/cardsfolder/nightmare_lash.txt delete mode 100644 res/cardsfolder/nightmare_void.txt delete mode 100644 res/cardsfolder/nights_whisper.txt delete mode 100644 res/cardsfolder/nightscape_apprentice.txt delete mode 100644 res/cardsfolder/nightscape_familiar.txt delete mode 100644 res/cardsfolder/nightscape_master.txt delete mode 100644 res/cardsfolder/nightshade_schemers.txt delete mode 100644 res/cardsfolder/nightshade_stinger.txt delete mode 100644 res/cardsfolder/nightsky_mimic.txt delete mode 100644 res/cardsfolder/nightsoil_kami.txt delete mode 100644 res/cardsfolder/nightstalker_engine.txt delete mode 100644 res/cardsfolder/nightwind_glider.txt delete mode 100644 res/cardsfolder/nightwing_shade.txt delete mode 100644 res/cardsfolder/nihil_spellbomb.txt delete mode 100644 res/cardsfolder/nihilistic_glee.txt delete mode 100644 res/cardsfolder/nihilith.txt delete mode 100644 res/cardsfolder/nikko_onna.txt delete mode 100644 res/cardsfolder/nim_abomination.txt delete mode 100644 res/cardsfolder/nim_devourer.txt delete mode 100644 res/cardsfolder/nim_grotesque.txt delete mode 100644 res/cardsfolder/nim_lasher.txt delete mode 100644 res/cardsfolder/nim_replica.txt delete mode 100644 res/cardsfolder/nim_shambler.txt delete mode 100644 res/cardsfolder/nim_shrieker.txt delete mode 100644 res/cardsfolder/nimana_sell_sword.txt delete mode 100644 res/cardsfolder/nimble_mongoose.txt delete mode 100644 res/cardsfolder/nimbus_maze.txt delete mode 100644 res/cardsfolder/nimbus_wings.txt delete mode 100644 res/cardsfolder/nine_ringed_bo.txt delete mode 100644 res/cardsfolder/ninja_of_the_deep_hours.txt delete mode 100644 res/cardsfolder/nip_gwyllion.txt delete mode 100644 res/cardsfolder/nirkana_cutthroat.txt delete mode 100644 res/cardsfolder/nirkana_revenant.txt delete mode 100644 res/cardsfolder/nissa_revane.txt delete mode 100644 res/cardsfolder/nissas_chosen.txt delete mode 100644 res/cardsfolder/niv_mizzet_the_firemind.txt delete mode 100644 res/cardsfolder/niveous_wisps.txt delete mode 100644 res/cardsfolder/no_dachi.txt delete mode 100644 res/cardsfolder/no_mercy.txt delete mode 100644 res/cardsfolder/nobilis_of_war.txt delete mode 100644 res/cardsfolder/noble_benefactor.txt delete mode 100644 res/cardsfolder/noble_hierarch.txt delete mode 100644 res/cardsfolder/noble_panther.txt delete mode 100644 res/cardsfolder/noble_purpose.txt delete mode 100644 res/cardsfolder/noble_stand.txt delete mode 100644 res/cardsfolder/noble_steeds.txt delete mode 100644 res/cardsfolder/noble_templar.txt delete mode 100644 res/cardsfolder/noble_vestige.txt delete mode 100644 res/cardsfolder/nocturnal_raid.txt delete mode 100644 res/cardsfolder/noggle_bandit.txt delete mode 100644 res/cardsfolder/noggle_bridgebreaker.txt delete mode 100644 res/cardsfolder/noggle_hedge_mage.txt delete mode 100644 res/cardsfolder/noggle_ransacker.txt delete mode 100644 res/cardsfolder/nomad_stadium.txt delete mode 100644 res/cardsfolder/nomadic_elf.txt delete mode 100644 res/cardsfolder/northern_paladin.txt delete mode 100644 res/cardsfolder/norwood_archers.txt delete mode 100644 res/cardsfolder/norwood_priestess.txt delete mode 100644 res/cardsfolder/norwood_ranger.txt delete mode 100644 res/cardsfolder/norwood_riders.txt delete mode 100644 res/cardsfolder/norwood_warrior.txt delete mode 100644 res/cardsfolder/nosy_goblin.txt delete mode 100644 res/cardsfolder/notorious_assassin.txt delete mode 100644 res/cardsfolder/nourish.txt delete mode 100644 res/cardsfolder/nourishing_shoal.txt delete mode 100644 res/cardsfolder/nova_chaser.txt delete mode 100644 res/cardsfolder/nova_cleric.txt delete mode 100644 res/cardsfolder/novablast_wurm.txt delete mode 100644 res/cardsfolder/novijen_heart_of_progress.txt delete mode 100644 res/cardsfolder/noxious_field.txt delete mode 100644 res/cardsfolder/noxious_ghoul.txt delete mode 100644 res/cardsfolder/noxious_hatchling.txt delete mode 100644 res/cardsfolder/noxious_revival.txt delete mode 100644 res/cardsfolder/noxious_toad.txt delete mode 100644 res/cardsfolder/nucklavee.txt delete mode 100644 res/cardsfolder/null_brooch.txt delete mode 100644 res/cardsfolder/null_champion.txt delete mode 100644 res/cardsfolder/null_profusion.txt delete mode 100644 res/cardsfolder/null_rod.txt delete mode 100644 res/cardsfolder/nullmage_advocate.txt delete mode 100644 res/cardsfolder/nullmage_shepherd.txt delete mode 100644 res/cardsfolder/nulltread_gargantuan.txt delete mode 100755 res/cardsfolder/numai_outcast.txt delete mode 100644 res/cardsfolder/numot_the_devastator.txt delete mode 100644 res/cardsfolder/nurturer_initiate.txt delete mode 100644 res/cardsfolder/nut_collector.txt delete mode 100644 res/cardsfolder/nyxathid.txt delete mode 100644 res/cardsfolder/oaken_brawler.txt delete mode 100644 res/cardsfolder/oakenform.txt delete mode 100644 res/cardsfolder/oakgnarl_warrior.txt delete mode 100644 res/cardsfolder/oasis.txt delete mode 100644 res/cardsfolder/oath_of_druids.txt delete mode 100644 res/cardsfolder/oath_of_ghouls.txt delete mode 100644 res/cardsfolder/oathsworn_giant.txt delete mode 100644 res/cardsfolder/ob_nixilis_the_fallen.txt delete mode 100644 res/cardsfolder/obelisk_of_alara.txt delete mode 100644 res/cardsfolder/obelisk_of_bant.txt delete mode 100644 res/cardsfolder/obelisk_of_esper.txt delete mode 100644 res/cardsfolder/obelisk_of_grixis.txt delete mode 100644 res/cardsfolder/obelisk_of_jund.txt delete mode 100644 res/cardsfolder/obelisk_of_naya.txt delete mode 100644 res/cardsfolder/obelisk_of_undoing.txt delete mode 100644 res/cardsfolder/oblation.txt delete mode 100644 res/cardsfolder/obliterate.txt delete mode 100644 res/cardsfolder/oblivion_crown.txt delete mode 100644 res/cardsfolder/oblivion_ring.txt delete mode 100644 res/cardsfolder/oboro_breezecaller.txt delete mode 100644 res/cardsfolder/oboro_palace_in_the_clouds.txt delete mode 100644 res/cardsfolder/obsessive_search.txt delete mode 100644 res/cardsfolder/obsianus_golem.txt delete mode 100644 res/cardsfolder/obsidian_acolyte.txt delete mode 100644 res/cardsfolder/obsidian_fireheart.txt delete mode 100644 res/cardsfolder/obsidian_giant.txt delete mode 100644 res/cardsfolder/obstinate_baloth.txt delete mode 100644 res/cardsfolder/ocular_halo.txt delete mode 100644 res/cardsfolder/oculus.txt delete mode 100644 res/cardsfolder/odious_trow.txt delete mode 100644 res/cardsfolder/odylic_wraith.txt delete mode 100644 res/cardsfolder/off_balance.txt delete mode 100644 res/cardsfolder/offalsnout.txt delete mode 100644 res/cardsfolder/offering_to_asha.txt delete mode 100644 res/cardsfolder/ogre_arsonist.txt delete mode 100644 res/cardsfolder/ogre_berserker.txt delete mode 100644 res/cardsfolder/ogre_gatecrasher.txt delete mode 100644 res/cardsfolder/ogre_menial.txt delete mode 100644 res/cardsfolder/ogre_recluse.txt delete mode 100644 res/cardsfolder/ogre_resister.txt delete mode 100644 res/cardsfolder/ogre_sentry.txt delete mode 100644 res/cardsfolder/ogre_shaman.txt delete mode 100644 res/cardsfolder/ogre_taskmaster.txt delete mode 100644 res/cardsfolder/ogre_warrior.txt delete mode 100644 res/cardsfolder/ogres_cleaver.txt delete mode 100644 res/cardsfolder/ohran_viper.txt delete mode 100644 res/cardsfolder/okiba_gang_shinobi.txt delete mode 100644 res/cardsfolder/okina_temple_to_the_grandfathers.txt delete mode 100644 res/cardsfolder/old_ghastbark.txt delete mode 100644 res/cardsfolder/old_man_of_the_sea.txt delete mode 100644 res/cardsfolder/omega_myr.txt delete mode 100644 res/cardsfolder/omen.txt delete mode 100644 res/cardsfolder/omen_of_fire.txt delete mode 100644 res/cardsfolder/omnath_locus_of_mana.txt delete mode 100644 res/cardsfolder/omnibian.txt delete mode 100644 res/cardsfolder/ondu_cleric.txt delete mode 100644 res/cardsfolder/ondu_giant.txt delete mode 100644 res/cardsfolder/one_dozen_eyes.txt delete mode 100644 res/cardsfolder/one_with_nature.txt delete mode 100644 res/cardsfolder/one_with_nothing.txt delete mode 100644 res/cardsfolder/oni_of_wild_places.txt delete mode 100644 res/cardsfolder/onslaught.txt delete mode 100644 res/cardsfolder/onulet.txt delete mode 100644 res/cardsfolder/onyx_goblet.txt delete mode 100644 res/cardsfolder/onyx_talisman.txt delete mode 100644 res/cardsfolder/oonas_gatewarden.txt delete mode 100644 res/cardsfolder/oonas_grace.txt delete mode 100644 res/cardsfolder/ooze_garden.txt delete mode 100644 res/cardsfolder/opal_acrolith.txt delete mode 100644 res/cardsfolder/opal_archangel.txt delete mode 100644 res/cardsfolder/opal_caryatid.txt delete mode 100644 res/cardsfolder/opal_champion.txt delete mode 100644 res/cardsfolder/opal_gargoyle.txt delete mode 100644 res/cardsfolder/opal_guardian.txt delete mode 100644 res/cardsfolder/opalescence.txt delete mode 100644 res/cardsfolder/opaline_bracers.txt delete mode 100644 res/cardsfolder/ophidian.txt delete mode 100644 res/cardsfolder/ophidian_eye.txt delete mode 100644 res/cardsfolder/opportunist.txt delete mode 100644 res/cardsfolder/opportunity.txt delete mode 100644 res/cardsfolder/opposition.txt delete mode 100644 res/cardsfolder/oppression.txt delete mode 100644 res/cardsfolder/oppressive_will.txt delete mode 100644 res/cardsfolder/opt.txt delete mode 100644 res/cardsfolder/oracle_of_mul_daya.txt delete mode 100644 res/cardsfolder/oracle_of_nectars.txt delete mode 100644 res/cardsfolder/oran_rief_recluse.txt delete mode 100644 res/cardsfolder/oran_rief_survivalist.txt delete mode 100644 res/cardsfolder/oran_rief_the_vastwood.txt delete mode 100644 res/cardsfolder/oraxid.txt delete mode 100644 res/cardsfolder/orb_of_dreams.txt delete mode 100644 res/cardsfolder/orbweaver_kumo.txt delete mode 100644 res/cardsfolder/orc_general.txt delete mode 100644 res/cardsfolder/orchard_warden.txt delete mode 100644 res/cardsfolder/orcish_artillery.txt delete mode 100644 res/cardsfolder/orcish_bloodpainter.txt delete mode 100644 res/cardsfolder/orcish_cannonade.txt delete mode 100644 res/cardsfolder/orcish_cannoneers.txt delete mode 100644 res/cardsfolder/orcish_captain.txt delete mode 100644 res/cardsfolder/orcish_healer.txt delete mode 100644 res/cardsfolder/orcish_lumberjack.txt delete mode 100644 res/cardsfolder/orcish_mechanics.txt delete mode 100644 res/cardsfolder/orcish_oriflamme.txt delete mode 100644 res/cardsfolder/orcish_settlers.txt delete mode 100644 res/cardsfolder/orcish_spy.txt delete mode 100644 res/cardsfolder/orcish_veteran.txt delete mode 100644 res/cardsfolder/order_of_leitbur.txt delete mode 100644 res/cardsfolder/order_of_the_ebon_hand.txt delete mode 100644 res/cardsfolder/order_of_the_golden_cricket.txt delete mode 100644 res/cardsfolder/order_of_the_sacred_bell.txt delete mode 100644 res/cardsfolder/order_of_the_sacred_torch.txt delete mode 100644 res/cardsfolder/order_of_the_white_shield.txt delete mode 100644 res/cardsfolder/order_of_whiteclay.txt delete mode 100644 res/cardsfolder/order_of_yawgmoth.txt delete mode 100644 res/cardsfolder/ordered_migration.txt delete mode 100644 res/cardsfolder/ordruun_commando.txt delete mode 100644 res/cardsfolder/ore_gorger .txt delete mode 100644 res/cardsfolder/organ_grinder.txt delete mode 100644 res/cardsfolder/orgg.txt delete mode 100644 res/cardsfolder/origin_spellbomb.txt delete mode 100644 res/cardsfolder/orim_samite_healer.txt delete mode 100644 res/cardsfolder/orims_prayer.txt delete mode 100644 res/cardsfolder/orims_thunder.txt delete mode 100644 res/cardsfolder/ornithopter.txt delete mode 100644 res/cardsfolder/orochi_hatchery.txt delete mode 100644 res/cardsfolder/orochi_leafcaller.txt delete mode 100644 res/cardsfolder/orochi_ranger.txt delete mode 100644 res/cardsfolder/orochi_sustainer.txt delete mode 100644 res/cardsfolder/oros_the_avenger.txt delete mode 100644 res/cardsfolder/orzhov_basilica.txt delete mode 100644 res/cardsfolder/orzhov_guildmage.txt delete mode 100644 res/cardsfolder/orzhov_signet.txt delete mode 100644 res/cardsfolder/orzhova_the_church_of_deals.txt delete mode 100644 res/cardsfolder/ostiary_thrull.txt delete mode 100644 res/cardsfolder/ostracize.txt delete mode 100644 res/cardsfolder/otarian_juggernaut.txt delete mode 100644 res/cardsfolder/otherworldly_journey.txt delete mode 100644 res/cardsfolder/oubliette.txt delete mode 100644 res/cardsfolder/oust.txt delete mode 100644 res/cardsfolder/outbreak.txt delete mode 100644 res/cardsfolder/outrage_shaman.txt delete mode 100644 res/cardsfolder/outrider_of_jhess.txt delete mode 100644 res/cardsfolder/overbeing_of_myth.txt delete mode 100644 res/cardsfolder/overburden.txt delete mode 100644 res/cardsfolder/overgrown_battlement.txt delete mode 100644 res/cardsfolder/overgrown_estate.txt delete mode 100644 res/cardsfolder/overgrown_tomb.txt delete mode 100644 res/cardsfolder/overgrowth.txt delete mode 100644 res/cardsfolder/override.txt delete mode 100644 res/cardsfolder/overrule.txt delete mode 100644 res/cardsfolder/overrun.txt delete mode 100644 res/cardsfolder/oversold_cemetery.txt delete mode 100644 res/cardsfolder/oversoul_of_dusk.txt delete mode 100644 res/cardsfolder/overtaker.txt delete mode 100644 res/cardsfolder/overwhelming_forces.txt delete mode 100644 res/cardsfolder/overwhelming_intellect.txt delete mode 100644 res/cardsfolder/overwhelming_stampede.txt delete mode 100644 res/cardsfolder/owl_familiar.txt delete mode 100644 res/cardsfolder/oxidda_daredevil.txt delete mode 100644 res/cardsfolder/oxidda_golem.txt delete mode 100644 res/cardsfolder/oxidda_scrapmelter.txt delete mode 100644 res/cardsfolder/oxidize.txt delete mode 100644 res/cardsfolder/oyobi_who_split_the_heavens.txt delete mode 100644 res/cardsfolder/pacifism.txt delete mode 100644 res/cardsfolder/pact_of_negation.txt delete mode 100644 res/cardsfolder/pain_kami.txt delete mode 100644 res/cardsfolder/pain_magnification.txt delete mode 100644 res/cardsfolder/painful_memories.txt delete mode 100644 res/cardsfolder/painsmith.txt delete mode 100644 res/cardsfolder/painters_servant.txt delete mode 100644 res/cardsfolder/painwracker_oni.txt delete mode 100644 res/cardsfolder/paladin_en_vec.txt delete mode 100644 res/cardsfolder/pale_bears.txt delete mode 100644 res/cardsfolder/pale_recluse.txt delete mode 100644 res/cardsfolder/paleoloth.txt delete mode 100644 res/cardsfolder/palinchron.txt delete mode 100644 res/cardsfolder/palladia_mors.txt delete mode 100644 res/cardsfolder/palladium_myr.txt delete mode 100644 res/cardsfolder/palliation_accord.txt delete mode 100644 res/cardsfolder/pallid_mycoderm.txt delete mode 100644 res/cardsfolder/pallimud.txt delete mode 100644 res/cardsfolder/pang_tong_young_phoenix.txt delete mode 100755 res/cardsfolder/pangosaur.txt delete mode 100644 res/cardsfolder/panic.txt delete mode 100644 res/cardsfolder/panic_attack.txt delete mode 100644 res/cardsfolder/panic_spellbomb.txt delete mode 100644 res/cardsfolder/panther_warriors.txt delete mode 100644 res/cardsfolder/paperfin_rascal.txt delete mode 100644 res/cardsfolder/paradigm_shift.txt delete mode 100644 res/cardsfolder/paradise_mantle.txt delete mode 100644 res/cardsfolder/paragon_of_the_amesha.txt delete mode 100644 res/cardsfolder/parallax_dementia.txt delete mode 100644 res/cardsfolder/parallax_inhibitor.txt delete mode 100644 res/cardsfolder/parallax_tide.txt delete mode 100644 res/cardsfolder/parallax_wave.txt delete mode 100644 res/cardsfolder/parallel_evolution.txt delete mode 100644 res/cardsfolder/paralyzing_grasp.txt delete mode 100644 res/cardsfolder/parapet_watchers.txt delete mode 100644 res/cardsfolder/parasitic_bond.txt delete mode 100644 res/cardsfolder/parasitic_implant.txt delete mode 100644 res/cardsfolder/parasitic_strix.txt delete mode 100644 res/cardsfolder/parch.txt delete mode 100644 res/cardsfolder/pardic_arsonist.txt delete mode 100644 res/cardsfolder/pardic_collaborator.txt delete mode 100644 res/cardsfolder/pardic_dragon.txt delete mode 100644 res/cardsfolder/pardic_firecat.txt delete mode 100644 res/cardsfolder/pardic_lancer.txt delete mode 100644 res/cardsfolder/pardic_swordsmith.txt delete mode 100644 res/cardsfolder/part_the_veil.txt delete mode 100644 res/cardsfolder/part_water.txt delete mode 100644 res/cardsfolder/patagia_golem.txt delete mode 100644 res/cardsfolder/path_of_angers_flame.txt delete mode 100644 res/cardsfolder/path_of_peace.txt delete mode 100644 res/cardsfolder/path_to_exile.txt delete mode 100644 res/cardsfolder/patriarchs_bidding.txt delete mode 100644 res/cardsfolder/patrol_signaler.txt delete mode 100644 res/cardsfolder/patron_of_the_wild.txt delete mode 100644 res/cardsfolder/patron_wizard.txt delete mode 100644 res/cardsfolder/pattern_of_rebirth.txt delete mode 100644 res/cardsfolder/paupers_cage.txt delete mode 100644 res/cardsfolder/pavel_maliki.txt delete mode 100644 res/cardsfolder/pawn_of_ulamog.txt delete mode 100644 res/cardsfolder/peace_and_quiet.txt delete mode 100644 res/cardsfolder/peace_of_mind.txt delete mode 100644 res/cardsfolder/peace_strider.txt delete mode 100644 res/cardsfolder/peacekeeper.txt delete mode 100644 res/cardsfolder/peach_garden_oath.txt delete mode 100644 res/cardsfolder/pearl_dragon.txt delete mode 100644 res/cardsfolder/pearl_medallion.txt delete mode 100644 res/cardsfolder/pearled_unicorn.txt delete mode 100644 res/cardsfolder/peat_bog.txt delete mode 100644 res/cardsfolder/peek.txt delete mode 100644 res/cardsfolder/peel_from_reality.txt delete mode 100644 res/cardsfolder/peer_through_depths.txt delete mode 100644 res/cardsfolder/pegasus_charger.txt delete mode 100644 res/cardsfolder/pegasus_refuge.txt delete mode 100644 res/cardsfolder/pegasus_stampede.txt delete mode 100644 res/cardsfolder/pelakka_wurm.txt delete mode 100644 res/cardsfolder/pemmins_aura.txt delete mode 100644 res/cardsfolder/pendelhaven.txt delete mode 100644 res/cardsfolder/pendrell_drake.txt delete mode 100644 res/cardsfolder/pendrell_mists.txt delete mode 100644 res/cardsfolder/pennon_blade.txt delete mode 100644 res/cardsfolder/pentad_prism.txt delete mode 100644 res/cardsfolder/pentavus.txt delete mode 100644 res/cardsfolder/penumbra_bobcat.txt delete mode 100644 res/cardsfolder/penumbra_kavu.txt delete mode 100644 res/cardsfolder/penumbra_spider.txt delete mode 100644 res/cardsfolder/penumbra_wurm.txt delete mode 100644 res/cardsfolder/people_of_the_woods.txt delete mode 100644 res/cardsfolder/peppersmoke.txt delete mode 100644 res/cardsfolder/peregrine_drake.txt delete mode 100644 res/cardsfolder/peregrine_mask.txt delete mode 100644 res/cardsfolder/perilous_forays.txt delete mode 100644 res/cardsfolder/perilous_myr.txt delete mode 100644 res/cardsfolder/perilous_research.txt delete mode 100644 res/cardsfolder/perimeter_captain.txt delete mode 100644 res/cardsfolder/perish.txt delete mode 100644 res/cardsfolder/perish_the_thought.txt delete mode 100644 res/cardsfolder/pernicious_deed.txt delete mode 100644 res/cardsfolder/personal_tutor.txt delete mode 100644 res/cardsfolder/persuasion.txt delete mode 100644 res/cardsfolder/pestermite.txt delete mode 100644 res/cardsfolder/pestilence.txt delete mode 100644 res/cardsfolder/pestilence_demon.txt delete mode 100644 res/cardsfolder/pestilence_rats.txt delete mode 100644 res/cardsfolder/pestilent_kathari.txt delete mode 100644 res/cardsfolder/pestilent_souleater.txt delete mode 100644 res/cardsfolder/petradon.txt delete mode 100644 res/cardsfolder/petrahydrox.txt delete mode 100644 res/cardsfolder/petravark.txt delete mode 100644 res/cardsfolder/petrified_field.txt delete mode 100644 res/cardsfolder/pewter_golem.txt delete mode 100644 res/cardsfolder/phantasmal_abomination.txt delete mode 100644 res/cardsfolder/phantasmal_fiend.txt delete mode 100644 res/cardsfolder/phantasmal_forces.txt delete mode 100644 res/cardsfolder/phantasmal_terrain.txt delete mode 100644 res/cardsfolder/phantatog.txt delete mode 100644 res/cardsfolder/phantom_beast.txt delete mode 100644 res/cardsfolder/phantom_centaur.txt delete mode 100644 res/cardsfolder/phantom_flock.txt delete mode 100644 res/cardsfolder/phantom_monster.txt delete mode 100644 res/cardsfolder/phantom_nantuko.txt delete mode 100644 res/cardsfolder/phantom_nishoba.txt delete mode 100644 res/cardsfolder/phantom_nomad.txt delete mode 100644 res/cardsfolder/phantom_tiger.txt delete mode 100644 res/cardsfolder/phantom_warrior.txt delete mode 100644 res/cardsfolder/phantom_whelp.txt delete mode 100644 res/cardsfolder/phantom_wings.txt delete mode 100644 res/cardsfolder/phantom_wurm.txt delete mode 100644 res/cardsfolder/phelddagrif.txt delete mode 100644 res/cardsfolder/phobian_phantasm.txt delete mode 100644 res/cardsfolder/phylactery_lich.txt delete mode 100644 res/cardsfolder/phyresis.txt delete mode 100644 res/cardsfolder/phyrexian_altar.txt delete mode 100644 res/cardsfolder/phyrexian_arena.txt delete mode 100644 res/cardsfolder/phyrexian_battleflies.txt delete mode 100644 res/cardsfolder/phyrexian_bloodstock.txt delete mode 100644 res/cardsfolder/phyrexian_boon.txt delete mode 100644 res/cardsfolder/phyrexian_broodlings.txt delete mode 100644 res/cardsfolder/phyrexian_crusader.txt delete mode 100644 res/cardsfolder/phyrexian_debaser.txt delete mode 100644 res/cardsfolder/phyrexian_defiler.txt delete mode 100644 res/cardsfolder/phyrexian_delver.txt delete mode 100644 res/cardsfolder/phyrexian_denouncer.txt delete mode 100644 res/cardsfolder/phyrexian_digester.txt delete mode 100644 res/cardsfolder/phyrexian_dreadnought.txt delete mode 100644 res/cardsfolder/phyrexian_driver.txt delete mode 100644 res/cardsfolder/phyrexian_gargantua.txt delete mode 100644 res/cardsfolder/phyrexian_ghoul.txt delete mode 100644 res/cardsfolder/phyrexian_hulk.txt delete mode 100644 res/cardsfolder/phyrexian_hydra.txt delete mode 100644 res/cardsfolder/phyrexian_ingester.txt delete mode 100644 res/cardsfolder/phyrexian_ironfoot.txt delete mode 100644 res/cardsfolder/phyrexian_juggernaut.txt delete mode 100644 res/cardsfolder/phyrexian_lens.txt delete mode 100644 res/cardsfolder/phyrexian_metamorph.txt delete mode 100644 res/cardsfolder/phyrexian_monitor.txt delete mode 100644 res/cardsfolder/phyrexian_negator.txt delete mode 100644 res/cardsfolder/phyrexian_obliterator.txt delete mode 100644 res/cardsfolder/phyrexian_plaguelord.txt delete mode 100644 res/cardsfolder/phyrexian_processor.txt delete mode 100644 res/cardsfolder/phyrexian_prowler.txt delete mode 100644 res/cardsfolder/phyrexian_rager.txt delete mode 100644 res/cardsfolder/phyrexian_rebirth.txt delete mode 100644 res/cardsfolder/phyrexian_reclamation.txt delete mode 100644 res/cardsfolder/phyrexian_scuta.txt delete mode 100644 res/cardsfolder/phyrexian_snowcrusher.txt delete mode 100644 res/cardsfolder/phyrexian_swarmlord.txt delete mode 100644 res/cardsfolder/phyrexian_tower.txt delete mode 100644 res/cardsfolder/phyrexian_tribute.txt delete mode 100644 res/cardsfolder/phyrexian_tyranny.txt delete mode 100644 res/cardsfolder/phyrexian_vatmother.txt delete mode 100644 res/cardsfolder/phyrexian_vault.txt delete mode 100644 res/cardsfolder/phyrexian_walker.txt delete mode 100644 res/cardsfolder/phyrexian_war_beast.txt delete mode 100644 res/cardsfolder/phyrexias_core.txt delete mode 100644 res/cardsfolder/phytohydra.txt delete mode 100644 res/cardsfolder/pianna_nomad_captain.txt delete mode 100644 res/cardsfolder/pierce_strider.txt delete mode 100644 res/cardsfolder/piety.txt delete mode 100644 res/cardsfolder/pilgrims_eye.txt delete mode 100644 res/cardsfolder/pili_pala.txt delete mode 100644 res/cardsfolder/pillage.txt delete mode 100644 res/cardsfolder/pillaging_horde.txt delete mode 100644 res/cardsfolder/pillarfield_ox.txt delete mode 100644 res/cardsfolder/pillory_of_the_sleepless.txt delete mode 100644 res/cardsfolder/pincer_spider.txt delete mode 100644 res/cardsfolder/pincher_beetles.txt delete mode 100644 res/cardsfolder/pine_barrens.txt delete mode 100644 res/cardsfolder/pinecrest_ridge.txt delete mode 100644 res/cardsfolder/pinpoint_avalanche.txt delete mode 100644 res/cardsfolder/pipers_melody.txt delete mode 100644 res/cardsfolder/piracy_charm.txt delete mode 100644 res/cardsfolder/piranha_marsh.txt delete mode 100644 res/cardsfolder/pirate_ship.txt delete mode 100644 res/cardsfolder/piston_sledge.txt delete mode 100644 res/cardsfolder/pistus_strike.txt delete mode 100644 res/cardsfolder/pit_imp.txt delete mode 100644 res/cardsfolder/pit_keeper.txt delete mode 100644 res/cardsfolder/pit_raptor.txt delete mode 100644 res/cardsfolder/pit_scorpion.txt delete mode 100644 res/cardsfolder/pit_trap.txt delete mode 100644 res/cardsfolder/pitfall_trap.txt delete mode 100644 res/cardsfolder/pith_driller.txt delete mode 100644 res/cardsfolder/pithing_needle.txt delete mode 100644 res/cardsfolder/pixie_queen.txt delete mode 100644 res/cardsfolder/plague_beetle.txt delete mode 100644 res/cardsfolder/plague_dogs.txt delete mode 100644 res/cardsfolder/plague_fiend.txt delete mode 100644 res/cardsfolder/plague_myr.txt delete mode 100644 res/cardsfolder/plague_rats.txt delete mode 100644 res/cardsfolder/plague_spitter.txt delete mode 100644 res/cardsfolder/plague_spores.txt delete mode 100644 res/cardsfolder/plague_stinger.txt delete mode 100644 res/cardsfolder/plague_wind.txt delete mode 100644 res/cardsfolder/plague_witch.txt delete mode 100644 res/cardsfolder/plaguebearer.txt delete mode 100644 res/cardsfolder/plagued_rusalka.txt delete mode 100644 res/cardsfolder/plaguemaw_beast.txt delete mode 100644 res/cardsfolder/plains.txt delete mode 100644 res/cardsfolder/planar_birth.txt delete mode 100644 res/cardsfolder/planar_cleansing.txt delete mode 100644 res/cardsfolder/planar_collapse.txt delete mode 100644 res/cardsfolder/planar_despair.txt delete mode 100644 res/cardsfolder/planar_gate.txt delete mode 100644 res/cardsfolder/planar_guide.txt delete mode 100644 res/cardsfolder/planar_portal.txt delete mode 100644 res/cardsfolder/planar_void.txt delete mode 100644 res/cardsfolder/plasma_elemental.txt delete mode 100644 res/cardsfolder/plateau.txt delete mode 100644 res/cardsfolder/plated_geopede.txt delete mode 100644 res/cardsfolder/plated_pegasus.txt delete mode 100644 res/cardsfolder/plated_rootwalla.txt delete mode 100644 res/cardsfolder/plated_seastrider.txt delete mode 100644 res/cardsfolder/plated_slagwurm.txt delete mode 100644 res/cardsfolder/plated_sliver.txt delete mode 100644 res/cardsfolder/plated_spider.txt delete mode 100644 res/cardsfolder/plated_wurm.txt delete mode 100644 res/cardsfolder/platinum_angel.txt delete mode 100644 res/cardsfolder/platinum_emperion.txt delete mode 100644 res/cardsfolder/plover_knights.txt delete mode 100644 res/cardsfolder/plow_under.txt delete mode 100644 res/cardsfolder/plumes_of_peace.txt delete mode 100644 res/cardsfolder/plumeveil.txt delete mode 100644 res/cardsfolder/plummet.txt delete mode 100644 res/cardsfolder/plunder.txt delete mode 100644 res/cardsfolder/poison_arrow.txt delete mode 100644 res/cardsfolder/poison_the_well.txt delete mode 100644 res/cardsfolder/poisonbelly_ogre.txt delete mode 100644 res/cardsfolder/political_trickery.txt delete mode 100644 res/cardsfolder/pollen_lullaby.txt delete mode 100644 res/cardsfolder/pollenbright_wings.txt delete mode 100644 res/cardsfolder/polluted_bonds.txt delete mode 100644 res/cardsfolder/polluted_delta.txt delete mode 100644 res/cardsfolder/polluted_mire.txt delete mode 100644 res/cardsfolder/ponder.txt delete mode 100644 res/cardsfolder/pongify.txt delete mode 100644 res/cardsfolder/pooling_venom.txt delete mode 100644 res/cardsfolder/porcelain_legionnaire.txt delete mode 100644 res/cardsfolder/porphyry_nodes.txt delete mode 100644 res/cardsfolder/port_inspector.txt delete mode 100644 res/cardsfolder/portcullis.txt delete mode 100644 res/cardsfolder/portent.txt delete mode 100644 res/cardsfolder/possessed_aven.txt delete mode 100644 res/cardsfolder/possessed_barbarian.txt delete mode 100644 res/cardsfolder/possessed_centaur.txt delete mode 100644 res/cardsfolder/possessed_nomad.txt delete mode 100644 res/cardsfolder/postmortem_lunge.txt delete mode 100644 res/cardsfolder/poultice_sliver.txt delete mode 100644 res/cardsfolder/pouncing_jaguar.txt delete mode 100644 res/cardsfolder/powder_keg.txt delete mode 100644 res/cardsfolder/power_armor.txt delete mode 100644 res/cardsfolder/power_artifact.txt delete mode 100644 res/cardsfolder/power_matrix.txt delete mode 100644 res/cardsfolder/power_of_fire.txt delete mode 100644 res/cardsfolder/power_sink.txt delete mode 100644 res/cardsfolder/power_surge.txt delete mode 100644 res/cardsfolder/powerstone_minefield.txt delete mode 100644 res/cardsfolder/pradesh_gypsies.txt delete mode 100644 res/cardsfolder/praetors_counsel.txt delete mode 100644 res/cardsfolder/precognition.txt delete mode 100644 res/cardsfolder/predator_dragon.txt delete mode 100644 res/cardsfolder/predator_flagship.txt delete mode 100644 res/cardsfolder/predators_strike.txt delete mode 100644 res/cardsfolder/predatory_advantage.txt delete mode 100644 res/cardsfolder/predatory_hunger.txt delete mode 100644 res/cardsfolder/predatory_nightstalker.txt delete mode 100644 res/cardsfolder/preeminent_captain.txt delete mode 100644 res/cardsfolder/preemptive_strike.txt delete mode 100644 res/cardsfolder/preordain.txt delete mode 100644 res/cardsfolder/presence_of_gond.txt delete mode 100644 res/cardsfolder/presence_of_the_master.txt delete mode 100644 res/cardsfolder/presence_of_the_wise.txt delete mode 100755 res/cardsfolder/pretenders_claim.txt delete mode 100644 res/cardsfolder/price_of_progress.txt delete mode 100644 res/cardsfolder/prickly_boggart.txt delete mode 100644 res/cardsfolder/pride_of_the_clouds.txt delete mode 100644 res/cardsfolder/priest_of_gix.txt delete mode 100644 res/cardsfolder/priest_of_titania.txt delete mode 100644 res/cardsfolder/priest_of_urabrask.txt delete mode 100644 res/cardsfolder/priest_of_yawgmoth.txt delete mode 100644 res/cardsfolder/priests_of_norn.txt delete mode 100644 res/cardsfolder/primal_bellow.txt delete mode 100644 res/cardsfolder/primal_boost.txt delete mode 100644 res/cardsfolder/primal_clay.txt delete mode 100644 res/cardsfolder/primal_cocoon.txt delete mode 100644 res/cardsfolder/primal_frenzy.txt delete mode 100644 res/cardsfolder/primal_order.txt delete mode 100644 res/cardsfolder/primal_plasma.txt delete mode 100644 res/cardsfolder/primal_rage.txt delete mode 100644 res/cardsfolder/primal_whisperer.txt delete mode 100644 res/cardsfolder/primalcrux.txt delete mode 100644 res/cardsfolder/primeval_shambler.txt delete mode 100644 res/cardsfolder/primeval_titan.txt delete mode 100644 res/cardsfolder/primoc_escapee.txt delete mode 100644 res/cardsfolder/primordial_sage.txt delete mode 100644 res/cardsfolder/princess_lucrezia.txt delete mode 100644 res/cardsfolder/prismatic_lens.txt delete mode 100644 res/cardsfolder/prismatic_omen.txt delete mode 100644 res/cardsfolder/pristine_angel.txt delete mode 100644 res/cardsfolder/pristine_talisman.txt delete mode 100644 res/cardsfolder/privileged_position.txt delete mode 100644 res/cardsfolder/prized_unicorn.txt delete mode 100644 res/cardsfolder/proclamation_of_rebirth.txt delete mode 100644 res/cardsfolder/prodigal_pyromancer.txt delete mode 100644 res/cardsfolder/prodigal_sorcerer.txt delete mode 100644 res/cardsfolder/profane_command.txt delete mode 100644 res/cardsfolder/profane_prayers.txt delete mode 100644 res/cardsfolder/progenitus.txt delete mode 100644 res/cardsfolder/promise_of_power.txt delete mode 100644 res/cardsfolder/promised_kannushi.txt delete mode 100644 res/cardsfolder/propaganda.txt delete mode 100644 res/cardsfolder/proper_burial.txt delete mode 100644 res/cardsfolder/prophetic_bolt.txt delete mode 100644 res/cardsfolder/prophetic_prism.txt delete mode 100644 res/cardsfolder/prosperity.txt delete mode 100644 res/cardsfolder/protective_bubble.txt delete mode 100644 res/cardsfolder/protomatter_powder.txt delete mode 100644 res/cardsfolder/prototype_portal.txt delete mode 100644 res/cardsfolder/provoke.txt delete mode 100644 res/cardsfolder/prowess_of_the_fair.txt delete mode 100644 res/cardsfolder/prowling_nightstalker.txt delete mode 100644 res/cardsfolder/psionic_blast.txt delete mode 100644 res/cardsfolder/psionic_entity.txt delete mode 100644 res/cardsfolder/psionic_gift.txt delete mode 100644 res/cardsfolder/psionic_sliver.txt delete mode 100644 res/cardsfolder/psychatog.txt delete mode 100644 res/cardsfolder/psychic_barrier.txt delete mode 100644 res/cardsfolder/psychic_drain.txt delete mode 100644 res/cardsfolder/psychic_membrane.txt delete mode 100644 res/cardsfolder/psychic_purge.txt delete mode 100644 res/cardsfolder/psychic_spear.txt delete mode 100644 res/cardsfolder/psychic_surgery.txt delete mode 100644 res/cardsfolder/psychic_venom.txt delete mode 100644 res/cardsfolder/psychosis_crawler.txt delete mode 100644 res/cardsfolder/psychotic_fury.txt delete mode 100644 res/cardsfolder/psychotic_haze.txt delete mode 100644 res/cardsfolder/psychotrope_thallid.txt delete mode 100644 res/cardsfolder/pteron_ghost.txt delete mode 100755 res/cardsfolder/puffer_extract.txt delete mode 100644 res/cardsfolder/pull_under.txt delete mode 100644 res/cardsfolder/pulling_teeth.txt delete mode 100644 res/cardsfolder/pulsating_illusion.txt delete mode 100644 res/cardsfolder/pulse_of_the_tangle.txt delete mode 100644 res/cardsfolder/pulse_tracker.txt delete mode 100644 res/cardsfolder/pulsemage_advocate.txt delete mode 100644 res/cardsfolder/pulverize.txt delete mode 100644 res/cardsfolder/puncture_blast.txt delete mode 100644 res/cardsfolder/puncture_bolt.txt delete mode 100644 res/cardsfolder/puncturing_light.txt delete mode 100644 res/cardsfolder/punish_ignorance.txt delete mode 100644 res/cardsfolder/punishing_fire.txt delete mode 100644 res/cardsfolder/puppet_conjurer.txt delete mode 100644 res/cardsfolder/puppet_strings.txt delete mode 100644 res/cardsfolder/puppeteer.txt delete mode 100644 res/cardsfolder/puppeteer_clique.txt delete mode 100644 res/cardsfolder/purge.txt delete mode 100644 res/cardsfolder/purify.txt delete mode 100644 res/cardsfolder/purity.txt delete mode 100644 res/cardsfolder/purraj_of_urborg.txt delete mode 100644 res/cardsfolder/pus_kami.txt delete mode 100644 res/cardsfolder/put_away.txt delete mode 100755 res/cardsfolder/putrefaction.txt delete mode 100644 res/cardsfolder/putrefax.txt delete mode 100644 res/cardsfolder/putrefy.txt delete mode 100644 res/cardsfolder/putrid_imp.txt delete mode 100644 res/cardsfolder/putrid_leech.txt delete mode 100644 res/cardsfolder/putrid_raptor.txt delete mode 100644 res/cardsfolder/pygmy_allosaurus.txt delete mode 100644 res/cardsfolder/pygmy_kavu.txt delete mode 100644 res/cardsfolder/pygmy_pyrosaur.txt delete mode 100644 res/cardsfolder/pygmy_razorback.txt delete mode 100644 res/cardsfolder/pygmy_troll.txt delete mode 100644 res/cardsfolder/pyknite.txt delete mode 100644 res/cardsfolder/pyre_charger.txt delete mode 100644 res/cardsfolder/pyre_zombie.txt delete mode 100644 res/cardsfolder/pyretic_ritual.txt delete mode 100644 res/cardsfolder/pyric_salamander.txt delete mode 100644 res/cardsfolder/pyrite_spellbomb.txt delete mode 100644 res/cardsfolder/pyroclasm.txt delete mode 100644 res/cardsfolder/pyroclast_consul.txt delete mode 100644 res/cardsfolder/pyrohemia.txt delete mode 100644 res/cardsfolder/pyrokinesis.txt delete mode 100644 res/cardsfolder/pyromancy.txt delete mode 100644 res/cardsfolder/pyromania.txt delete mode 100644 res/cardsfolder/pyromatics.txt delete mode 100644 res/cardsfolder/pyrostatic_pillar.txt delete mode 100644 res/cardsfolder/pyrotechnics.txt delete mode 100644 res/cardsfolder/python.txt delete mode 100644 res/cardsfolder/qasali_pridemage.txt delete mode 100644 res/cardsfolder/quag_sickness.txt delete mode 100644 res/cardsfolder/quag_vampires.txt delete mode 100644 res/cardsfolder/quagmire.txt delete mode 100644 res/cardsfolder/quagmire_druid.txt delete mode 100644 res/cardsfolder/quagmire_lamprey.txt delete mode 100644 res/cardsfolder/quagnoth.txt delete mode 100644 res/cardsfolder/quest_for_ancient_secrets.txt delete mode 100644 res/cardsfolder/quest_for_renewal.txt delete mode 100644 res/cardsfolder/quest_for_the_gemblades.txt delete mode 100644 res/cardsfolder/quest_for_the_goblin_lord.txt delete mode 100644 res/cardsfolder/quest_for_the_gravelord.txt delete mode 100644 res/cardsfolder/quest_for_the_nihil_stone.txt delete mode 100644 res/cardsfolder/questing_phelddagrif.txt delete mode 100644 res/cardsfolder/quick_sliver.txt delete mode 100644 res/cardsfolder/quicksand.txt delete mode 100644 res/cardsfolder/quicksilver_amulet.txt delete mode 100644 res/cardsfolder/quicksilver_behemoth.txt delete mode 100644 res/cardsfolder/quicksilver_dagger.txt delete mode 100644 res/cardsfolder/quicksilver_gargantuan.txt delete mode 100644 res/cardsfolder/quicksilver_geyser.txt delete mode 100644 res/cardsfolder/quicksilver_wall.txt delete mode 100644 res/cardsfolder/quiet_purity.txt delete mode 100644 res/cardsfolder/quietus_spike.txt delete mode 100644 res/cardsfolder/quill_slinger_boggart.txt delete mode 100644 res/cardsfolder/quilled_slagwurm.txt delete mode 100644 res/cardsfolder/quilled_sliver.txt delete mode 100644 res/cardsfolder/quirion_druid.txt delete mode 100644 res/cardsfolder/quirion_dryad.txt delete mode 100644 res/cardsfolder/quirion_explorer.txt delete mode 100644 res/cardsfolder/quirion_ranger.txt delete mode 100644 res/cardsfolder/quirion_trailblazer.txt delete mode 100644 res/cardsfolder/qumulox.txt delete mode 100644 res/cardsfolder/rabble_rouser.txt delete mode 100644 res/cardsfolder/rabid_elephant.txt delete mode 100644 res/cardsfolder/rabid_rats.txt delete mode 100644 res/cardsfolder/rabid_wolverines.txt delete mode 100644 res/cardsfolder/rabid_wombat.txt delete mode 100644 res/cardsfolder/rack_and_ruin.txt delete mode 100644 res/cardsfolder/rackling.txt delete mode 100644 res/cardsfolder/radha_heir_to_keld.txt delete mode 100644 res/cardsfolder/radiant_archangel.txt delete mode 100644 res/cardsfolder/radiant_essence.txt delete mode 100644 res/cardsfolder/radiants_dragoons.txt delete mode 100644 res/cardsfolder/radiants_judgment.txt delete mode 100644 res/cardsfolder/radjan_spirit.txt delete mode 100644 res/cardsfolder/rafiq_of_the_many.txt delete mode 100644 res/cardsfolder/ragamuffyn.txt delete mode 100644 res/cardsfolder/rage_extractor.txt delete mode 100644 res/cardsfolder/rage_nimbus.txt delete mode 100644 res/cardsfolder/rage_reflection.txt delete mode 100644 res/cardsfolder/rage_weaver.txt delete mode 100644 res/cardsfolder/ragged_veins.txt delete mode 100644 res/cardsfolder/raging_bull.txt delete mode 100644 res/cardsfolder/raging_cougar.txt delete mode 100644 res/cardsfolder/raging_goblin.txt delete mode 100644 res/cardsfolder/raging_gorilla.txt delete mode 100644 res/cardsfolder/raging_kavu.txt delete mode 100644 res/cardsfolder/raging_minotaur.txt delete mode 100644 res/cardsfolder/raging_ravine.txt delete mode 100644 res/cardsfolder/ragnar.txt delete mode 100644 res/cardsfolder/raid_bombardment.txt delete mode 100644 res/cardsfolder/raiding_nightstalker.txt delete mode 100644 res/cardsfolder/rain_of_blades.txt delete mode 100644 res/cardsfolder/rain_of_embers.txt delete mode 100644 res/cardsfolder/rain_of_salt.txt delete mode 100644 res/cardsfolder/rain_of_tears.txt delete mode 100644 res/cardsfolder/rainbow_vale.txt delete mode 100644 res/cardsfolder/raise_dead.txt delete mode 100644 res/cardsfolder/raise_the_alarm.txt delete mode 100644 res/cardsfolder/raka_disciple.txt delete mode 100644 res/cardsfolder/rakdos_augermage.txt delete mode 100644 res/cardsfolder/rakdos_carnarium.txt delete mode 100644 res/cardsfolder/rakdos_guildmage.txt delete mode 100644 res/cardsfolder/rakdos_ickspitter.txt delete mode 100644 res/cardsfolder/rakdos_pit_dragon.txt delete mode 100644 res/cardsfolder/rakdos_signet.txt delete mode 100644 res/cardsfolder/rakdos_the_defiler.txt delete mode 100644 res/cardsfolder/rakeclaw_gargantuan.txt delete mode 100644 res/cardsfolder/raking_canopy.txt delete mode 100644 res/cardsfolder/rakka_mar.txt delete mode 100644 res/cardsfolder/raksha_golden_cub.txt delete mode 100644 res/cardsfolder/rally.txt delete mode 100644 res/cardsfolder/rally_the_forces.txt delete mode 100644 res/cardsfolder/ramirez_depietro.txt delete mode 100644 res/cardsfolder/ramosian_captain.txt delete mode 100644 res/cardsfolder/ramosian_commander.txt delete mode 100644 res/cardsfolder/ramosian_lieutenant.txt delete mode 100755 res/cardsfolder/ramosian_rally.txt delete mode 100644 res/cardsfolder/ramosian_revivalist.txt delete mode 100644 res/cardsfolder/ramosian_sergeant.txt delete mode 100644 res/cardsfolder/ramosian_sky_marshal.txt delete mode 100644 res/cardsfolder/rampaging_baloths.txt delete mode 100644 res/cardsfolder/rampant_growth.txt delete mode 100644 res/cardsfolder/rampart_crawler.txt delete mode 100644 res/cardsfolder/ramses_overdark.txt delete mode 100644 res/cardsfolder/rancor.txt delete mode 100644 res/cardsfolder/ranger_en_vec.txt delete mode 100644 res/cardsfolder/ranger_of_eos.txt delete mode 100644 res/cardsfolder/rank_and_file.txt delete mode 100644 res/cardsfolder/ransack.txt delete mode 100644 res/cardsfolder/rapacious_one.txt delete mode 100644 res/cardsfolder/rappelling_scouts.txt delete mode 100644 res/cardsfolder/rashida_scalebane.txt delete mode 100644 res/cardsfolder/rashka_the_slayer.txt delete mode 100644 res/cardsfolder/ratcatcher.txt delete mode 100644 res/cardsfolder/ratchet_bomb.txt delete mode 100644 res/cardsfolder/rathi_assassin.txt delete mode 100644 res/cardsfolder/rathi_fiend.txt delete mode 100644 res/cardsfolder/rathi_intimidator.txt delete mode 100644 res/cardsfolder/rathi_trapper.txt delete mode 100644 res/cardsfolder/raths_edge.txt delete mode 100644 res/cardsfolder/rats_of_rath.txt delete mode 100644 res/cardsfolder/rattleblaze_scarecrow.txt delete mode 100644 res/cardsfolder/ravaged_highlands.txt delete mode 100644 res/cardsfolder/ravages_of_war.txt delete mode 100644 res/cardsfolder/ravaging_horde.txt delete mode 100644 res/cardsfolder/ravaging_riftwurm.txt delete mode 100644 res/cardsfolder/raven_familiar.txt delete mode 100644 res/cardsfolder/raven_guild_initiate.txt delete mode 100644 res/cardsfolder/raven_guild_master.txt delete mode 100644 res/cardsfolder/ravenous_baboons.txt delete mode 100644 res/cardsfolder/ravenous_baloth.txt delete mode 100644 res/cardsfolder/ravenous_rats.txt delete mode 100644 res/cardsfolder/ravenous_skirge.txt delete mode 100644 res/cardsfolder/ravens_crime.txt delete mode 100644 res/cardsfolder/ravens_run_dragoon.txt delete mode 100644 res/cardsfolder/raving_oni_slave.txt delete mode 100644 res/cardsfolder/ray_of_command.txt delete mode 100644 res/cardsfolder/ray_of_distortion.txt delete mode 100644 res/cardsfolder/ray_of_erasure.txt delete mode 100644 res/cardsfolder/ray_of_revelation.txt delete mode 100644 res/cardsfolder/raze.txt delete mode 100644 res/cardsfolder/razing_snidd.txt delete mode 100644 res/cardsfolder/razor_golem.txt delete mode 100644 res/cardsfolder/razor_hippogriff.txt delete mode 100644 res/cardsfolder/razor_pendulum.txt delete mode 100644 res/cardsfolder/razor_swine.txt delete mode 100644 res/cardsfolder/razorclaw_bear.txt delete mode 100644 res/cardsfolder/razorfield_rhino.txt delete mode 100644 res/cardsfolder/razorfield_thresher.txt delete mode 100644 res/cardsfolder/razorfin_hunter.txt delete mode 100644 res/cardsfolder/razorfoot_griffin.txt delete mode 100644 res/cardsfolder/razorgrass_screen.txt delete mode 100644 res/cardsfolder/razorjaw_oni.txt delete mode 100644 res/cardsfolder/razortooth_rats.txt delete mode 100644 res/cardsfolder/razorverge_thicket.txt delete mode 100644 res/cardsfolder/reach_of_branches.txt delete mode 100644 res/cardsfolder/reach_through_mists.txt delete mode 100644 res/cardsfolder/reality_spasm.txt delete mode 100644 res/cardsfolder/reality_strobe.txt delete mode 100644 res/cardsfolder/reanimate.txt delete mode 100644 res/cardsfolder/reap_and_sow.txt delete mode 100644 res/cardsfolder/reaper_king.txt delete mode 100644 res/cardsfolder/reaper_of_sheoldred.txt delete mode 100644 res/cardsfolder/reaping_the_graves.txt delete mode 100644 res/cardsfolder/reaping_the_rewards.txt delete mode 100644 res/cardsfolder/reassembling_skeleton.txt delete mode 100644 res/cardsfolder/rebel_informer.txt delete mode 100644 res/cardsfolder/rebellion_of_the_flamekin.txt delete mode 100644 res/cardsfolder/reborn_hope.txt delete mode 100644 res/cardsfolder/rebuff_the_wicked.txt delete mode 100644 res/cardsfolder/rebuild.txt delete mode 100644 res/cardsfolder/rebuking_ceremony.txt delete mode 100644 res/cardsfolder/recall.txt delete mode 100644 res/cardsfolder/recantation.txt delete mode 100644 res/cardsfolder/reciprocate.txt delete mode 100644 res/cardsfolder/reckless_abandon.txt delete mode 100644 res/cardsfolder/reckless_assault.txt delete mode 100644 res/cardsfolder/reckless_charge.txt delete mode 100644 res/cardsfolder/reckless_embermage.txt delete mode 100644 res/cardsfolder/reckless_ogre.txt delete mode 100644 res/cardsfolder/reckless_one.txt delete mode 100644 res/cardsfolder/reckless_scholar.txt delete mode 100644 res/cardsfolder/reckless_spite.txt delete mode 100644 res/cardsfolder/reckless_wurm.txt delete mode 100644 res/cardsfolder/reclaim.txt delete mode 100644 res/cardsfolder/reclusive_wight.txt delete mode 100644 res/cardsfolder/recoil.txt delete mode 100644 res/cardsfolder/recollect.txt delete mode 100644 res/cardsfolder/reconstruction.txt delete mode 100644 res/cardsfolder/recover.txt delete mode 100644 res/cardsfolder/recumbent_bliss.txt delete mode 100644 res/cardsfolder/recuperate.txt delete mode 100644 res/cardsfolder/recurring_nightmare.txt delete mode 100644 res/cardsfolder/recycle.txt delete mode 100644 res/cardsfolder/red_cliffs_armada.txt delete mode 100644 res/cardsfolder/red_elemental_blast.txt delete mode 100644 res/cardsfolder/red_mana_battery.txt delete mode 100644 res/cardsfolder/red_scarab.txt delete mode 100644 res/cardsfolder/red_suns_zenith.txt delete mode 100644 res/cardsfolder/red_ward.txt delete mode 100644 res/cardsfolder/redeem.txt delete mode 100644 res/cardsfolder/reduce_to_dreams.txt delete mode 100644 res/cardsfolder/redwood_treefolk.txt delete mode 100644 res/cardsfolder/reef_pirates.txt delete mode 100644 res/cardsfolder/reflecting_pool.txt delete mode 100644 res/cardsfolder/reflex_sliver.txt delete mode 100644 res/cardsfolder/reflexes.txt delete mode 100644 res/cardsfolder/refresh.txt delete mode 100644 res/cardsfolder/regal_force.txt delete mode 100644 res/cardsfolder/regal_unicorn.txt delete mode 100644 res/cardsfolder/regenerate.txt delete mode 100644 res/cardsfolder/regeneration.txt delete mode 100644 res/cardsfolder/regress.txt delete mode 100644 res/cardsfolder/regrowth.txt delete mode 100644 res/cardsfolder/reign_of_chaos.txt delete mode 100644 res/cardsfolder/reinforced_bulwark.txt delete mode 100644 res/cardsfolder/reinforcements.txt delete mode 100644 res/cardsfolder/reiterate.txt delete mode 100644 res/cardsfolder/reito_lantern.txt delete mode 100644 res/cardsfolder/rejuvenate.txt delete mode 100644 res/cardsfolder/rejuvenation_chamber.txt delete mode 100644 res/cardsfolder/reki_the_history_of_kamigawa.txt delete mode 100644 res/cardsfolder/rekindled_flame.txt delete mode 100644 res/cardsfolder/reknit.txt delete mode 100644 res/cardsfolder/relearn.txt delete mode 100644 res/cardsfolder/release_the_ants.txt delete mode 100644 res/cardsfolder/relentless_rats.txt delete mode 100644 res/cardsfolder/relic_barrier.txt delete mode 100644 res/cardsfolder/relic_crush.txt delete mode 100644 res/cardsfolder/relic_of_progenitus.txt delete mode 100644 res/cardsfolder/relic_putrescence.txt delete mode 100644 res/cardsfolder/reliquary_monk.txt delete mode 100644 res/cardsfolder/reliquary_tower.txt delete mode 100644 res/cardsfolder/remand.txt delete mode 100644 res/cardsfolder/reminisce.txt delete mode 100644 res/cardsfolder/remote_farm.txt delete mode 100644 res/cardsfolder/remote_isle.txt delete mode 100644 res/cardsfolder/remove.txt delete mode 100644 res/cardsfolder/remove_enchantments.txt delete mode 100644 res/cardsfolder/remove_soul.txt delete mode 100644 res/cardsfolder/rend_flesh.txt delete mode 100644 res/cardsfolder/rend_spirit.txt delete mode 100644 res/cardsfolder/rendclaw_trow.txt delete mode 100644 res/cardsfolder/renegade_troops.txt delete mode 100644 res/cardsfolder/renewal.txt delete mode 100644 res/cardsfolder/renewed_faith.txt delete mode 100644 res/cardsfolder/renewing_dawn.txt delete mode 100644 res/cardsfolder/renewing_touch.txt delete mode 100644 res/cardsfolder/reparations.txt delete mode 100644 res/cardsfolder/repay_in_kind.txt delete mode 100644 res/cardsfolder/repeal.txt delete mode 100644 res/cardsfolder/repel.txt delete mode 100644 res/cardsfolder/repel_the_darkness.txt delete mode 100644 res/cardsfolder/repentance.txt delete mode 100644 res/cardsfolder/repentant_blacksmith.txt delete mode 100644 res/cardsfolder/repentant_vampire.txt delete mode 100644 res/cardsfolder/repercussion.txt delete mode 100644 res/cardsfolder/repopulate.txt delete mode 100644 res/cardsfolder/reprisal.txt delete mode 100644 res/cardsfolder/repulse.txt delete mode 100644 res/cardsfolder/rescind.txt delete mode 100644 res/cardsfolder/rescue.txt delete mode 100644 res/cardsfolder/research_the_deep.txt delete mode 100644 res/cardsfolder/reset.txt delete mode 100644 res/cardsfolder/resilient_wanderer.txt delete mode 100644 res/cardsfolder/resistance_fighter.txt delete mode 100644 res/cardsfolder/resize.txt delete mode 100644 res/cardsfolder/resounding_roar.txt delete mode 100644 res/cardsfolder/resounding_scream.txt delete mode 100644 res/cardsfolder/resounding_silence.txt delete mode 100644 res/cardsfolder/resounding_thunder.txt delete mode 100644 res/cardsfolder/resounding_wave.txt delete mode 100644 res/cardsfolder/respite.txt delete mode 100644 res/cardsfolder/resplendent_mentor.txt delete mode 100644 res/cardsfolder/restless_apparition.txt delete mode 100644 res/cardsfolder/restless_bones.txt delete mode 100644 res/cardsfolder/restless_dead.txt delete mode 100644 res/cardsfolder/resurrection.txt delete mode 100644 res/cardsfolder/resuscitate.txt delete mode 100644 res/cardsfolder/retaliate.txt delete mode 100644 res/cardsfolder/retract.txt delete mode 100644 res/cardsfolder/retribution_of_the_meek.txt delete mode 100644 res/cardsfolder/retromancer.txt delete mode 100644 res/cardsfolder/return_to_battle.txt delete mode 100644 res/cardsfolder/return_to_dust.txt delete mode 100644 res/cardsfolder/reveillark.txt delete mode 100644 res/cardsfolder/reveille_squad.txt delete mode 100644 res/cardsfolder/reveka_wizard_savant.txt delete mode 100644 res/cardsfolder/revelsong_horn.txt delete mode 100644 res/cardsfolder/revenant.txt delete mode 100644 res/cardsfolder/reverberate.txt delete mode 100644 res/cardsfolder/revered_dead.txt delete mode 100644 res/cardsfolder/reverence.txt delete mode 100644 res/cardsfolder/revive.txt delete mode 100644 res/cardsfolder/revive_the_fallen.txt delete mode 100644 res/cardsfolder/reviving_dose.txt delete mode 100644 res/cardsfolder/revoke_existence.txt delete mode 100644 res/cardsfolder/reward_the_faithful.txt delete mode 100644 res/cardsfolder/rewind.txt delete mode 100644 res/cardsfolder/reya_dawnbringer.txt delete mode 100644 res/cardsfolder/rhox_bodyguard.txt delete mode 100644 res/cardsfolder/rhox_brute.txt delete mode 100644 res/cardsfolder/rhox_charger.txt delete mode 100644 res/cardsfolder/rhox_meditant.txt delete mode 100644 res/cardsfolder/rhox_pikemaster.txt delete mode 100644 res/cardsfolder/rhox_war_monk.txt delete mode 100644 res/cardsfolder/rhys_the_exiled.txt delete mode 100644 res/cardsfolder/rhys_the_redeemed.txt delete mode 100644 res/cardsfolder/rhystic_deluge.txt delete mode 100644 res/cardsfolder/rhystic_study.txt delete mode 100644 res/cardsfolder/rib_cage_spider.txt delete mode 100644 res/cardsfolder/ribbons_of_the_reikai.txt delete mode 100644 res/cardsfolder/riddlesmith.txt delete mode 100644 res/cardsfolder/ridge_rannet.txt delete mode 100644 res/cardsfolder/ridged_kusite.txt delete mode 100644 res/cardsfolder/ridgeline_rager.txt delete mode 100644 res/cardsfolder/ridgetop_raptor.txt delete mode 100644 res/cardsfolder/riding_red_hare.txt delete mode 100644 res/cardsfolder/riding_the_dilu_horse.txt delete mode 100644 res/cardsfolder/rift_bolt.txt delete mode 100644 res/cardsfolder/riftwing_cloudskate.txt delete mode 100644 res/cardsfolder/righteous_avengers.txt delete mode 100644 res/cardsfolder/righteous_cause.txt delete mode 100644 res/cardsfolder/righteous_charge.txt delete mode 100644 res/cardsfolder/righteous_fury.txt delete mode 100644 res/cardsfolder/righteous_war.txt delete mode 100644 res/cardsfolder/righteousness.txt delete mode 100644 res/cardsfolder/rime_dryad.txt delete mode 100644 res/cardsfolder/rimebound_dead.txt delete mode 100644 res/cardsfolder/rimescale_dragon.txt delete mode 100644 res/cardsfolder/rimewind_cryomancer.txt delete mode 100644 res/cardsfolder/rimewind_taskmage.txt delete mode 100644 res/cardsfolder/ring_of_gix.txt delete mode 100644 res/cardsfolder/ring_of_immortals.txt delete mode 100644 res/cardsfolder/ring_of_renewal.txt delete mode 100644 res/cardsfolder/ringskipper.txt delete mode 100644 res/cardsfolder/riot_spikes.txt delete mode 100644 res/cardsfolder/rip_clan_crasher.txt delete mode 100644 res/cardsfolder/riptide.txt delete mode 100644 res/cardsfolder/riptide_biologist.txt delete mode 100644 res/cardsfolder/riptide_crab.txt delete mode 100644 res/cardsfolder/riptide_director.txt delete mode 100644 res/cardsfolder/riptide_laboratory.txt delete mode 100644 res/cardsfolder/riptide_pilferer.txt delete mode 100644 res/cardsfolder/riptide_survivor.txt delete mode 100644 res/cardsfolder/rise_from_the_grave.txt delete mode 100644 res/cardsfolder/rise_of_the_hobgoblins.txt delete mode 100644 res/cardsfolder/rishadan_airship.txt delete mode 100644 res/cardsfolder/rishadan_brigand.txt delete mode 100644 res/cardsfolder/rishadan_cutpurse.txt delete mode 100644 res/cardsfolder/rishadan_footpad.txt delete mode 100644 res/cardsfolder/rishadan_pawnshop.txt delete mode 100644 res/cardsfolder/rishadan_port.txt delete mode 100644 res/cardsfolder/rite_of_flame.txt delete mode 100644 res/cardsfolder/rite_of_passage.txt delete mode 100644 res/cardsfolder/rite_of_replication.txt delete mode 100644 res/cardsfolder/rites_of_flourishing.txt delete mode 100644 res/cardsfolder/rith_the_awakener.txt delete mode 100644 res/cardsfolder/riths_attendant.txt delete mode 100644 res/cardsfolder/riths_grove.txt delete mode 100644 res/cardsfolder/ritual_of_restoration.txt delete mode 100644 res/cardsfolder/ritual_of_steel.txt delete mode 100644 res/cardsfolder/ritual_of_the_machine.txt delete mode 100644 res/cardsfolder/riven_turnbull.txt delete mode 100644 res/cardsfolder/river_bear.txt delete mode 100644 res/cardsfolder/river_boa.txt delete mode 100644 res/cardsfolder/river_delta.txt delete mode 100644 res/cardsfolder/river_kaijin.txt delete mode 100644 res/cardsfolder/river_merfolk.txt delete mode 100644 res/cardsfolder/riverfall_mimic.txt delete mode 100644 res/cardsfolder/rix_maadi_dungeon_palace.txt delete mode 100644 res/cardsfolder/roar_of_reclamation.txt delete mode 100644 res/cardsfolder/roar_of_the_wurm.txt delete mode 100644 res/cardsfolder/roaring_slagwurm.txt delete mode 100644 res/cardsfolder/robber_fly.txt delete mode 100644 res/cardsfolder/robe_of_mirrors.txt delete mode 100644 res/cardsfolder/roc_egg.txt delete mode 100644 res/cardsfolder/roc_hatchling.txt delete mode 100644 res/cardsfolder/roc_of_kher_ridges.txt delete mode 100644 res/cardsfolder/rock_badger.txt delete mode 100644 res/cardsfolder/rock_basilisk.txt delete mode 100644 res/cardsfolder/rockcaster_platoon.txt delete mode 100644 res/cardsfolder/rockshard_elemental.txt delete mode 100644 res/cardsfolder/rockslide_ambush.txt delete mode 100644 res/cardsfolder/rockslide_elemental.txt delete mode 100644 res/cardsfolder/rocky_tar_pit.txt delete mode 100644 res/cardsfolder/rod_of_ruin.txt delete mode 100644 res/cardsfolder/rofellos_llanowar_emissary.txt delete mode 100644 res/cardsfolder/rogue_kavu.txt delete mode 100755 res/cardsfolder/roil_elemental.txt delete mode 100644 res/cardsfolder/roiling_terrain.txt delete mode 100644 res/cardsfolder/rolling_earthquake.txt delete mode 100644 res/cardsfolder/rolling_stones.txt delete mode 100644 res/cardsfolder/ronin_cavekeeper.txt delete mode 100644 res/cardsfolder/ronin_cliffrider.txt delete mode 100644 res/cardsfolder/ronin_houndmaster.txt delete mode 100644 res/cardsfolder/ronom_hulk.txt delete mode 100644 res/cardsfolder/ronom_unicorn.txt delete mode 100644 res/cardsfolder/roofstalker_wight.txt delete mode 100644 res/cardsfolder/root_cage.txt delete mode 100644 res/cardsfolder/root_elemental.txt delete mode 100644 res/cardsfolder/root_maze.txt delete mode 100644 res/cardsfolder/root_sliver.txt delete mode 100644 res/cardsfolder/root_spider.txt delete mode 100644 res/cardsfolder/rootbound_crag.txt delete mode 100644 res/cardsfolder/rootbreaker_wurm.txt delete mode 100644 res/cardsfolder/rootgrapple.txt delete mode 100644 res/cardsfolder/rootrunner.txt delete mode 100644 res/cardsfolder/roots.txt delete mode 100644 res/cardsfolder/rootwalla.txt delete mode 100644 res/cardsfolder/rootwater_alligator.txt delete mode 100644 res/cardsfolder/rootwater_commando.txt delete mode 100644 res/cardsfolder/rootwater_depths.txt delete mode 100644 res/cardsfolder/rootwater_diver.txt delete mode 100644 res/cardsfolder/rootwater_hunter.txt delete mode 100644 res/cardsfolder/rootwater_mystic.txt delete mode 100644 res/cardsfolder/rootwater_thief.txt delete mode 100644 res/cardsfolder/rorix_bladewing.txt delete mode 100644 res/cardsfolder/rot_wolf.txt delete mode 100644 res/cardsfolder/roterothopter.txt delete mode 100644 res/cardsfolder/rotlung_reanimator.txt delete mode 100644 res/cardsfolder/rotted_hystrix.txt delete mode 100644 res/cardsfolder/rotting_legion.txt delete mode 100644 res/cardsfolder/rotting_rats.txt delete mode 100644 res/cardsfolder/roughshod_mentor.txt delete mode 100644 res/cardsfolder/rouse.txt delete mode 100644 res/cardsfolder/rowan_treefolk.txt delete mode 100644 res/cardsfolder/royal_assassin.txt delete mode 100644 res/cardsfolder/royal_decree.txt delete mode 100644 res/cardsfolder/royal_falcon.txt delete mode 100644 res/cardsfolder/royal_herbalist.txt delete mode 100644 res/cardsfolder/royal_trooper.txt delete mode 100644 res/cardsfolder/rubinia_soulsinger.txt delete mode 100644 res/cardsfolder/ruby_leech.txt delete mode 100644 res/cardsfolder/ruby_medallion.txt delete mode 100644 res/cardsfolder/rugged_prairie.txt delete mode 100644 res/cardsfolder/ruin_ghost.txt delete mode 100644 res/cardsfolder/ruination.txt delete mode 100644 res/cardsfolder/ruinous_minotaur.txt delete mode 100644 res/cardsfolder/ruins_of_trokair.txt delete mode 100644 res/cardsfolder/rukh_egg.txt delete mode 100644 res/cardsfolder/rumbling_crescendo.txt delete mode 100644 res/cardsfolder/rumbling_slum.txt delete mode 100644 res/cardsfolder/rummaging_wizard.txt delete mode 100644 res/cardsfolder/rune_cervin_rider.txt delete mode 100644 res/cardsfolder/runeboggle.txt delete mode 100644 res/cardsfolder/runeclaw_bear.txt delete mode 100644 res/cardsfolder/runed_arch.txt delete mode 100644 res/cardsfolder/runed_servitor.txt delete mode 100644 res/cardsfolder/runed_stalactite.txt delete mode 100644 res/cardsfolder/runes_of_the_deus.txt delete mode 100644 res/cardsfolder/rupture.txt delete mode 100644 res/cardsfolder/rush_of_knowledge.txt delete mode 100644 res/cardsfolder/rushwood_dryad.txt delete mode 100644 res/cardsfolder/rushwood_elemental.txt delete mode 100644 res/cardsfolder/rushwood_herbalist.txt delete mode 100644 res/cardsfolder/rusted_slasher.txt delete mode 100644 res/cardsfolder/rustic_clachan.txt delete mode 100644 res/cardsfolder/rusting_golem.txt delete mode 100644 res/cardsfolder/rustrazor_butcher.txt delete mode 100644 res/cardsfolder/rustspore_ram.txt delete mode 100644 res/cardsfolder/ruthless_cullblade.txt delete mode 100644 res/cardsfolder/ruthless_invasion.txt delete mode 100644 res/cardsfolder/ryusei_the_falling_star.txt delete mode 100644 res/cardsfolder/saber_ants.txt delete mode 100644 res/cardsfolder/saberclaw_golem.txt delete mode 100644 res/cardsfolder/sabertooth_alley_cat.txt delete mode 100644 res/cardsfolder/sabertooth_nishoba.txt delete mode 100644 res/cardsfolder/sabertooth_wyvern.txt delete mode 100644 res/cardsfolder/sabretooth_tiger.txt delete mode 100644 res/cardsfolder/sacellum_archers.txt delete mode 100644 res/cardsfolder/sachi_daughter_of_seshiro.txt delete mode 100644 res/cardsfolder/sacred_foundry.txt delete mode 100644 res/cardsfolder/sacred_knight.txt delete mode 100644 res/cardsfolder/sacred_nectar.txt delete mode 100644 res/cardsfolder/sacred_prey.txt delete mode 100644 res/cardsfolder/sacred_wolf.txt delete mode 100644 res/cardsfolder/sacrifice.txt delete mode 100644 res/cardsfolder/sadistic_augermage.txt delete mode 100644 res/cardsfolder/sadistic_glee.txt delete mode 100644 res/cardsfolder/sadistic_hypnotist.txt delete mode 100644 res/cardsfolder/safehold_duo.txt delete mode 100644 res/cardsfolder/safehold_elite.txt delete mode 100644 res/cardsfolder/safehold_sentry.txt delete mode 100644 res/cardsfolder/safewright_quest.txt delete mode 100644 res/cardsfolder/sage_aven.txt delete mode 100644 res/cardsfolder/sage_of_epityr.txt delete mode 100644 res/cardsfolder/sage_of_lat_nam.txt delete mode 100644 res/cardsfolder/sage_owl.txt delete mode 100644 res/cardsfolder/sages_dousing.txt delete mode 100644 res/cardsfolder/sages_knowledge.txt delete mode 100644 res/cardsfolder/sailmonger.txt delete mode 100644 res/cardsfolder/sakura_tribe_elder.txt delete mode 100644 res/cardsfolder/sakura_tribe_scout.txt delete mode 100644 res/cardsfolder/salt_flats.txt delete mode 100644 res/cardsfolder/salt_marsh.txt delete mode 100644 res/cardsfolder/saltblast.txt delete mode 100644 res/cardsfolder/saltcrusted_steppe.txt delete mode 100644 res/cardsfolder/saltfield_recluse.txt delete mode 100644 res/cardsfolder/salvage.txt delete mode 100644 res/cardsfolder/salvage_scout.txt delete mode 100644 res/cardsfolder/salvage_slasher.txt delete mode 100644 res/cardsfolder/salvage_titan.txt delete mode 100644 res/cardsfolder/samite_archer.txt delete mode 100644 res/cardsfolder/samite_healer.txt delete mode 100644 res/cardsfolder/samurai_enforcers.txt delete mode 100644 res/cardsfolder/sanctimony.txt delete mode 100644 res/cardsfolder/sanctum_custodian.txt delete mode 100644 res/cardsfolder/sanctum_gargoyle.txt delete mode 100644 res/cardsfolder/sanctum_plowbeast.txt delete mode 100644 res/cardsfolder/sand_silos.txt delete mode 100644 res/cardsfolder/sandbar_merfolk.txt delete mode 100644 res/cardsfolder/sandbar_serpent.txt delete mode 100644 res/cardsfolder/sandskin.txt delete mode 100644 res/cardsfolder/sandsower.txt delete mode 100644 res/cardsfolder/sandstone_needle.txt delete mode 100644 res/cardsfolder/sandstone_warrior.txt delete mode 100644 res/cardsfolder/sandstorm.txt delete mode 100644 res/cardsfolder/sandstorm_eidolon.txt delete mode 100644 res/cardsfolder/sangrite_backlash.txt delete mode 100644 res/cardsfolder/sangrite_surge.txt delete mode 100644 res/cardsfolder/sangromancer.txt delete mode 100644 res/cardsfolder/sangrophage.txt delete mode 100644 res/cardsfolder/sanguine_bond.txt delete mode 100644 res/cardsfolder/sanguine_guard.txt delete mode 100644 res/cardsfolder/sanguine_praetor.txt delete mode 100644 res/cardsfolder/sanity_gnawers.txt delete mode 100644 res/cardsfolder/sanity_grinding.txt delete mode 100644 res/cardsfolder/sapling_of_colfenor.txt delete mode 100644 res/cardsfolder/sapphire_leech.txt delete mode 100644 res/cardsfolder/sapphire_medallion.txt delete mode 100644 res/cardsfolder/saprazzan_bailiff.txt delete mode 100644 res/cardsfolder/saprazzan_heir.txt delete mode 100644 res/cardsfolder/saprazzan_raider.txt delete mode 100644 res/cardsfolder/saprazzan_skerry.txt delete mode 100644 res/cardsfolder/sapseep_forest.txt delete mode 100644 res/cardsfolder/sarcatog.txt delete mode 100644 res/cardsfolder/sarcomancy.txt delete mode 100644 res/cardsfolder/sarcomite_myr.txt delete mode 100644 res/cardsfolder/sarkhan_the_mad.txt delete mode 100644 res/cardsfolder/sarkhan_vol.txt delete mode 100644 res/cardsfolder/sarpadian_empires_vol_vii.txt delete mode 100644 res/cardsfolder/savage_conception.txt delete mode 100644 res/cardsfolder/savage_firecat.txt delete mode 100644 res/cardsfolder/savage_gorilla.txt delete mode 100644 res/cardsfolder/savage_hunger.txt delete mode 100644 res/cardsfolder/savage_lands.txt delete mode 100644 res/cardsfolder/savage_silhouette.txt delete mode 100644 res/cardsfolder/savage_thallid.txt delete mode 100644 res/cardsfolder/savage_twister.txt delete mode 100644 res/cardsfolder/savannah.txt delete mode 100644 res/cardsfolder/savannah_lions.txt delete mode 100644 res/cardsfolder/savra_queen_of_the_golgari.txt delete mode 100644 res/cardsfolder/sawback_manticore.txt delete mode 100644 res/cardsfolder/sawtooth_loon.txt delete mode 100644 res/cardsfolder/sawtooth_thresher.txt delete mode 100644 res/cardsfolder/scab_clan_mauler.txt delete mode 100644 res/cardsfolder/scabland.txt delete mode 100644 res/cardsfolder/scald.txt delete mode 100644 res/cardsfolder/scalding_salamander.txt delete mode 100644 res/cardsfolder/scalding_tarn.txt delete mode 100644 res/cardsfolder/scale_of_chiss_goria.txt delete mode 100644 res/cardsfolder/scalebanes_elite.txt delete mode 100644 res/cardsfolder/scaled_hulk.txt delete mode 100644 res/cardsfolder/scaled_wurm.txt delete mode 100644 res/cardsfolder/scalpelexis.txt delete mode 100755 res/cardsfolder/scandalmonger.txt delete mode 100644 res/cardsfolder/scapegoat.txt delete mode 100644 res/cardsfolder/scar.txt delete mode 100644 res/cardsfolder/scarblade_elite.txt delete mode 100644 res/cardsfolder/scare_tactics.txt delete mode 100644 res/cardsfolder/scarecrone.txt delete mode 100644 res/cardsfolder/scarland_thrinax.txt delete mode 100644 res/cardsfolder/scarred_vinebreeder.txt delete mode 100644 res/cardsfolder/scarscale_ritual.txt delete mode 100644 res/cardsfolder/scarwood_bandits.txt delete mode 100644 res/cardsfolder/scarwood_goblins.txt delete mode 100644 res/cardsfolder/scarwood_hag.txt delete mode 100644 res/cardsfolder/scarwood_treefolk.txt delete mode 100644 res/cardsfolder/scathe_zombies.txt delete mode 100644 res/cardsfolder/scattershot.txt delete mode 100644 res/cardsfolder/scattershot_archer.txt delete mode 100644 res/cardsfolder/scavenged_weaponry.txt delete mode 100644 res/cardsfolder/scavenger_drake.txt delete mode 100644 res/cardsfolder/scavenger_folk.txt delete mode 100644 res/cardsfolder/scavenging_ghoul.txt delete mode 100644 res/cardsfolder/scavenging_scarab.txt delete mode 100644 res/cardsfolder/scepter_of_dominance.txt delete mode 100644 res/cardsfolder/scepter_of_fugue.txt delete mode 100644 res/cardsfolder/scepter_of_insight.txt delete mode 100644 res/cardsfolder/school_of_piranha.txt delete mode 100644 res/cardsfolder/school_of_the_unseen.txt delete mode 100644 res/cardsfolder/scion_of_darkness.txt delete mode 100644 res/cardsfolder/scion_of_oona.txt delete mode 100644 res/cardsfolder/scion_of_the_wild.txt delete mode 100644 res/cardsfolder/scorched_ruins.txt delete mode 100644 res/cardsfolder/scorched_rusalka.txt delete mode 100644 res/cardsfolder/scorching_missile.txt delete mode 100644 res/cardsfolder/scorching_spear.txt delete mode 100644 res/cardsfolder/scorching_winds.txt delete mode 100644 res/cardsfolder/scoria_cat.txt delete mode 100644 res/cardsfolder/scoria_elemental.txt delete mode 100644 res/cardsfolder/scoria_wurm.txt delete mode 100644 res/cardsfolder/scornful_aether_lich.txt delete mode 100644 res/cardsfolder/scornful_egotist.txt delete mode 100644 res/cardsfolder/scourge_devil.txt delete mode 100644 res/cardsfolder/scourge_of_kher_ridges.txt delete mode 100644 res/cardsfolder/scourge_of_numai.txt delete mode 100644 res/cardsfolder/scourge_of_the_nobilis.txt delete mode 100644 res/cardsfolder/scourge_servant.txt delete mode 100644 res/cardsfolder/scourglass.txt delete mode 100644 res/cardsfolder/scragnoth.txt delete mode 100644 res/cardsfolder/scrap.txt delete mode 100644 res/cardsfolder/scrapbasket.txt delete mode 100644 res/cardsfolder/scrapdiver_serpent.txt delete mode 100644 res/cardsfolder/scrapheap.txt delete mode 100644 res/cardsfolder/scrapyard_salvo.txt delete mode 100644 res/cardsfolder/screaming_fury.txt delete mode 100644 res/cardsfolder/screaming_seahawk.txt delete mode 100644 res/cardsfolder/screams_of_the_damned.txt delete mode 100644 res/cardsfolder/screeching_buzzard.txt delete mode 100644 res/cardsfolder/screeching_drake.txt delete mode 100644 res/cardsfolder/screeching_harpy.txt delete mode 100644 res/cardsfolder/screeching_silcaw.txt delete mode 100644 res/cardsfolder/screeching_sliver.txt delete mode 100644 res/cardsfolder/scrivener.txt delete mode 100644 res/cardsfolder/scroll_rack.txt delete mode 100644 res/cardsfolder/scroll_thief.txt delete mode 100644 res/cardsfolder/scrubland.txt delete mode 100644 res/cardsfolder/scryb_ranger.txt delete mode 100644 res/cardsfolder/scryb_sprites.txt delete mode 100644 res/cardsfolder/scrying_sheets.txt delete mode 100644 res/cardsfolder/sculpting_steel.txt delete mode 100644 res/cardsfolder/scute_mob.txt delete mode 100644 res/cardsfolder/scuttling_death.txt delete mode 100644 res/cardsfolder/scuzzback_marauders.txt delete mode 100644 res/cardsfolder/scuzzback_scrapper.txt delete mode 100644 res/cardsfolder/sea_drake.txt delete mode 100644 res/cardsfolder/sea_eagle.txt delete mode 100644 res/cardsfolder/sea_gate_loremaster.txt delete mode 100644 res/cardsfolder/sea_gate_oracle.txt delete mode 100644 res/cardsfolder/sea_kings_blessing.txt delete mode 100644 res/cardsfolder/sea_monster.txt delete mode 100644 res/cardsfolder/sea_scryer.txt delete mode 100644 res/cardsfolder/sea_serpent.txt delete mode 100644 res/cardsfolder/sea_spirit.txt delete mode 100644 res/cardsfolder/sea_sprite.txt delete mode 100644 res/cardsfolder/seachrome_coast.txt delete mode 100644 res/cardsfolder/seafloor_debris.txt delete mode 100644 res/cardsfolder/seahunter.txt delete mode 100644 res/cardsfolder/seal_of_cleansing.txt delete mode 100644 res/cardsfolder/seal_of_doom.txt delete mode 100644 res/cardsfolder/seal_of_fire.txt delete mode 100644 res/cardsfolder/seal_of_primordium.txt delete mode 100644 res/cardsfolder/seal_of_removal.txt delete mode 100644 res/cardsfolder/seal_of_strength.txt delete mode 100644 res/cardsfolder/search_for_tomorrow.txt delete mode 100644 res/cardsfolder/searing_flesh.txt delete mode 100644 res/cardsfolder/searing_meditation.txt delete mode 100644 res/cardsfolder/searing_touch.txt delete mode 100644 res/cardsfolder/searing_wind.txt delete mode 100644 res/cardsfolder/seas_claim.txt delete mode 100644 res/cardsfolder/seascape_aerialist.txt delete mode 100644 res/cardsfolder/seashell_cameo.txt delete mode 100644 res/cardsfolder/seaside_citadel.txt delete mode 100644 res/cardsfolder/seaside_haven.txt delete mode 100644 res/cardsfolder/seasinger.txt delete mode 100644 res/cardsfolder/seasoned_marshal.txt delete mode 100644 res/cardsfolder/seat_of_the_synod.txt delete mode 100644 res/cardsfolder/secluded_glen.txt delete mode 100644 res/cardsfolder/secluded_steppe.txt delete mode 100644 res/cardsfolder/second_chance.txt delete mode 100644 res/cardsfolder/second_sight.txt delete mode 100644 res/cardsfolder/second_thoughts.txt delete mode 100644 res/cardsfolder/second_wind.txt delete mode 100755 res/cardsfolder/security_detail.txt delete mode 100644 res/cardsfolder/sedge_troll.txt delete mode 100644 res/cardsfolder/sedraxis_alchemist.txt delete mode 100644 res/cardsfolder/sedraxis_specter.txt delete mode 100644 res/cardsfolder/see_beyond.txt delete mode 100644 res/cardsfolder/seed_the_land.txt delete mode 100644 res/cardsfolder/seedborn_muse.txt delete mode 100644 res/cardsfolder/seedcradle_witch.txt delete mode 100644 res/cardsfolder/seedguide_ash.txt delete mode 100644 res/cardsfolder/seeds_of_strength.txt delete mode 100644 res/cardsfolder/seek_the_horizon.txt delete mode 100644 res/cardsfolder/seeker.txt delete mode 100644 res/cardsfolder/seeker_of_skybreak.txt delete mode 100644 res/cardsfolder/seers_sundial.txt delete mode 100644 res/cardsfolder/seething_anger.txt delete mode 100644 res/cardsfolder/seething_pathblazer.txt delete mode 100644 res/cardsfolder/seething_song.txt delete mode 100644 res/cardsfolder/segmented_wurm.txt delete mode 100644 res/cardsfolder/segovian_leviathan.txt delete mode 100644 res/cardsfolder/seismic_assault.txt delete mode 100644 res/cardsfolder/seismic_mage.txt delete mode 100644 res/cardsfolder/seismic_shudder.txt delete mode 100644 res/cardsfolder/seismic_spike.txt delete mode 100644 res/cardsfolder/seismic_strike.txt delete mode 100644 res/cardsfolder/seizan_perverter_of_truth.txt delete mode 100644 res/cardsfolder/seize_the_initiative.txt delete mode 100644 res/cardsfolder/seizures.txt delete mode 100644 res/cardsfolder/sejiri_merfolk.txt delete mode 100644 res/cardsfolder/sejiri_refuge.txt delete mode 100644 res/cardsfolder/sejiri_steppe.txt delete mode 100644 res/cardsfolder/sekkuar_deathkeeper.txt delete mode 100644 res/cardsfolder/selenia_dark_angel.txt delete mode 100644 res/cardsfolder/selesnya_evangel.txt delete mode 100644 res/cardsfolder/selesnya_guildmage.txt delete mode 100644 res/cardsfolder/selesnya_sanctuary.txt delete mode 100644 res/cardsfolder/selesnya_signet.txt delete mode 100644 res/cardsfolder/selfless_exorcist.txt delete mode 100644 res/cardsfolder/selkie_hedge_mage.txt delete mode 100644 res/cardsfolder/sell_sword_brute.txt delete mode 100644 res/cardsfolder/sengir_autocrat.txt delete mode 100644 res/cardsfolder/sengir_bats.txt delete mode 100644 res/cardsfolder/sengir_vampire.txt delete mode 100644 res/cardsfolder/sensation_gorger.txt delete mode 100644 res/cardsfolder/sensei_golden_tail.txt delete mode 100644 res/cardsfolder/senseis_divining_top.txt delete mode 100644 res/cardsfolder/sensor_splicer.txt delete mode 100644 res/cardsfolder/sentinels_of_glen_elendra.txt delete mode 100644 res/cardsfolder/septic_rats.txt delete mode 100644 res/cardsfolder/serendib_efreet.txt delete mode 100644 res/cardsfolder/serendib_sorcerer.txt delete mode 100644 res/cardsfolder/serene_heart.txt delete mode 100644 res/cardsfolder/serene_offering.txt delete mode 100644 res/cardsfolder/serene_sunset.txt delete mode 100644 res/cardsfolder/serenity.txt delete mode 100644 res/cardsfolder/serpent_assassin.txt delete mode 100644 res/cardsfolder/serpent_generator.txt delete mode 100644 res/cardsfolder/serpent_of_the_endless_sea.txt delete mode 100644 res/cardsfolder/serpent_skin.txt delete mode 100644 res/cardsfolder/serpent_warrior.txt delete mode 100644 res/cardsfolder/serpentine_basilisk.txt delete mode 100644 res/cardsfolder/serpentine_kavu.txt delete mode 100644 res/cardsfolder/serra_advocate.txt delete mode 100644 res/cardsfolder/serra_angel.txt delete mode 100644 res/cardsfolder/serra_ascendant.txt delete mode 100644 res/cardsfolder/serra_avatar.txt delete mode 100644 res/cardsfolder/serra_avenger.txt delete mode 100644 res/cardsfolder/serra_aviary.txt delete mode 100644 res/cardsfolder/serra_inquisitors.txt delete mode 100644 res/cardsfolder/serra_sphinx.txt delete mode 100644 res/cardsfolder/serra_zealot.txt delete mode 100644 res/cardsfolder/serras_blessing.txt delete mode 100644 res/cardsfolder/serras_boon.txt delete mode 100644 res/cardsfolder/serras_embrace.txt delete mode 100644 res/cardsfolder/serras_liturgy.txt delete mode 100644 res/cardsfolder/serras_sanctum.txt delete mode 100644 res/cardsfolder/serrated_arrows.txt delete mode 100644 res/cardsfolder/serrated_biskelion.txt delete mode 100644 res/cardsfolder/serum_raker.txt delete mode 100644 res/cardsfolder/serum_tank.txt delete mode 100644 res/cardsfolder/serum_visions.txt delete mode 100644 res/cardsfolder/servant_of_volrath.txt delete mode 100644 res/cardsfolder/seshiro_the_anointed.txt delete mode 100644 res/cardsfolder/seton_krosan_protector.txt delete mode 100644 res/cardsfolder/setons_desire.txt delete mode 100644 res/cardsfolder/setons_scout.txt delete mode 100644 res/cardsfolder/sever_soul.txt delete mode 100644 res/cardsfolder/severed_legion.txt delete mode 100644 res/cardsfolder/sewer_rats.txt delete mode 100644 res/cardsfolder/sewerdreg.txt delete mode 100644 res/cardsfolder/sewn_eye_drake.txt delete mode 100644 res/cardsfolder/shackles.txt delete mode 100644 res/cardsfolder/shade_of_trokair.txt delete mode 100644 res/cardsfolder/shades_form.txt delete mode 100644 res/cardsfolder/shadow_guildmage.txt delete mode 100644 res/cardsfolder/shadow_lance.txt delete mode 100644 res/cardsfolder/shadow_rider.txt delete mode 100644 res/cardsfolder/shadow_rift.txt delete mode 100644 res/cardsfolder/shadow_sliver.txt delete mode 100644 res/cardsfolder/shadowblood_egg.txt delete mode 100644 res/cardsfolder/shadowblood_ridge.txt delete mode 100644 res/cardsfolder/shadowfeed.txt delete mode 100644 res/cardsfolder/shadowmage_infiltrator.txt delete mode 100644 res/cardsfolder/shadowstorm.txt delete mode 100644 res/cardsfolder/shaleskin_bruiser.txt delete mode 100644 res/cardsfolder/shaleskin_plower.txt delete mode 100644 res/cardsfolder/shambling_remains.txt delete mode 100644 res/cardsfolder/shambling_shell.txt delete mode 100644 res/cardsfolder/shambling_strider.txt delete mode 100644 res/cardsfolder/shanodin_dryads.txt delete mode 100644 res/cardsfolder/shaper_guildmage.txt delete mode 100644 res/cardsfolder/shapeshifter.txt delete mode 100644 res/cardsfolder/shard_convergence.txt delete mode 100644 res/cardsfolder/shard_phoenix.txt delete mode 100644 res/cardsfolder/shard_volley.txt delete mode 100644 res/cardsfolder/sharding_sphinx.txt delete mode 100644 res/cardsfolder/shared_discovery.txt delete mode 100644 res/cardsfolder/shared_triumph.txt delete mode 100644 res/cardsfolder/sharuum_the_hegemon.txt delete mode 100644 res/cardsfolder/shatter.txt delete mode 100644 res/cardsfolder/shattered_angel.txt delete mode 100644 res/cardsfolder/shattered_crypt.txt delete mode 100644 res/cardsfolder/shattered_dreams.txt delete mode 100644 res/cardsfolder/shattering_pulse.txt delete mode 100644 res/cardsfolder/shattering_spree.txt delete mode 100644 res/cardsfolder/shatterskull_giant.txt delete mode 100644 res/cardsfolder/shatterstorm.txt delete mode 100644 res/cardsfolder/shauku_endbringer.txt delete mode 100644 res/cardsfolder/shaukus_minion.txt delete mode 100644 res/cardsfolder/shell_skulkin.txt delete mode 100644 res/cardsfolder/sheltered_valley.txt delete mode 100644 res/cardsfolder/sheltering_prayers.txt delete mode 100644 res/cardsfolder/sheoldred_whispering_one.txt delete mode 100644 res/cardsfolder/shepherd_of_rot.txt delete mode 100644 res/cardsfolder/shepherd_of_the_lost.txt delete mode 100644 res/cardsfolder/shield_mate.txt delete mode 100644 res/cardsfolder/shield_of_duty_and_reason.txt delete mode 100644 res/cardsfolder/shield_of_kaldra.txt delete mode 100644 res/cardsfolder/shield_of_the_ages.txt delete mode 100644 res/cardsfolder/shield_of_the_oversoul.txt delete mode 100644 res/cardsfolder/shield_sphere.txt delete mode 100644 res/cardsfolder/shield_wall.txt delete mode 100644 res/cardsfolder/shielding_plax.txt delete mode 100644 res/cardsfolder/shieldmates_blessing.txt delete mode 100644 res/cardsfolder/shifting_sliver.txt delete mode 100644 res/cardsfolder/shifting_wall.txt delete mode 100644 res/cardsfolder/shimmer_myr.txt delete mode 100644 res/cardsfolder/shimmering_barrier.txt delete mode 100644 res/cardsfolder/shimmering_grotto.txt delete mode 100644 res/cardsfolder/shimmering_wings.txt delete mode 100644 res/cardsfolder/shinen_of_fears_chill.txt delete mode 100644 res/cardsfolder/shinen_of_lifes_roar.txt delete mode 100644 res/cardsfolder/shinen_of_stars_light.txt delete mode 100644 res/cardsfolder/shinka_gatekeeper.txt delete mode 100644 res/cardsfolder/shinka_the_bloodsoaked_keep.txt delete mode 100644 res/cardsfolder/shivan_dragon.txt delete mode 100644 res/cardsfolder/shivan_emissary.txt delete mode 100644 res/cardsfolder/shivan_gorge.txt delete mode 100644 res/cardsfolder/shivan_harvest.txt delete mode 100644 res/cardsfolder/shivan_hellkite.txt delete mode 100644 res/cardsfolder/shivan_meteor.txt delete mode 100644 res/cardsfolder/shivan_oasis.txt delete mode 100644 res/cardsfolder/shivan_phoenix.txt delete mode 100644 res/cardsfolder/shivan_raptor.txt delete mode 100644 res/cardsfolder/shivan_reef.txt delete mode 100644 res/cardsfolder/shivan_wurm.txt delete mode 100644 res/cardsfolder/shivan_zombie.txt delete mode 100644 res/cardsfolder/shivs_embrace.txt delete mode 100644 res/cardsfolder/shizo_deaths_storehouse.txt delete mode 100644 res/cardsfolder/shock.txt delete mode 100644 res/cardsfolder/shock_troops.txt delete mode 100644 res/cardsfolder/shore_snapper.txt delete mode 100644 res/cardsfolder/shorecrasher_mimic.txt delete mode 100644 res/cardsfolder/shoreline_raider.txt delete mode 100644 res/cardsfolder/shoreline_ranger.txt delete mode 100644 res/cardsfolder/shoreline_salvager.txt delete mode 100644 res/cardsfolder/show_and_tell.txt delete mode 100644 res/cardsfolder/shower_of_sparks.txt delete mode 100644 res/cardsfolder/shrapnel_blast.txt delete mode 100644 res/cardsfolder/shriek_of_dread.txt delete mode 100644 res/cardsfolder/shriek_raptor.txt delete mode 100644 res/cardsfolder/shriekhorn.txt delete mode 100644 res/cardsfolder/shrieking_drake.txt delete mode 100644 res/cardsfolder/shrieking_mogg.txt delete mode 100644 res/cardsfolder/shrieking_specter.txt delete mode 100644 res/cardsfolder/shriekmaw.txt delete mode 100644 res/cardsfolder/shrine_of_boundless_growth.txt delete mode 100644 res/cardsfolder/shrine_of_burning_rage.txt delete mode 100644 res/cardsfolder/shrine_of_limitless_power.txt delete mode 100644 res/cardsfolder/shrine_of_loyal_legions.txt delete mode 100644 res/cardsfolder/shrine_of_piercing_vision.txt delete mode 100644 res/cardsfolder/shrink.txt delete mode 100644 res/cardsfolder/shrivel.txt delete mode 100644 res/cardsfolder/shriveling_rot.txt delete mode 100644 res/cardsfolder/shu_cavalry.txt delete mode 100644 res/cardsfolder/shu_elite_companions.txt delete mode 100644 res/cardsfolder/shu_elite_infantry.txt delete mode 100644 res/cardsfolder/shu_farmer.txt delete mode 100644 res/cardsfolder/shu_foot_soldiers.txt delete mode 100644 res/cardsfolder/shu_general.txt delete mode 100644 res/cardsfolder/shu_grain_caravan.txt delete mode 100644 res/cardsfolder/shu_soldier_farmers.txt delete mode 100644 res/cardsfolder/shuko.txt delete mode 100644 res/cardsfolder/sibilant_spirit.txt delete mode 100644 res/cardsfolder/sick_and_tired.txt delete mode 100644 res/cardsfolder/sicken.txt delete mode 100644 res/cardsfolder/sickening_shoal.txt delete mode 100644 res/cardsfolder/sickle_ripper.txt delete mode 100644 res/cardsfolder/sickleslicer.txt delete mode 100644 res/cardsfolder/sidar_jabari.txt delete mode 100644 res/cardsfolder/sidewinder_sliver.txt delete mode 100644 res/cardsfolder/siege_gang_commander.txt delete mode 100644 res/cardsfolder/siege_mastodon.txt delete mode 100644 res/cardsfolder/siege_of_towers.txt delete mode 100644 res/cardsfolder/sift.txt delete mode 100644 res/cardsfolder/sighted_caste_sorcerer.txt delete mode 100644 res/cardsfolder/sigil_blessing.txt delete mode 100644 res/cardsfolder/sigil_captain.txt delete mode 100644 res/cardsfolder/sigil_of_the_empty_throne.txt delete mode 100644 res/cardsfolder/sigil_of_the_nayan_gods.txt delete mode 100644 res/cardsfolder/sigil_of_the_new_dawn.txt delete mode 100644 res/cardsfolder/sigil_tracer.txt delete mode 100644 res/cardsfolder/sigiled_behemoth.txt delete mode 100644 res/cardsfolder/sigiled_paladin.txt delete mode 100644 res/cardsfolder/sign_in_blood.txt delete mode 100644 res/cardsfolder/signal_pest.txt delete mode 100644 res/cardsfolder/silent_arbiter.txt delete mode 100644 res/cardsfolder/silent_attendant.txt delete mode 100644 res/cardsfolder/silent_chant_zubera.txt delete mode 100644 res/cardsfolder/silent_specter.txt delete mode 100644 res/cardsfolder/silhana_ledgewalker.txt delete mode 100644 res/cardsfolder/silk_net.txt delete mode 100644 res/cardsfolder/silkbind_faerie.txt delete mode 100644 res/cardsfolder/silkenfist_fighter.txt delete mode 100644 res/cardsfolder/silkenfist_order.txt delete mode 100644 res/cardsfolder/silklash_spider.txt delete mode 100644 res/cardsfolder/silkwing_scout.txt delete mode 100644 res/cardsfolder/silt_crawler.txt delete mode 100644 res/cardsfolder/silver_drake.txt delete mode 100644 res/cardsfolder/silver_erne.txt delete mode 100644 res/cardsfolder/silver_knight.txt delete mode 100644 res/cardsfolder/silver_myr.txt delete mode 100644 res/cardsfolder/silver_seraph.txt delete mode 100644 res/cardsfolder/silverback_ape.txt delete mode 100644 res/cardsfolder/silvercoat_lion.txt delete mode 100755 res/cardsfolder/silverglade_elemental.txt delete mode 100755 res/cardsfolder/silverglade_pathfinder.txt delete mode 100644 res/cardsfolder/silverskin_armor.txt delete mode 100644 res/cardsfolder/silverstorm_samurai.txt delete mode 100644 res/cardsfolder/silvos_rogue_elemental.txt delete mode 100644 res/cardsfolder/sima_yi_wei_field_marshal.txt delete mode 100644 res/cardsfolder/simian_grunts.txt delete mode 100644 res/cardsfolder/simian_spirit_guide.txt delete mode 100644 res/cardsfolder/simic_growth_chamber.txt delete mode 100644 res/cardsfolder/simic_ragworm.txt delete mode 100644 res/cardsfolder/simic_signet.txt delete mode 100644 res/cardsfolder/simic_sky_swallower.txt delete mode 100644 res/cardsfolder/simplify.txt delete mode 100644 res/cardsfolder/sinew_sliver.txt delete mode 100644 res/cardsfolder/singe_mind_ogre.txt delete mode 100644 res/cardsfolder/singing_tree.txt delete mode 100644 res/cardsfolder/sinkhole.txt delete mode 100644 res/cardsfolder/sinking_feeling.txt delete mode 100644 res/cardsfolder/sir_shandlar_of_eberyn.txt delete mode 100644 res/cardsfolder/sire_of_the_storm.txt delete mode 100644 res/cardsfolder/sirens_call.txt delete mode 100644 res/cardsfolder/sisays_ring.txt delete mode 100644 res/cardsfolder/sisters_of_the_flame.txt delete mode 100644 res/cardsfolder/sivitri_scarzam.txt delete mode 100644 res/cardsfolder/sizzle.txt delete mode 100644 res/cardsfolder/skarrg_the_rage_pits.txt delete mode 100644 res/cardsfolder/skarrgan_pit_skulk.txt delete mode 100644 res/cardsfolder/skarrgan_skybreaker.txt delete mode 100644 res/cardsfolder/skeletal_changeling.txt delete mode 100644 res/cardsfolder/skeletal_crocodile.txt delete mode 100644 res/cardsfolder/skeletal_kathari.txt delete mode 100644 res/cardsfolder/skeletal_snake.txt delete mode 100644 res/cardsfolder/skeletal_vampire.txt delete mode 100644 res/cardsfolder/skeletal_wurm.txt delete mode 100644 res/cardsfolder/skeleton_ship.txt delete mode 100644 res/cardsfolder/skinrender.txt delete mode 100644 res/cardsfolder/skinthinner.txt delete mode 100644 res/cardsfolder/skinwing.txt delete mode 100644 res/cardsfolder/skirge_familiar.txt delete mode 100644 res/cardsfolder/skirk_fire_marshal.txt delete mode 100644 res/cardsfolder/skirk_marauder.txt delete mode 100644 res/cardsfolder/skirk_outrider.txt delete mode 100644 res/cardsfolder/skirk_prospector.txt delete mode 100644 res/cardsfolder/skirk_ridge_exhumer.txt delete mode 100644 res/cardsfolder/skirk_shaman.txt delete mode 100644 res/cardsfolder/skirk_volcanist.txt delete mode 100644 res/cardsfolder/skithiryx_the_blight_dragon.txt delete mode 100644 res/cardsfolder/skitter_of_lizards.txt delete mode 100644 res/cardsfolder/skittering_horror.txt delete mode 100644 res/cardsfolder/skittering_invasion.txt delete mode 100644 res/cardsfolder/skittering_skirge.txt delete mode 100644 res/cardsfolder/skittish_kavu.txt delete mode 100644 res/cardsfolder/skizzik.txt delete mode 100644 res/cardsfolder/skred.txt delete mode 100644 res/cardsfolder/skulking_fugitive.txt delete mode 100644 res/cardsfolder/skulking_ghost.txt delete mode 100644 res/cardsfolder/skulking_knight.txt delete mode 100644 res/cardsfolder/skull_catapult.txt delete mode 100644 res/cardsfolder/skull_collector.txt delete mode 100644 res/cardsfolder/skull_fracture.txt delete mode 100644 res/cardsfolder/skull_of_orm.txt delete mode 100644 res/cardsfolder/skull_of_ramos.txt delete mode 100644 res/cardsfolder/skullclamp.txt delete mode 100644 res/cardsfolder/skullmead_cauldron.txt delete mode 100644 res/cardsfolder/skullmulcher.txt delete mode 100644 res/cardsfolder/skullsnatcher.txt delete mode 100644 res/cardsfolder/skulltap.txt delete mode 100644 res/cardsfolder/sky_diamond.txt delete mode 100644 res/cardsfolder/sky_eel_school.txt delete mode 100644 res/cardsfolder/sky_hussar.txt delete mode 100644 res/cardsfolder/sky_ruin_drake.txt delete mode 100644 res/cardsfolder/sky_spirit.txt delete mode 100644 res/cardsfolder/sky_swallower.txt delete mode 100644 res/cardsfolder/sky_weaver.txt delete mode 100644 res/cardsfolder/skycloud_egg.txt delete mode 100644 res/cardsfolder/skycloud_expanse.txt delete mode 100644 res/cardsfolder/skyhunter_cub.txt delete mode 100644 res/cardsfolder/skyhunter_patrol.txt delete mode 100644 res/cardsfolder/skyhunter_prowler.txt delete mode 100644 res/cardsfolder/skyhunter_skirmisher.txt delete mode 100644 res/cardsfolder/skyknight_legionnaire.txt delete mode 100644 res/cardsfolder/skyreach_manta.txt delete mode 100644 res/cardsfolder/skyrider_trainee.txt delete mode 100644 res/cardsfolder/skyscribing.txt delete mode 100644 res/cardsfolder/skyshaper.txt delete mode 100644 res/cardsfolder/skyshooter.txt delete mode 100644 res/cardsfolder/skyshroud_archer.txt delete mode 100644 res/cardsfolder/skyshroud_behemoth.txt delete mode 100644 res/cardsfolder/skyshroud_claim.txt delete mode 100644 res/cardsfolder/skyshroud_elf.txt delete mode 100644 res/cardsfolder/skyshroud_elite.txt delete mode 100644 res/cardsfolder/skyshroud_falcon.txt delete mode 100644 res/cardsfolder/skyshroud_forest.txt delete mode 100644 res/cardsfolder/skyshroud_poacher.txt delete mode 100644 res/cardsfolder/skyshroud_ridgeback.txt delete mode 100644 res/cardsfolder/skyshroud_sentinel.txt delete mode 100644 res/cardsfolder/skyshroud_troll.txt delete mode 100644 res/cardsfolder/skyshroud_troopers.txt delete mode 100644 res/cardsfolder/skyshroud_vampire.txt delete mode 100644 res/cardsfolder/skyshroud_war_beast.txt delete mode 100644 res/cardsfolder/skyward_eye_prophets.txt delete mode 100644 res/cardsfolder/skywatcher_adept.txt delete mode 100644 res/cardsfolder/skywing_aven.txt delete mode 100644 res/cardsfolder/slag_fiend.txt delete mode 100644 res/cardsfolder/slagstorm.txt delete mode 100644 res/cardsfolder/slagwurm_armor.txt delete mode 100644 res/cardsfolder/slash_panther.txt delete mode 100644 res/cardsfolder/slashing_tiger.txt delete mode 100644 res/cardsfolder/slate_of_ancestry.txt delete mode 100644 res/cardsfolder/slaughter.txt delete mode 100644 res/cardsfolder/slaughter_cry.txt delete mode 100644 res/cardsfolder/slaughterhouse_bouncer.txt delete mode 100644 res/cardsfolder/slave_of_bolas.txt delete mode 100644 res/cardsfolder/slavering_nulls.txt delete mode 100644 res/cardsfolder/slay.txt delete mode 100644 res/cardsfolder/sleeper_agent.txt delete mode 100644 res/cardsfolder/sleepers_guile.txt delete mode 100644 res/cardsfolder/sleepers_robe.txt delete mode 100644 res/cardsfolder/sleeping_potion.txt delete mode 100644 res/cardsfolder/sleight_of_hand.txt delete mode 100644 res/cardsfolder/slice_and_dice.txt delete mode 100644 res/cardsfolder/slice_in_twain.txt delete mode 100644 res/cardsfolder/slingbow_trap.txt delete mode 100644 res/cardsfolder/slingshot_goblin.txt delete mode 100644 res/cardsfolder/slinking_giant.txt delete mode 100644 res/cardsfolder/slinking_serpent.txt delete mode 100644 res/cardsfolder/slinking_skirge.txt delete mode 100644 res/cardsfolder/slippery_bogle.txt delete mode 100644 res/cardsfolder/slippery_karst.txt delete mode 100644 res/cardsfolder/slipstream_eel.txt delete mode 100644 res/cardsfolder/slipstream_serpent.txt delete mode 100644 res/cardsfolder/sliptide_serpent.txt delete mode 100644 res/cardsfolder/slith_ascendant.txt delete mode 100644 res/cardsfolder/slith_bloodletter.txt delete mode 100644 res/cardsfolder/slith_firewalker.txt delete mode 100644 res/cardsfolder/slith_predator.txt delete mode 100644 res/cardsfolder/slith_strider.txt delete mode 100644 res/cardsfolder/slithering_shade.txt delete mode 100644 res/cardsfolder/slithery_stalker.txt delete mode 100644 res/cardsfolder/sliver_legion.txt delete mode 100644 res/cardsfolder/sliver_overlord.txt delete mode 100644 res/cardsfolder/sliver_queen.txt delete mode 100644 res/cardsfolder/sliversmith.txt delete mode 100644 res/cardsfolder/slobad_goblin_tinkerer.txt delete mode 100644 res/cardsfolder/slow_motion.txt delete mode 100644 res/cardsfolder/sludge_strider.txt delete mode 100644 res/cardsfolder/sluggishness.txt delete mode 100644 res/cardsfolder/slumbering_tora.txt delete mode 100644 res/cardsfolder/smallpox.txt delete mode 100644 res/cardsfolder/smash.txt delete mode 100644 res/cardsfolder/smash_to_smithereens.txt delete mode 100644 res/cardsfolder/smite.txt delete mode 100644 res/cardsfolder/smogsteed_rider.txt delete mode 100644 res/cardsfolder/smoke.txt delete mode 100644 res/cardsfolder/smokespew_invoker.txt delete mode 100644 res/cardsfolder/smokestack.txt delete mode 100644 res/cardsfolder/smolder_initiate.txt delete mode 100644 res/cardsfolder/smoldering_butcher.txt delete mode 100644 res/cardsfolder/smoldering_crater.txt delete mode 100644 res/cardsfolder/smoldering_spires.txt delete mode 100644 res/cardsfolder/smother.txt delete mode 100644 res/cardsfolder/snake_basket.txt delete mode 100644 res/cardsfolder/snake_cult_initiation.txt delete mode 100755 res/cardsfolder/snake_pit.txt delete mode 100644 res/cardsfolder/snake_umbra.txt delete mode 100644 res/cardsfolder/snap.txt delete mode 100755 res/cardsfolder/snapback.txt delete mode 100644 res/cardsfolder/snapping_creeper.txt delete mode 100644 res/cardsfolder/snapping_drake.txt delete mode 100644 res/cardsfolder/snapsail_glider.txt delete mode 100644 res/cardsfolder/snarling_undorak.txt delete mode 100644 res/cardsfolder/sneaky_homunculus.txt delete mode 100644 res/cardsfolder/snorting_gahr.txt delete mode 100644 res/cardsfolder/snow_covered_forest.txt delete mode 100644 res/cardsfolder/snow_covered_island.txt delete mode 100644 res/cardsfolder/snow_covered_mountain.txt delete mode 100644 res/cardsfolder/snow_covered_plains.txt delete mode 100644 res/cardsfolder/snow_covered_swamp.txt delete mode 100644 res/cardsfolder/snow_devil.txt delete mode 100644 res/cardsfolder/snow_fortress.txt delete mode 100644 res/cardsfolder/snow_hound.txt delete mode 100755 res/cardsfolder/snuff_out.txt delete mode 100644 res/cardsfolder/soaring_hope.txt delete mode 100644 res/cardsfolder/soaring_seacliff.txt delete mode 100644 res/cardsfolder/soilshaper.txt delete mode 100644 res/cardsfolder/sokenzan_bruiser.txt delete mode 100644 res/cardsfolder/sol_ring.txt delete mode 100644 res/cardsfolder/solar_blast.txt delete mode 100644 res/cardsfolder/solar_tide.txt delete mode 100644 res/cardsfolder/solarion.txt delete mode 100644 res/cardsfolder/soldevi_adnate.txt delete mode 100644 res/cardsfolder/soldevi_digger.txt delete mode 100644 res/cardsfolder/soldevi_excavations.txt delete mode 100644 res/cardsfolder/soldevi_heretic.txt delete mode 100644 res/cardsfolder/soldevi_sage.txt delete mode 100644 res/cardsfolder/soldevi_simulacrum.txt delete mode 100644 res/cardsfolder/soldevi_steam_beast.txt delete mode 100644 res/cardsfolder/soldier_of_fortune.txt delete mode 100644 res/cardsfolder/soldier_replica.txt delete mode 100644 res/cardsfolder/solemn_offering.txt delete mode 100644 res/cardsfolder/solemn_simulacrum.txt delete mode 100644 res/cardsfolder/solidarity.txt delete mode 100644 res/cardsfolder/soliton.txt delete mode 100644 res/cardsfolder/solkanar_the_swamp_king.txt delete mode 100644 res/cardsfolder/soltari_champion.txt delete mode 100644 res/cardsfolder/soltari_crusader.txt delete mode 100644 res/cardsfolder/soltari_emissary.txt delete mode 100644 res/cardsfolder/soltari_foot_soldier.txt delete mode 100644 res/cardsfolder/soltari_lancer.txt delete mode 100644 res/cardsfolder/soltari_monk.txt delete mode 100644 res/cardsfolder/soltari_priest.txt delete mode 100644 res/cardsfolder/soltari_trooper.txt delete mode 100644 res/cardsfolder/somber_hoverguard.txt delete mode 100644 res/cardsfolder/somnomancer.txt delete mode 100644 res/cardsfolder/song_of_serenity.txt delete mode 100644 res/cardsfolder/songs_of_the_damned.txt delete mode 100644 res/cardsfolder/songstitcher.txt delete mode 100644 res/cardsfolder/sonic_burst.txt delete mode 100644 res/cardsfolder/sonic_seizure.txt delete mode 100644 res/cardsfolder/soot_imp.txt delete mode 100644 res/cardsfolder/sootfeather_flock.txt delete mode 100644 res/cardsfolder/soothing_balm.txt delete mode 100644 res/cardsfolder/sootstoke_kindler.txt delete mode 100644 res/cardsfolder/sootwalkers.txt delete mode 100644 res/cardsfolder/soratami_cloudskater.txt delete mode 100644 res/cardsfolder/soratami_mindsweeper.txt delete mode 100644 res/cardsfolder/soratami_mirror_guard.txt delete mode 100644 res/cardsfolder/soratami_mirror_mage.txt delete mode 100644 res/cardsfolder/soratami_rainshaper.txt delete mode 100644 res/cardsfolder/soratami_savant.txt delete mode 100644 res/cardsfolder/sorcerers_strongbox.txt delete mode 100644 res/cardsfolder/sorceress_queen.txt delete mode 100644 res/cardsfolder/sorcerous_sight.txt delete mode 100644 res/cardsfolder/sosuke_son_of_seshiro.txt delete mode 100644 res/cardsfolder/sosukes_summons.txt delete mode 100644 res/cardsfolder/soul_barrier.txt delete mode 100644 res/cardsfolder/soul_bleed.txt delete mode 100644 res/cardsfolder/soul_channeling.txt delete mode 100644 res/cardsfolder/soul_collector.txt delete mode 100644 res/cardsfolder/soul_exchange.txt delete mode 100644 res/cardsfolder/soul_feast.txt delete mode 100644 res/cardsfolder/soul_foundry.txt delete mode 100644 res/cardsfolder/soul_kiss.txt delete mode 100644 res/cardsfolder/soul_link.txt delete mode 100644 res/cardsfolder/soul_manipulation.txt delete mode 100644 res/cardsfolder/soul_net.txt delete mode 100644 res/cardsfolder/soul_of_magma.txt delete mode 100644 res/cardsfolder/soul_parry.txt delete mode 100644 res/cardsfolder/soul_rend.txt delete mode 100644 res/cardsfolder/soul_scourge.txt delete mode 100644 res/cardsfolder/soul_shepherd.txt delete mode 100644 res/cardsfolder/soul_shred.txt delete mode 100644 res/cardsfolder/soul_snuffers.txt delete mode 100755 res/cardsfolder/soul_spike.txt delete mode 100644 res/cardsfolder/soul_stair_expedition.txt delete mode 100644 res/cardsfolder/soul_warden.txt delete mode 100644 res/cardsfolder/soulbound_guardians.txt delete mode 100644 res/cardsfolder/soulcatcher.txt delete mode 100644 res/cardsfolder/soulcatchers_aerie.txt delete mode 100644 res/cardsfolder/souldrinker.txt delete mode 100644 res/cardsfolder/soulless_one.txt delete mode 100644 res/cardsfolder/soulquake.txt delete mode 100644 res/cardsfolder/souls_attendant.txt delete mode 100644 res/cardsfolder/souls_might.txt delete mode 100644 res/cardsfolder/souls_of_the_faultless.txt delete mode 100644 res/cardsfolder/soulscour.txt delete mode 100644 res/cardsfolder/soulsurge_elemental.txt delete mode 100644 res/cardsfolder/soulsworn_jury.txt delete mode 100644 res/cardsfolder/soultether_golem.txt delete mode 100644 res/cardsfolder/sound_the_call.txt delete mode 100644 res/cardsfolder/southern_elephant.txt delete mode 100644 res/cardsfolder/southern_paladin.txt delete mode 100644 res/cardsfolder/sovereigns_of_lost_alara.txt delete mode 100644 res/cardsfolder/sower_of_temptation.txt delete mode 100644 res/cardsfolder/spark_elemental.txt delete mode 100644 res/cardsfolder/spark_spray.txt delete mode 100644 res/cardsfolder/sparkcaster.txt delete mode 100644 res/cardsfolder/sparkmage_apprentice.txt delete mode 100644 res/cardsfolder/sparksmith.txt delete mode 100644 res/cardsfolder/sparkspitter.txt delete mode 100644 res/cardsfolder/sparring_golem.txt delete mode 100644 res/cardsfolder/spawning_breath.txt delete mode 100644 res/cardsfolder/spawning_pit.txt delete mode 100644 res/cardsfolder/spawning_pool.txt delete mode 100644 res/cardsfolder/spawnwrithe.txt delete mode 100644 res/cardsfolder/spearbreaker_behemoth.txt delete mode 100644 res/cardsfolder/specters_shroud.txt delete mode 100644 res/cardsfolder/specters_wail.txt delete mode 100644 res/cardsfolder/spectral_bears.txt delete mode 100644 res/cardsfolder/spectral_cloak.txt delete mode 100644 res/cardsfolder/spectral_force.txt delete mode 100644 res/cardsfolder/spectral_guardian.txt delete mode 100644 res/cardsfolder/spectral_lynx.txt delete mode 100644 res/cardsfolder/spectral_procession.txt delete mode 100644 res/cardsfolder/spectral_searchlight.txt delete mode 100644 res/cardsfolder/spectral_shield.txt delete mode 100644 res/cardsfolder/spectral_sliver.txt delete mode 100644 res/cardsfolder/spell_blast.txt delete mode 100644 res/cardsfolder/spell_burst.txt delete mode 100644 res/cardsfolder/spell_contortion.txt delete mode 100644 res/cardsfolder/spell_pierce.txt delete mode 100644 res/cardsfolder/spell_snare.txt delete mode 100644 res/cardsfolder/spell_snip.txt delete mode 100644 res/cardsfolder/spell_syphon.txt delete mode 100644 res/cardsfolder/spellbane_centaur.txt delete mode 100644 res/cardsfolder/spellbook.txt delete mode 100644 res/cardsfolder/spellbreaker_behemoth.txt delete mode 100644 res/cardsfolder/spellgorger_barbarian.txt delete mode 100644 res/cardsfolder/spellshock.txt delete mode 100644 res/cardsfolder/spellstutter_sprite.txt delete mode 100644 res/cardsfolder/sphere_of_duty.txt delete mode 100644 res/cardsfolder/sphere_of_grace.txt delete mode 100644 res/cardsfolder/sphere_of_law.txt delete mode 100644 res/cardsfolder/sphere_of_purity.txt delete mode 100644 res/cardsfolder/sphere_of_reason.txt delete mode 100644 res/cardsfolder/sphere_of_resistance.txt delete mode 100644 res/cardsfolder/sphere_of_the_suns.txt delete mode 100644 res/cardsfolder/sphere_of_truth.txt delete mode 100644 res/cardsfolder/sphinx_bone_wand.txt delete mode 100644 res/cardsfolder/sphinx_of_jwar_isle.txt delete mode 100644 res/cardsfolder/sphinx_of_lost_truths.txt delete mode 100644 res/cardsfolder/sphinx_of_magosi.txt delete mode 100644 res/cardsfolder/sphinx_of_the_steel_wind.txt delete mode 100644 res/cardsfolder/sphinx_sovereign.txt delete mode 100644 res/cardsfolder/sphinx_summoner.txt delete mode 100644 res/cardsfolder/spider_umbra.txt delete mode 100644 res/cardsfolder/spidersilk_armor.txt delete mode 100644 res/cardsfolder/spidersilk_net.txt delete mode 100644 res/cardsfolder/spiderwig_boggart.txt delete mode 100644 res/cardsfolder/spike_breeder.txt delete mode 100644 res/cardsfolder/spike_colony.txt delete mode 100644 res/cardsfolder/spike_drone.txt delete mode 100644 res/cardsfolder/spike_feeder.txt delete mode 100644 res/cardsfolder/spike_hatcher.txt delete mode 100644 res/cardsfolder/spike_soldier.txt delete mode 100644 res/cardsfolder/spike_tiller.txt delete mode 100644 res/cardsfolder/spike_weaver.txt delete mode 100644 res/cardsfolder/spike_worker.txt delete mode 100644 res/cardsfolder/spikeshot_elder.txt delete mode 100644 res/cardsfolder/spikeshot_goblin.txt delete mode 100644 res/cardsfolder/spiketail_drake.txt delete mode 100644 res/cardsfolder/spiketail_drakeling.txt delete mode 100644 res/cardsfolder/spiketail_hatchling.txt delete mode 100644 res/cardsfolder/spin_into_myth.txt delete mode 100644 res/cardsfolder/spinal_graft.txt delete mode 100644 res/cardsfolder/spinal_villain.txt delete mode 100644 res/cardsfolder/spincrusher.txt delete mode 100644 res/cardsfolder/spindrift_drake.txt delete mode 100644 res/cardsfolder/spine_of_ish_sah.txt delete mode 100644 res/cardsfolder/spined_basher.txt delete mode 100644 res/cardsfolder/spined_fluke.txt delete mode 100644 res/cardsfolder/spined_sliver.txt delete mode 100644 res/cardsfolder/spined_thopter.txt delete mode 100644 res/cardsfolder/spined_wurm.txt delete mode 100644 res/cardsfolder/spineless_thug.txt delete mode 100644 res/cardsfolder/spinneret_sliver.txt delete mode 100644 res/cardsfolder/spiraling_duelist.txt delete mode 100644 res/cardsfolder/spiraling_embers.txt delete mode 100644 res/cardsfolder/spire_barrage.txt delete mode 100644 res/cardsfolder/spire_golem.txt delete mode 100644 res/cardsfolder/spire_monitor.txt delete mode 100644 res/cardsfolder/spire_owl.txt delete mode 100644 res/cardsfolder/spire_serpent.txt delete mode 100644 res/cardsfolder/spirit_cairn.txt delete mode 100644 res/cardsfolder/spirit_en_dal.txt delete mode 100644 res/cardsfolder/spirit_link.txt delete mode 100644 res/cardsfolder/spirit_loop.txt delete mode 100644 res/cardsfolder/spirit_of_resistance.txt delete mode 100644 res/cardsfolder/spirit_of_the_night.txt delete mode 100644 res/cardsfolder/spirit_shackle.txt delete mode 100644 res/cardsfolder/spirit_weaver.txt delete mode 100644 res/cardsfolder/spiritmonger.txt delete mode 100644 res/cardsfolder/spiritual_asylum.txt delete mode 100644 res/cardsfolder/spiritual_guardian.txt delete mode 100644 res/cardsfolder/spitebellows.txt delete mode 100644 res/cardsfolder/spiteflame_witch.txt delete mode 100644 res/cardsfolder/spiteful_bully.txt delete mode 100644 res/cardsfolder/spiteful_visions.txt delete mode 100644 res/cardsfolder/spitemare.txt delete mode 100644 res/cardsfolder/spitfire_handler.txt delete mode 100644 res/cardsfolder/spitting_drake.txt delete mode 100644 res/cardsfolder/spitting_earth.txt delete mode 100644 res/cardsfolder/spitting_gourna.txt delete mode 100644 res/cardsfolder/spitting_hydra.txt delete mode 100644 res/cardsfolder/spitting_image.txt delete mode 100644 res/cardsfolder/spitting_sliver.txt delete mode 100644 res/cardsfolder/spitting_spider.txt delete mode 100644 res/cardsfolder/splinter_twin.txt delete mode 100644 res/cardsfolder/split_tail_miko.txt delete mode 100644 res/cardsfolder/splitting_headache.txt delete mode 100644 res/cardsfolder/spoils_of_victory.txt delete mode 100644 res/cardsfolder/spontaneous_combustion.txt delete mode 100644 res/cardsfolder/spontaneous_generation.txt delete mode 100644 res/cardsfolder/spore_burst.txt delete mode 100644 res/cardsfolder/spore_cloud.txt delete mode 100644 res/cardsfolder/spore_flower.txt delete mode 100644 res/cardsfolder/spore_frog.txt delete mode 100644 res/cardsfolder/sporecap_spider.txt delete mode 100644 res/cardsfolder/sporesower_thallid.txt delete mode 100644 res/cardsfolder/sporoloth_ancient.txt delete mode 100644 res/cardsfolder/spotted_griffin.txt delete mode 100644 res/cardsfolder/spread_the_sickness.txt delete mode 100644 res/cardsfolder/spreading_seas.txt delete mode 100644 res/cardsfolder/spring_cleaning.txt delete mode 100644 res/cardsfolder/spring_of_eternal_peace.txt delete mode 100644 res/cardsfolder/springing_tiger.txt delete mode 100644 res/cardsfolder/springjack_knight.txt delete mode 100644 res/cardsfolder/springjack_shepherd.txt delete mode 100644 res/cardsfolder/springleaf_drum.txt delete mode 100644 res/cardsfolder/sprite_noble.txt delete mode 100644 res/cardsfolder/sprout.txt delete mode 100644 res/cardsfolder/sprout_swarm.txt delete mode 100644 res/cardsfolder/sprouting_phytohydra.txt delete mode 100644 res/cardsfolder/sprouting_thrinax.txt delete mode 100644 res/cardsfolder/sprouting_vines.txt delete mode 100644 res/cardsfolder/spur_grappler.txt delete mode 100644 res/cardsfolder/spurnmage_advocate.txt delete mode 100644 res/cardsfolder/spurred_wolverine.txt delete mode 100644 res/cardsfolder/squadron_hawk.txt delete mode 100644 res/cardsfolder/squall.txt delete mode 100644 res/cardsfolder/squall_drifter.txt delete mode 100644 res/cardsfolder/squall_line.txt delete mode 100755 res/cardsfolder/squallmonger.txt delete mode 100644 res/cardsfolder/squandered_resources.txt delete mode 100644 res/cardsfolder/squeaking_pie_grubfellows.txt delete mode 100644 res/cardsfolder/squee_goblin_nabob.txt delete mode 100644 res/cardsfolder/squees_embrace.txt delete mode 100644 res/cardsfolder/squees_toy.txt delete mode 100644 res/cardsfolder/squeeze.txt delete mode 100644 res/cardsfolder/squelch.txt delete mode 100644 res/cardsfolder/squire.txt delete mode 100644 res/cardsfolder/squirming_mass.txt delete mode 100644 res/cardsfolder/squirrel_mob.txt delete mode 100644 res/cardsfolder/squirrel_nest.txt delete mode 100644 res/cardsfolder/squirrel_wrangler.txt delete mode 100644 res/cardsfolder/stabbing_pain.txt delete mode 100644 res/cardsfolder/stabilizer.txt delete mode 100644 res/cardsfolder/staff_of_domination.txt delete mode 100644 res/cardsfolder/staff_of_the_ages.txt delete mode 100644 res/cardsfolder/staff_of_zegon.txt delete mode 100644 res/cardsfolder/stag_beetle.txt delete mode 100644 res/cardsfolder/stalker_hag.txt delete mode 100644 res/cardsfolder/stalking_assassin.txt delete mode 100644 res/cardsfolder/stalking_bloodsucker.txt delete mode 100644 res/cardsfolder/stalking_stones.txt delete mode 100644 res/cardsfolder/stalking_tiger.txt delete mode 100644 res/cardsfolder/stalking_vengeance.txt delete mode 100644 res/cardsfolder/stalwart_shield_bearers.txt delete mode 100644 res/cardsfolder/stampede.txt delete mode 100644 res/cardsfolder/stampede_driver.txt delete mode 100644 res/cardsfolder/stampeding_rhino.txt delete mode 100644 res/cardsfolder/stampeding_serow.txt delete mode 100644 res/cardsfolder/stampeding_wildebeests.txt delete mode 100644 res/cardsfolder/stand_firm.txt delete mode 100644 res/cardsfolder/standing_stones.txt delete mode 100644 res/cardsfolder/standing_troops.txt delete mode 100644 res/cardsfolder/standstill.txt delete mode 100644 res/cardsfolder/stangg.txt delete mode 100644 res/cardsfolder/star_compass.txt delete mode 100644 res/cardsfolder/starlight.txt delete mode 100644 res/cardsfolder/starlight_invoker.txt delete mode 100644 res/cardsfolder/starlit_angel.txt delete mode 100644 res/cardsfolder/starlit_sanctum.txt delete mode 100644 res/cardsfolder/starstorm.txt delete mode 100644 res/cardsfolder/starved_rusalka.txt delete mode 100644 res/cardsfolder/stasis.txt delete mode 100644 res/cardsfolder/statecraft.txt delete mode 100644 res/cardsfolder/staunch_defenders.txt delete mode 100644 res/cardsfolder/steadfast_guard.txt delete mode 100644 res/cardsfolder/steadfastness.txt delete mode 100644 res/cardsfolder/steady_progress.txt delete mode 100644 res/cardsfolder/steal_artifact.txt delete mode 100644 res/cardsfolder/steam_blast.txt delete mode 100644 res/cardsfolder/steam_catapult.txt delete mode 100644 res/cardsfolder/steam_frigate.txt delete mode 100644 res/cardsfolder/steam_spitter.txt delete mode 100644 res/cardsfolder/steam_vents.txt delete mode 100644 res/cardsfolder/steamclaw.txt delete mode 100644 res/cardsfolder/steel_leaf_paladin.txt delete mode 100644 res/cardsfolder/steel_of_the_godhead.txt delete mode 100644 res/cardsfolder/steel_overseer.txt delete mode 100644 res/cardsfolder/steel_sabotage.txt delete mode 100644 res/cardsfolder/steel_wall.txt delete mode 100644 res/cardsfolder/steelclad_serpent.txt delete mode 100644 res/cardsfolder/steelshaper_apprentice.txt delete mode 100644 res/cardsfolder/steelshapers_gift.txt delete mode 100644 res/cardsfolder/steely_resolve.txt delete mode 100644 res/cardsfolder/stench_of_decay.txt delete mode 100644 res/cardsfolder/stenchskipper.txt delete mode 100644 res/cardsfolder/steppe_lynx.txt delete mode 100644 res/cardsfolder/sterling_grove.txt delete mode 100644 res/cardsfolder/stern_judge.txt delete mode 100644 res/cardsfolder/stern_marshal.txt delete mode 100644 res/cardsfolder/stern_proctor.txt delete mode 100644 res/cardsfolder/steward_of_valeron.txt delete mode 100644 res/cardsfolder/stifle.txt delete mode 100644 res/cardsfolder/still_life.txt delete mode 100644 res/cardsfolder/stillmoon_cavalier.txt delete mode 100644 res/cardsfolder/stinging_barrier.txt delete mode 100644 res/cardsfolder/stingscourger.txt delete mode 100644 res/cardsfolder/stinkdrinker_daredevil.txt delete mode 100644 res/cardsfolder/stinkweed_imp.txt delete mode 100644 res/cardsfolder/stir_the_grave.txt delete mode 100644 res/cardsfolder/stirring_wildwood.txt delete mode 100644 res/cardsfolder/stitch_in_time.txt delete mode 100644 res/cardsfolder/stitch_together.txt delete mode 100644 res/cardsfolder/stoic_angel.txt delete mode 100644 res/cardsfolder/stoic_champion.txt delete mode 100644 res/cardsfolder/stoic_ephemera.txt delete mode 100644 res/cardsfolder/stoic_rebuttal.txt delete mode 100644 res/cardsfolder/stolen_grain.txt delete mode 100644 res/cardsfolder/stomp_and_howl.txt delete mode 100644 res/cardsfolder/stomper_cub.txt delete mode 100644 res/cardsfolder/stomping_ground.txt delete mode 100644 res/cardsfolder/stone_calendar.txt delete mode 100644 res/cardsfolder/stone_catapult.txt delete mode 100644 res/cardsfolder/stone_giant.txt delete mode 100644 res/cardsfolder/stone_golem.txt delete mode 100644 res/cardsfolder/stone_kavu.txt delete mode 100644 res/cardsfolder/stone_rain.txt delete mode 100644 res/cardsfolder/stone_seeder_hierophant.txt delete mode 100644 res/cardsfolder/stone_spirit.txt delete mode 100644 res/cardsfolder/stone_throwing_devils.txt delete mode 100644 res/cardsfolder/stone_tongue_basilisk.txt delete mode 100644 res/cardsfolder/stonebrow_krosan_hero.txt delete mode 100644 res/cardsfolder/stonecloaker.txt delete mode 100644 res/cardsfolder/stoneforge_mystic.txt delete mode 100644 res/cardsfolder/stonehands.txt delete mode 100644 res/cardsfolder/stonewood_invocation.txt delete mode 100644 res/cardsfolder/stonewood_invoker.txt delete mode 100644 res/cardsfolder/stonework_puma.txt delete mode 100644 res/cardsfolder/stonybrook_angler.txt delete mode 100644 res/cardsfolder/stonybrook_banneret.txt delete mode 100644 res/cardsfolder/stonybrook_schoolmaster.txt delete mode 100644 res/cardsfolder/storm_cauldron.txt delete mode 100644 res/cardsfolder/storm_crow.txt delete mode 100644 res/cardsfolder/storm_elemental.txt delete mode 100644 res/cardsfolder/storm_entity.txt delete mode 100644 res/cardsfolder/storm_front.txt delete mode 100644 res/cardsfolder/storm_herd.txt delete mode 100644 res/cardsfolder/storm_seeker.txt delete mode 100644 res/cardsfolder/storm_shaman.txt delete mode 100644 res/cardsfolder/storm_spirit.txt delete mode 100644 res/cardsfolder/storm_world.txt delete mode 100644 res/cardsfolder/stormbind.txt delete mode 100644 res/cardsfolder/stormcallers_boon.txt delete mode 100644 res/cardsfolder/stormcloud_djinn.txt delete mode 100644 res/cardsfolder/stormfront_pegasus.txt delete mode 100644 res/cardsfolder/stormfront_riders.txt delete mode 100644 res/cardsfolder/stormscale_anarch.txt delete mode 100644 res/cardsfolder/stormscape_apprentice.txt delete mode 100644 res/cardsfolder/stormscape_familiar.txt delete mode 100644 res/cardsfolder/stormscape_master.txt delete mode 100644 res/cardsfolder/stormtide_leviathan.txt delete mode 100644 res/cardsfolder/stormwatch_eagle.txt delete mode 100644 res/cardsfolder/strafe.txt delete mode 100644 res/cardsfolder/strands_of_night.txt delete mode 100644 res/cardsfolder/strands_of_undeath.txt delete mode 100644 res/cardsfolder/strandwalker.txt delete mode 100644 res/cardsfolder/strangling_soot.txt delete mode 100644 res/cardsfolder/stratadon.txt delete mode 100644 res/cardsfolder/strategic_planning.txt delete mode 100644 res/cardsfolder/stratozeppelid.txt delete mode 100644 res/cardsfolder/straw_golem.txt delete mode 100644 res/cardsfolder/straw_soldiers.txt delete mode 100644 res/cardsfolder/stream_hopper.txt delete mode 100644 res/cardsfolder/stream_of_acid.txt delete mode 100644 res/cardsfolder/stream_of_life.txt delete mode 100644 res/cardsfolder/stream_of_unconsciousness.txt delete mode 100644 res/cardsfolder/street_wraith.txt delete mode 100644 res/cardsfolder/streetbreaker_wurm.txt delete mode 100644 res/cardsfolder/strength_of_cedars.txt delete mode 100644 res/cardsfolder/strength_of_isolation.txt delete mode 100644 res/cardsfolder/strength_of_lunacy.txt delete mode 100644 res/cardsfolder/strength_of_night.txt delete mode 100644 res/cardsfolder/strength_of_unity.txt delete mode 100644 res/cardsfolder/strider_harness.txt delete mode 100644 res/cardsfolder/strip_mine.txt delete mode 100644 res/cardsfolder/striped_bears.txt delete mode 100644 res/cardsfolder/stroke_of_genius.txt delete mode 100644 res/cardsfolder/stromgald_cabal.txt delete mode 100644 res/cardsfolder/stromgald_crusader.txt delete mode 100644 res/cardsfolder/strongarm_thug.txt delete mode 100644 res/cardsfolder/stronghold_assassin.txt delete mode 100644 res/cardsfolder/stronghold_biologist.txt delete mode 100644 res/cardsfolder/stronghold_discipline.txt delete mode 100644 res/cardsfolder/stronghold_machinist.txt delete mode 100644 res/cardsfolder/stronghold_rats.txt delete mode 100644 res/cardsfolder/stronghold_taskmaster.txt delete mode 100644 res/cardsfolder/stronghold_zeppelin.txt delete mode 100644 res/cardsfolder/student_of_warfare.txt delete mode 100644 res/cardsfolder/stuffy_doll.txt delete mode 100644 res/cardsfolder/stun.txt delete mode 100644 res/cardsfolder/stun_sniper.txt delete mode 100644 res/cardsfolder/stunted_growth.txt delete mode 100644 res/cardsfolder/stupefying_touch.txt delete mode 100644 res/cardsfolder/stupor.txt delete mode 100644 res/cardsfolder/sturdy_hatchling.txt delete mode 100644 res/cardsfolder/su_chi.txt delete mode 100644 res/cardsfolder/subterranean_shambler.txt delete mode 100644 res/cardsfolder/subterranean_spirit.txt delete mode 100644 res/cardsfolder/subversion.txt delete mode 100644 res/cardsfolder/sudden_death.txt delete mode 100644 res/cardsfolder/sudden_impact.txt delete mode 100644 res/cardsfolder/sudden_strength.txt delete mode 100644 res/cardsfolder/suffer_the_past.txt delete mode 100644 res/cardsfolder/suffocating_blast.txt delete mode 100644 res/cardsfolder/suicidal_charge.txt delete mode 100644 res/cardsfolder/suleimans_legacy.txt delete mode 100644 res/cardsfolder/sulfur_elemental.txt delete mode 100644 res/cardsfolder/sulfur_vent.txt delete mode 100644 res/cardsfolder/sulfuric_vapors.txt delete mode 100644 res/cardsfolder/sulfuric_vortex.txt delete mode 100644 res/cardsfolder/sulfurous_blast.txt delete mode 100644 res/cardsfolder/sulfurous_springs.txt delete mode 100644 res/cardsfolder/summer_bloom.txt delete mode 100644 res/cardsfolder/summon_the_school.txt delete mode 100644 res/cardsfolder/summoners_bane.txt delete mode 100644 res/cardsfolder/summoning_station.txt delete mode 100644 res/cardsfolder/sun_ce_young_conquerer.txt delete mode 100644 res/cardsfolder/sun_clasp.txt delete mode 100644 res/cardsfolder/sun_quan_lord_of_wu.txt delete mode 100644 res/cardsfolder/sun_titan.txt delete mode 100644 res/cardsfolder/sunastian_falconer.txt delete mode 100644 res/cardsfolder/sunbeam_spellbomb.txt delete mode 100644 res/cardsfolder/sunblast_angel.txt delete mode 100644 res/cardsfolder/suncrusher.txt delete mode 100644 res/cardsfolder/sunder.txt delete mode 100644 res/cardsfolder/sunder_from_within.txt delete mode 100644 res/cardsfolder/sunfire_balm.txt delete mode 100644 res/cardsfolder/sunflare_shaman.txt delete mode 100644 res/cardsfolder/sunglasses_of_urza.txt delete mode 100644 res/cardsfolder/sungrass_egg.txt delete mode 100644 res/cardsfolder/sungrass_prairie.txt delete mode 100644 res/cardsfolder/sunhome_enforcer.txt delete mode 100644 res/cardsfolder/sunhome_fortress_of_the_legion.txt delete mode 100644 res/cardsfolder/sunken_city.txt delete mode 100644 res/cardsfolder/sunken_field.txt delete mode 100644 res/cardsfolder/sunken_hope.txt delete mode 100644 res/cardsfolder/sunken_ruins.txt delete mode 100644 res/cardsfolder/sunlance.txt delete mode 100644 res/cardsfolder/sunpetal_grove.txt delete mode 100644 res/cardsfolder/sunrise_sovereign.txt delete mode 100644 res/cardsfolder/suns_bounty.txt delete mode 100644 res/cardsfolder/sunscape_familiar.txt delete mode 100644 res/cardsfolder/sunscape_master.txt delete mode 100755 res/cardsfolder/sunscour.txt delete mode 100644 res/cardsfolder/sunseed_nurturer.txt delete mode 100644 res/cardsfolder/sunspear_shikari.txt delete mode 100644 res/cardsfolder/sunspring_expedition.txt delete mode 100644 res/cardsfolder/sunstone.txt delete mode 100644 res/cardsfolder/sunstrike_legionnaire.txt delete mode 100644 res/cardsfolder/suntail_hawk.txt delete mode 100644 res/cardsfolder/suntouched_myr.txt delete mode 100644 res/cardsfolder/sunweb.txt delete mode 100644 res/cardsfolder/supreme_exemplar.txt delete mode 100644 res/cardsfolder/supreme_inquisitor.txt delete mode 100644 res/cardsfolder/suqata_assassin.txt delete mode 100644 res/cardsfolder/suqata_firewalker.txt delete mode 100644 res/cardsfolder/suqata_lancer.txt delete mode 100644 res/cardsfolder/surge_node.txt delete mode 100644 res/cardsfolder/surge_of_strength.txt delete mode 100644 res/cardsfolder/surge_of_thoughtweft.txt delete mode 100644 res/cardsfolder/surging_aether.txt delete mode 100644 res/cardsfolder/surging_dementia.txt delete mode 100644 res/cardsfolder/surging_flame.txt delete mode 100644 res/cardsfolder/surging_might.txt delete mode 100644 res/cardsfolder/surging_sentinels.txt delete mode 100644 res/cardsfolder/surrakar_banisher.txt delete mode 100644 res/cardsfolder/surrakar_marauder.txt delete mode 100644 res/cardsfolder/surrakar_spellblade.txt delete mode 100644 res/cardsfolder/surveilling_sprite.txt delete mode 100644 res/cardsfolder/survival_of_the_fittest.txt delete mode 100644 res/cardsfolder/sustainer_of_the_realm.txt delete mode 100644 res/cardsfolder/sustaining_spirit.txt delete mode 100644 res/cardsfolder/sustenance.txt delete mode 100644 res/cardsfolder/suture_priest.txt delete mode 100644 res/cardsfolder/suture_spirit.txt delete mode 100644 res/cardsfolder/sutured_ghoul.txt delete mode 100644 res/cardsfolder/svogthos_the_restless_tomb.txt delete mode 100644 res/cardsfolder/svyelunite_priest.txt delete mode 100644 res/cardsfolder/svyelunite_temple.txt delete mode 100644 res/cardsfolder/swallowing_plague.txt delete mode 100644 res/cardsfolder/swamp.txt delete mode 100644 res/cardsfolder/swamp_mosquito.txt delete mode 100644 res/cardsfolder/swans_of_bryn_argoll.txt delete mode 100644 res/cardsfolder/swarm_of_rats.txt delete mode 100644 res/cardsfolder/swarmyard.txt delete mode 100644 res/cardsfolder/swat.txt delete mode 100644 res/cardsfolder/sway_of_the_stars.txt delete mode 100644 res/cardsfolder/swelter.txt delete mode 100644 res/cardsfolder/swift_maneuver.txt delete mode 100644 res/cardsfolder/swirling_sandstorm.txt delete mode 100644 res/cardsfolder/sword_dancer.txt delete mode 100644 res/cardsfolder/sword_of_body_and_mind.txt delete mode 100644 res/cardsfolder/sword_of_feast_and_famine.txt delete mode 100644 res/cardsfolder/sword_of_fire_and_ice.txt delete mode 100644 res/cardsfolder/sword_of_kaldra.txt delete mode 100644 res/cardsfolder/sword_of_light_and_shadow.txt delete mode 100644 res/cardsfolder/sword_of_the_chosen.txt delete mode 100644 res/cardsfolder/sword_of_the_meek.txt delete mode 100644 res/cardsfolder/sword_of_the_paruns.txt delete mode 100644 res/cardsfolder/sword_of_vengeance.txt delete mode 100644 res/cardsfolder/sword_of_war_and_peace.txt delete mode 100644 res/cardsfolder/swords_to_plowshares.txt delete mode 100644 res/cardsfolder/sygg_river_guide.txt delete mode 100644 res/cardsfolder/sylvan_basilisk.txt delete mode 100644 res/cardsfolder/sylvan_bounty.txt delete mode 100644 res/cardsfolder/sylvan_echoes.txt delete mode 100644 res/cardsfolder/sylvan_library.txt delete mode 100644 res/cardsfolder/sylvan_messenger.txt delete mode 100644 res/cardsfolder/sylvan_might.txt delete mode 100644 res/cardsfolder/sylvan_paradise.txt delete mode 100644 res/cardsfolder/sylvan_ranger.txt delete mode 100644 res/cardsfolder/sylvan_safekeeper.txt delete mode 100644 res/cardsfolder/sylvan_scrying.txt delete mode 100644 res/cardsfolder/sylvan_tutor.txt delete mode 100644 res/cardsfolder/sylvok_explorer.txt delete mode 100644 res/cardsfolder/sylvok_lifestaff.txt delete mode 100644 res/cardsfolder/sylvok_replica.txt delete mode 100644 res/cardsfolder/symbiosis.txt delete mode 100644 res/cardsfolder/symbiotic_beast.txt delete mode 100644 res/cardsfolder/symbiotic_deployment.txt delete mode 100644 res/cardsfolder/symbiotic_elf.txt delete mode 100644 res/cardsfolder/symbiotic_wurm.txt delete mode 100644 res/cardsfolder/symbol_of_unsummoning.txt delete mode 100644 res/cardsfolder/synapse_sliver.txt delete mode 100644 res/cardsfolder/synchronous_sliver.txt delete mode 100644 res/cardsfolder/syncopate.txt delete mode 100644 res/cardsfolder/synod_artificer.txt delete mode 100644 res/cardsfolder/synod_sanctum.txt delete mode 100644 res/cardsfolder/syphon_life.txt delete mode 100644 res/cardsfolder/syphon_soul.txt delete mode 100644 res/cardsfolder/szadek_lord_of_secrets.txt delete mode 100644 res/cardsfolder/tablet_of_epityr.txt delete mode 100644 res/cardsfolder/tahngarth_talruum_hero.txt delete mode 100644 res/cardsfolder/tahngarths_rage.txt delete mode 100644 res/cardsfolder/taiga.txt delete mode 100644 res/cardsfolder/tainted_aether.txt delete mode 100644 res/cardsfolder/tainted_field.txt delete mode 100644 res/cardsfolder/tainted_isle.txt delete mode 100644 res/cardsfolder/tainted_peak.txt delete mode 100644 res/cardsfolder/tainted_strike.txt delete mode 100644 res/cardsfolder/tainted_well.txt delete mode 100644 res/cardsfolder/tainted_wood.txt delete mode 100644 res/cardsfolder/taj_nar_swordsmith.txt delete mode 100644 res/cardsfolder/tajuru_archer.txt delete mode 100644 res/cardsfolder/take_possession.txt delete mode 100644 res/cardsfolder/takenos_cavalry.txt delete mode 100644 res/cardsfolder/takenuma_bleeder.txt delete mode 100644 res/cardsfolder/talas_air_ship.txt delete mode 100644 res/cardsfolder/talas_explorer.txt delete mode 100644 res/cardsfolder/talas_merchant.txt delete mode 100644 res/cardsfolder/talas_researcher.txt delete mode 100644 res/cardsfolder/talas_scout.txt delete mode 100644 res/cardsfolder/talas_warrior.txt delete mode 100644 res/cardsfolder/talisman_of_dominance.txt delete mode 100644 res/cardsfolder/talisman_of_impulse.txt delete mode 100644 res/cardsfolder/talisman_of_indulgence.txt delete mode 100644 res/cardsfolder/talisman_of_progress.txt delete mode 100644 res/cardsfolder/talisman_of_unity.txt delete mode 100644 res/cardsfolder/tallowisp.txt delete mode 100644 res/cardsfolder/talon_sliver.txt delete mode 100644 res/cardsfolder/talon_trooper.txt delete mode 100644 res/cardsfolder/talonrend.txt delete mode 100644 res/cardsfolder/talruum_champion.txt delete mode 100644 res/cardsfolder/talruum_minotaur.txt delete mode 100644 res/cardsfolder/talus_paladin.txt delete mode 100644 res/cardsfolder/tamanoa.txt delete mode 100644 res/cardsfolder/tangle_asp.txt delete mode 100644 res/cardsfolder/tangle_golem.txt delete mode 100644 res/cardsfolder/tangle_hulk.txt delete mode 100644 res/cardsfolder/tangle_mantis.txt delete mode 100644 res/cardsfolder/tangle_spider.txt delete mode 100644 res/cardsfolder/tangle_wire.txt delete mode 100644 res/cardsfolder/tanglebloom.txt delete mode 100644 res/cardsfolder/tangleroot.txt delete mode 100644 res/cardsfolder/tanglewalker.txt delete mode 100644 res/cardsfolder/taoist_hermit.txt delete mode 100644 res/cardsfolder/taoist_mystic.txt delete mode 100644 res/cardsfolder/tar_pit_warrior.txt delete mode 100644 res/cardsfolder/tar_pitcher.txt delete mode 100644 res/cardsfolder/tarfire.txt delete mode 100644 res/cardsfolder/tarmogoyf.txt delete mode 100644 res/cardsfolder/tarnished_citadel.txt delete mode 100644 res/cardsfolder/tarox_bladewing.txt delete mode 100644 res/cardsfolder/tarpan.txt delete mode 100755 res/cardsfolder/task_force.txt delete mode 100644 res/cardsfolder/task_mage_assembly.txt delete mode 100644 res/cardsfolder/taste_for_mayhem.txt delete mode 100644 res/cardsfolder/tattered_drake.txt delete mode 100644 res/cardsfolder/tatterkite.txt delete mode 100644 res/cardsfolder/tattermunge_duo.txt delete mode 100644 res/cardsfolder/tattermunge_maniac.txt delete mode 100644 res/cardsfolder/tattermunge_witch.txt delete mode 100644 res/cardsfolder/taunting_challenge.txt delete mode 100644 res/cardsfolder/taunting_elf.txt delete mode 100644 res/cardsfolder/taurean_mauler.txt delete mode 100644 res/cardsfolder/tawnoss_wand.txt delete mode 100644 res/cardsfolder/teardrop_kami.txt delete mode 100644 res/cardsfolder/tears_of_rage.txt delete mode 100644 res/cardsfolder/tectonic_break.txt delete mode 100644 res/cardsfolder/tectonic_edge.txt delete mode 100644 res/cardsfolder/tectonic_fiend.txt delete mode 100644 res/cardsfolder/tectonic_instability.txt delete mode 100644 res/cardsfolder/teekas_dragon.txt delete mode 100644 res/cardsfolder/teetering_peaks.txt delete mode 100644 res/cardsfolder/teferis_puzzle_box.txt delete mode 100644 res/cardsfolder/teferis_response.txt delete mode 100644 res/cardsfolder/tek.txt delete mode 100644 res/cardsfolder/tel_jilad_archers.txt delete mode 100644 res/cardsfolder/tel_jilad_chosen.txt delete mode 100644 res/cardsfolder/tel_jilad_defiance.txt delete mode 100644 res/cardsfolder/tel_jilad_exile.txt delete mode 100644 res/cardsfolder/tel_jilad_fallen.txt delete mode 100644 res/cardsfolder/tel_jilad_justice.txt delete mode 100644 res/cardsfolder/tel_jilad_lifebreather.txt delete mode 100644 res/cardsfolder/tel_jilad_outrider.txt delete mode 100644 res/cardsfolder/tel_jilad_wolf.txt delete mode 100644 res/cardsfolder/telekinetic_bonds.txt delete mode 100644 res/cardsfolder/telekinetic_sliver.txt delete mode 100644 res/cardsfolder/telepathic_spies.txt delete mode 100644 res/cardsfolder/telethopter.txt delete mode 100644 res/cardsfolder/telimtor.txt delete mode 100644 res/cardsfolder/telimtors_darts.txt delete mode 100644 res/cardsfolder/telimtors_edict.txt delete mode 100644 res/cardsfolder/teller_of_tales.txt delete mode 100644 res/cardsfolder/telling_time.txt delete mode 100644 res/cardsfolder/tempered_steel.txt delete mode 100644 res/cardsfolder/tempest_drake.txt delete mode 100644 res/cardsfolder/tempest_of_light.txt delete mode 100644 res/cardsfolder/tempest_owl.txt delete mode 100644 res/cardsfolder/temple_acolyte.txt delete mode 100644 res/cardsfolder/temple_bell.txt delete mode 100644 res/cardsfolder/temple_elder.txt delete mode 100644 res/cardsfolder/temple_garden.txt delete mode 100644 res/cardsfolder/temple_of_the_false_god.txt delete mode 100644 res/cardsfolder/temporal_adept.txt delete mode 100644 res/cardsfolder/temporal_aperture.txt delete mode 100644 res/cardsfolder/temporal_eddy.txt delete mode 100644 res/cardsfolder/temporal_fissure.txt delete mode 100644 res/cardsfolder/temporal_isolation.txt delete mode 100644 res/cardsfolder/temporal_manipulation.txt delete mode 100644 res/cardsfolder/temporal_spring.txt delete mode 100644 res/cardsfolder/temporary_insanity.txt delete mode 100644 res/cardsfolder/tempting_wurm.txt delete mode 100644 res/cardsfolder/tendo_ice_bridge.txt delete mode 100644 res/cardsfolder/tendrils_of_agony.txt delete mode 100644 res/cardsfolder/tendrils_of_corruption.txt delete mode 100644 res/cardsfolder/tendrils_of_despair.txt delete mode 100644 res/cardsfolder/teneb_the_harvester.txt delete mode 100644 res/cardsfolder/tenza_godos_maul.txt delete mode 100644 res/cardsfolder/tephraderm.txt delete mode 100644 res/cardsfolder/terashis_cry.txt delete mode 100644 res/cardsfolder/terashis_grasp.txt delete mode 100644 res/cardsfolder/terashis_verdict.txt delete mode 100644 res/cardsfolder/terminal_moraine.txt delete mode 100644 res/cardsfolder/terminate.txt delete mode 100644 res/cardsfolder/terohs_faithful.txt delete mode 100644 res/cardsfolder/terohs_vanguard.txt delete mode 100644 res/cardsfolder/terra_eternal.txt delete mode 100644 res/cardsfolder/terra_stomper.txt delete mode 100644 res/cardsfolder/terrain_generator.txt delete mode 100644 res/cardsfolder/terramorphic_expanse.txt delete mode 100644 res/cardsfolder/terravore.txt delete mode 100644 res/cardsfolder/territorial_baloth.txt delete mode 100644 res/cardsfolder/terror.txt delete mode 100644 res/cardsfolder/test_of_endurance.txt delete mode 100644 res/cardsfolder/testament_of_faith.txt delete mode 100644 res/cardsfolder/tethered_griffin.txt delete mode 100644 res/cardsfolder/tethered_skirge.txt delete mode 100644 res/cardsfolder/tetsuo_umezawa.txt delete mode 100644 res/cardsfolder/teysa_orzhov_scion.txt delete mode 100644 res/cardsfolder/tezzeret_agent_of_bolas.txt delete mode 100644 res/cardsfolder/tezzeret_the_seeker.txt delete mode 100644 res/cardsfolder/tezzerets_gambit.txt delete mode 100644 res/cardsfolder/thalakos_deceiver.txt delete mode 100644 res/cardsfolder/thalakos_drifters.txt delete mode 100644 res/cardsfolder/thalakos_lowlands.txt delete mode 100644 res/cardsfolder/thalakos_mistfolk.txt delete mode 100644 res/cardsfolder/thalakos_scout.txt delete mode 100644 res/cardsfolder/thalakos_seer.txt delete mode 100644 res/cardsfolder/thalakos_sentry.txt delete mode 100644 res/cardsfolder/thallid.txt delete mode 100644 res/cardsfolder/thallid_devourer.txt delete mode 100644 res/cardsfolder/thallid_germinator.txt delete mode 100644 res/cardsfolder/thallid_shell_dweller.txt delete mode 100644 res/cardsfolder/that_which_was_taken.txt delete mode 100644 res/cardsfolder/thaumatog.txt delete mode 100644 res/cardsfolder/thawing_glaciers.txt delete mode 100644 res/cardsfolder/the_abyss.txt delete mode 100644 res/cardsfolder/the_brute.txt delete mode 100644 res/cardsfolder/the_hive.txt delete mode 100644 res/cardsfolder/the_lady_of_the_mountain.txt delete mode 100644 res/cardsfolder/the_rack.txt delete mode 100644 res/cardsfolder/the_tabernacle_at_pendrell_vale.txt delete mode 100644 res/cardsfolder/the_unspeakable.txt delete mode 100644 res/cardsfolder/theft_of_dreams.txt delete mode 100644 res/cardsfolder/thelonite_hermit.txt delete mode 100644 res/cardsfolder/thermal_blast.txt delete mode 100644 res/cardsfolder/thermal_glider.txt delete mode 100644 res/cardsfolder/thermal_navigator.txt delete mode 100644 res/cardsfolder/thermokarst.txt delete mode 100644 res/cardsfolder/thermopod.txt delete mode 100644 res/cardsfolder/thicket_basilisk.txt delete mode 100644 res/cardsfolder/thief_of_hope.txt delete mode 100644 res/cardsfolder/thieving_magpie.txt delete mode 100644 res/cardsfolder/think_tank.txt delete mode 100644 res/cardsfolder/think_twice.txt delete mode 100644 res/cardsfolder/thirst.txt delete mode 100644 res/cardsfolder/thirst_for_knowledge.txt delete mode 100644 res/cardsfolder/thistledown_duo.txt delete mode 100644 res/cardsfolder/thistledown_liege.txt delete mode 100644 res/cardsfolder/thopter_assembly.txt delete mode 100644 res/cardsfolder/thopter_foundry.txt delete mode 100644 res/cardsfolder/thopter_squadron.txt delete mode 100644 res/cardsfolder/thorn_of_amethyst.txt delete mode 100644 res/cardsfolder/thorn_thallid.txt delete mode 100644 res/cardsfolder/thorn_thrash_viashino.txt delete mode 100644 res/cardsfolder/thornling.txt delete mode 100644 res/cardsfolder/thornscape_apprentice.txt delete mode 100644 res/cardsfolder/thornscape_familiar.txt delete mode 100644 res/cardsfolder/thornscape_master.txt delete mode 100644 res/cardsfolder/thorntooth_witch.txt delete mode 100644 res/cardsfolder/thornwatch_scarecrow.txt delete mode 100644 res/cardsfolder/thornweald_archer.txt delete mode 100644 res/cardsfolder/thornwind_faeries.txt delete mode 100644 res/cardsfolder/thought_courier.txt delete mode 100644 res/cardsfolder/thought_devourer.txt delete mode 100644 res/cardsfolder/thought_eater.txt delete mode 100644 res/cardsfolder/thought_nibbler.txt delete mode 100644 res/cardsfolder/thoughtbind.txt delete mode 100644 res/cardsfolder/thoughtcast.txt delete mode 100644 res/cardsfolder/thoughtcutter_agent.txt delete mode 100644 res/cardsfolder/thoughtleech.txt delete mode 100644 res/cardsfolder/thoughtpicker_witch.txt delete mode 100644 res/cardsfolder/thoughtseize.txt delete mode 100644 res/cardsfolder/thoughtweft_gambit.txt delete mode 100644 res/cardsfolder/thousand_legged_kami.txt delete mode 100644 res/cardsfolder/thran_dynamo.txt delete mode 100644 res/cardsfolder/thran_forge.txt delete mode 100644 res/cardsfolder/thran_foundry.txt delete mode 100644 res/cardsfolder/thran_golem.txt delete mode 100644 res/cardsfolder/thran_lens.txt delete mode 100644 res/cardsfolder/thran_quarry.txt delete mode 100644 res/cardsfolder/thran_war_machine.txt delete mode 100644 res/cardsfolder/thrashing_mudspawn.txt delete mode 100644 res/cardsfolder/thrashing_wumpus.txt delete mode 100644 res/cardsfolder/thraximundar.txt delete mode 100644 res/cardsfolder/threads_of_disloyalty.txt delete mode 100644 res/cardsfolder/threaten.txt delete mode 100644 res/cardsfolder/three_tragedies.txt delete mode 100644 res/cardsfolder/three_visits.txt delete mode 100644 res/cardsfolder/thresher_beast.txt delete mode 100644 res/cardsfolder/thrill_of_the_hunt.txt delete mode 100644 res/cardsfolder/thriss_nantuko_primus.txt delete mode 100644 res/cardsfolder/thrive.txt delete mode 100644 res/cardsfolder/throat_slitter.txt delete mode 100644 res/cardsfolder/throne_of_bone.txt delete mode 100644 res/cardsfolder/throne_of_geth.txt delete mode 100644 res/cardsfolder/thrull_champion.txt delete mode 100644 res/cardsfolder/thrull_surgeon.txt delete mode 100644 res/cardsfolder/thrumming_stone.txt delete mode 100644 res/cardsfolder/thrummingbird.txt delete mode 100644 res/cardsfolder/thrun_the_last_troll.txt delete mode 100644 res/cardsfolder/thunder_dragon.txt delete mode 100644 res/cardsfolder/thunder_of_hooves.txt delete mode 100644 res/cardsfolder/thunder_spirit.txt delete mode 100644 res/cardsfolder/thunder_strike.txt delete mode 100644 res/cardsfolder/thunder_thrash_elder.txt delete mode 100644 res/cardsfolder/thunder_wall.txt delete mode 100644 res/cardsfolder/thunderblust.txt delete mode 100644 res/cardsfolder/thunderbolt.txt delete mode 100644 res/cardsfolder/thunderclap.txt delete mode 100644 res/cardsfolder/thundercloud_elemental.txt delete mode 100644 res/cardsfolder/thundercloud_shaman.txt delete mode 100644 res/cardsfolder/thunderheads.txt delete mode 100644 res/cardsfolder/thundering_giant.txt delete mode 100644 res/cardsfolder/thundering_tanadon.txt delete mode 100644 res/cardsfolder/thundermare.txt delete mode 100644 res/cardsfolder/thunderscape_apprentice.txt delete mode 100644 res/cardsfolder/thunderscape_familiar.txt delete mode 100644 res/cardsfolder/thunderscape_master.txt delete mode 100644 res/cardsfolder/thundersong_trumpeter.txt delete mode 100644 res/cardsfolder/thwart.txt delete mode 100644 res/cardsfolder/tibor_and_lumia.txt delete mode 100644 res/cardsfolder/ticking_gnomes.txt delete mode 100644 res/cardsfolder/tidal_bore.txt delete mode 100644 res/cardsfolder/tidal_control.txt delete mode 100644 res/cardsfolder/tidal_courier.txt delete mode 100644 res/cardsfolder/tidal_kraken.txt delete mode 100644 res/cardsfolder/tidal_surge.txt delete mode 100644 res/cardsfolder/tidal_wave.txt delete mode 100644 res/cardsfolder/tideforce_elemental.txt delete mode 100644 res/cardsfolder/tidehollow_sculler.txt delete mode 100644 res/cardsfolder/tidehollow_strix.txt delete mode 100644 res/cardsfolder/tidespout_tyrant.txt delete mode 100644 res/cardsfolder/tidings.txt delete mode 100644 res/cardsfolder/tiger_claws.txt delete mode 100644 res/cardsfolder/tigereye_cameo.txt delete mode 100644 res/cardsfolder/tilling_treefolk.txt delete mode 100644 res/cardsfolder/timber_protector.txt delete mode 100644 res/cardsfolder/timberland_ruins.txt delete mode 100644 res/cardsfolder/timberline_ridge.txt delete mode 100644 res/cardsfolder/timbermare.txt delete mode 100644 res/cardsfolder/timbermaw_larva.txt delete mode 100644 res/cardsfolder/timberwatch_elf.txt delete mode 100644 res/cardsfolder/time_bomb.txt delete mode 100644 res/cardsfolder/time_ebb.txt delete mode 100644 res/cardsfolder/time_elemental.txt delete mode 100644 res/cardsfolder/time_of_heroes.txt delete mode 100644 res/cardsfolder/time_of_need.txt delete mode 100644 res/cardsfolder/time_reversal.txt delete mode 100644 res/cardsfolder/time_sieve.txt delete mode 100644 res/cardsfolder/time_spiral.txt delete mode 100644 res/cardsfolder/time_stretch.txt delete mode 100644 res/cardsfolder/time_vault.txt delete mode 100644 res/cardsfolder/time_walk.txt delete mode 100644 res/cardsfolder/time_warp.txt delete mode 100644 res/cardsfolder/timetwister.txt delete mode 100644 res/cardsfolder/timid_drake.txt delete mode 100644 res/cardsfolder/tin_wing_chimera.txt delete mode 100644 res/cardsfolder/tinder_farm.txt delete mode 100644 res/cardsfolder/tinder_wall.txt delete mode 100644 res/cardsfolder/tine_shrike.txt delete mode 100644 res/cardsfolder/tinker.txt delete mode 100644 res/cardsfolder/tireless_missionaries.txt delete mode 100644 res/cardsfolder/tireless_tribe.txt delete mode 100644 res/cardsfolder/titan_forge.txt delete mode 100644 res/cardsfolder/titanias_boon.txt delete mode 100644 res/cardsfolder/titanias_chosen.txt delete mode 100644 res/cardsfolder/titanias_song.txt delete mode 100644 res/cardsfolder/titanic_bulvox.txt delete mode 100644 res/cardsfolder/titanic_ultimatum.txt delete mode 100644 res/cardsfolder/titanium_golem.txt delete mode 100644 res/cardsfolder/titans_revenge.txt delete mode 100644 res/cardsfolder/tithe.txt delete mode 100644 res/cardsfolder/tivadar_of_thorn.txt delete mode 100644 res/cardsfolder/tivadars_crusade.txt delete mode 100644 res/cardsfolder/to_arms.txt delete mode 100644 res/cardsfolder/tobias_andrion.txt delete mode 100644 res/cardsfolder/toil_to_renown.txt delete mode 100644 res/cardsfolder/toils_of_night_and_day.txt delete mode 100644 res/cardsfolder/tolaria_west.txt delete mode 100644 res/cardsfolder/tolarian_academy.txt delete mode 100644 res/cardsfolder/tolarian_emissary.txt delete mode 100644 res/cardsfolder/tolarian_entrancer.txt delete mode 100644 res/cardsfolder/tolarian_serpent.txt delete mode 100644 res/cardsfolder/tolsimir_wolfblood.txt delete mode 100644 res/cardsfolder/tomb_of_urami.txt delete mode 100644 res/cardsfolder/tome_scour.txt delete mode 100644 res/cardsfolder/tonic_peddler.txt delete mode 100644 res/cardsfolder/tooth_of_chiss_goria.txt delete mode 100644 res/cardsfolder/tooth_of_ramos.txt delete mode 100644 res/cardsfolder/topan_ascetic.txt delete mode 100644 res/cardsfolder/tor_giant.txt delete mode 100644 res/cardsfolder/tor_wauki.txt delete mode 100644 res/cardsfolder/torch_drake.txt delete mode 100644 res/cardsfolder/torch_slinger.txt delete mode 100644 res/cardsfolder/torch_song.txt delete mode 100644 res/cardsfolder/torii_watchward.txt delete mode 100644 res/cardsfolder/torment.txt delete mode 100644 res/cardsfolder/tormented_angel.txt delete mode 100644 res/cardsfolder/tormods_crypt.txt delete mode 100644 res/cardsfolder/torpor_dust.txt delete mode 100644 res/cardsfolder/torrent_of_fire.txt delete mode 100644 res/cardsfolder/torsten_von_ursus.txt delete mode 100644 res/cardsfolder/tortoise_formation.txt delete mode 100644 res/cardsfolder/torture.txt delete mode 100644 res/cardsfolder/tortured_existence.txt delete mode 100644 res/cardsfolder/totem_guide_hartebeest.txt delete mode 100644 res/cardsfolder/totem_speaker.txt delete mode 100644 res/cardsfolder/touch_of_brilliance.txt delete mode 100644 res/cardsfolder/touch_of_darkness.txt delete mode 100644 res/cardsfolder/touch_of_death.txt delete mode 100644 res/cardsfolder/touch_of_invisibility.txt delete mode 100644 res/cardsfolder/touchstone.txt delete mode 100644 res/cardsfolder/tower_drake.txt delete mode 100644 res/cardsfolder/tower_gargoyle.txt delete mode 100644 res/cardsfolder/tower_of_calamities.txt delete mode 100644 res/cardsfolder/tower_of_champions.txt delete mode 100644 res/cardsfolder/tower_of_coireall.txt delete mode 100644 res/cardsfolder/tower_of_eons.txt delete mode 100644 res/cardsfolder/tower_of_fortunes.txt delete mode 100644 res/cardsfolder/tower_of_murmurs.txt delete mode 100644 res/cardsfolder/tower_of_the_magistrate.txt delete mode 100644 res/cardsfolder/towering_baloth.txt delete mode 100644 res/cardsfolder/toxic_iguanar.txt delete mode 100644 res/cardsfolder/toxic_nim.txt delete mode 100644 res/cardsfolder/toxin_sliver.txt delete mode 100644 res/cardsfolder/toymaker.txt delete mode 100644 res/cardsfolder/tracker.txt delete mode 100644 res/cardsfolder/trade_caravan.txt delete mode 100644 res/cardsfolder/trade_routes.txt delete mode 100644 res/cardsfolder/tradewind_rider.txt delete mode 100644 res/cardsfolder/tragic_poet.txt delete mode 100644 res/cardsfolder/trailblazer.txt delete mode 100644 res/cardsfolder/trailblazers_boots.txt delete mode 100644 res/cardsfolder/trained_armodon.txt delete mode 100644 res/cardsfolder/trained_cheetah.txt delete mode 100644 res/cardsfolder/trained_jackal.txt delete mode 100644 res/cardsfolder/trained_orgg.txt delete mode 100644 res/cardsfolder/trained_pronghorn.txt delete mode 100644 res/cardsfolder/training_drone.txt delete mode 100644 res/cardsfolder/training_grounds.txt delete mode 100644 res/cardsfolder/traitorous_instinct.txt delete mode 100644 res/cardsfolder/tranquil_domain.txt delete mode 100644 res/cardsfolder/tranquil_garden.txt delete mode 100644 res/cardsfolder/tranquil_grove.txt delete mode 100644 res/cardsfolder/tranquil_path.txt delete mode 100644 res/cardsfolder/tranquil_thicket.txt delete mode 100644 res/cardsfolder/tranquility.txt delete mode 100644 res/cardsfolder/transcendent_master.txt delete mode 100644 res/cardsfolder/transguild_courier.txt delete mode 100644 res/cardsfolder/transluminant.txt delete mode 100644 res/cardsfolder/transmutation.txt delete mode 100644 res/cardsfolder/trap_digger.txt delete mode 100644 res/cardsfolder/trapjaw_kelpie.txt delete mode 100644 res/cardsfolder/trapmakers_snare.txt delete mode 100644 res/cardsfolder/traproot_kami.txt delete mode 100644 res/cardsfolder/trash_for_treasure.txt delete mode 100644 res/cardsfolder/traumatic_visions.txt delete mode 100644 res/cardsfolder/traumatize.txt delete mode 100644 res/cardsfolder/treacherous_link.txt delete mode 100644 res/cardsfolder/treachery.txt delete mode 100644 res/cardsfolder/treasure_hunter.txt delete mode 100644 res/cardsfolder/treasure_mage.txt delete mode 100644 res/cardsfolder/treasure_trove.txt delete mode 100644 res/cardsfolder/tree_monkey.txt delete mode 100644 res/cardsfolder/tree_of_tales.txt delete mode 100644 res/cardsfolder/treefolk_harbinger.txt delete mode 100644 res/cardsfolder/treefolk_seedlings.txt delete mode 100644 res/cardsfolder/treespring_lorian.txt delete mode 100644 res/cardsfolder/treetop_bracers.txt delete mode 100644 res/cardsfolder/treetop_rangers.txt delete mode 100644 res/cardsfolder/treetop_scout.txt delete mode 100644 res/cardsfolder/treetop_sentinel.txt delete mode 100644 res/cardsfolder/treetop_village.txt delete mode 100644 res/cardsfolder/tremble.txt delete mode 100644 res/cardsfolder/tremor.txt delete mode 100644 res/cardsfolder/trench_wurm.txt delete mode 100644 res/cardsfolder/trenching_steed.txt delete mode 100644 res/cardsfolder/trespassing_souleater.txt delete mode 100644 res/cardsfolder/tresserhorn_sinks.txt delete mode 100644 res/cardsfolder/tresserhorn_skyknight.txt delete mode 100644 res/cardsfolder/treva_the_renewer.txt delete mode 100644 res/cardsfolder/trevas_attendant.txt delete mode 100644 res/cardsfolder/trevas_charm.txt delete mode 100644 res/cardsfolder/trevas_ruins.txt delete mode 100644 res/cardsfolder/triangle_of_war.txt delete mode 100644 res/cardsfolder/tribal_flames.txt delete mode 100644 res/cardsfolder/tribal_forcemage.txt delete mode 100644 res/cardsfolder/tribal_golem.txt delete mode 100644 res/cardsfolder/trickster_mage.txt delete mode 100644 res/cardsfolder/triclopean_sight.txt delete mode 100644 res/cardsfolder/trigon_of_corruption.txt delete mode 100644 res/cardsfolder/trigon_of_infestation.txt delete mode 100644 res/cardsfolder/trigon_of_mending.txt delete mode 100644 res/cardsfolder/trigon_of_rage.txt delete mode 100644 res/cardsfolder/trigon_of_thought.txt delete mode 100644 res/cardsfolder/trinket_mage.txt delete mode 100644 res/cardsfolder/trip_noose.txt delete mode 100644 res/cardsfolder/trip_wire.txt delete mode 100644 res/cardsfolder/triskelavus.txt delete mode 100644 res/cardsfolder/triskelion.txt delete mode 100644 res/cardsfolder/triumph_of_the_hordes.txt delete mode 100644 res/cardsfolder/trokin_high_guard.txt delete mode 100644 res/cardsfolder/troll_ascetic.txt delete mode 100644 res/cardsfolder/troll_horn_cameo.txt delete mode 100644 res/cardsfolder/trolls_of_tel_jilad.txt delete mode 100644 res/cardsfolder/tromp_the_domains.txt delete mode 100644 res/cardsfolder/tropical_island.txt delete mode 100644 res/cardsfolder/tropical_storm.txt delete mode 100644 res/cardsfolder/troublesome_spirit.txt delete mode 100644 res/cardsfolder/true_conviction.txt delete mode 100644 res/cardsfolder/trumpet_blast.txt delete mode 100644 res/cardsfolder/trusted_advisor.txt delete mode 100644 res/cardsfolder/trusty_machete.txt delete mode 100644 res/cardsfolder/trygon_predator.txt delete mode 100644 res/cardsfolder/tsabo_tavoc.txt delete mode 100644 res/cardsfolder/tsunami.txt delete mode 100644 res/cardsfolder/tukatongue_thallid.txt delete mode 100644 res/cardsfolder/tuknir_deathlock.txt delete mode 100644 res/cardsfolder/tuktuk_grunts.txt delete mode 100644 res/cardsfolder/tuktuk_the_explorer.txt delete mode 100644 res/cardsfolder/tumble_magnet.txt delete mode 100644 res/cardsfolder/tundra.txt delete mode 100644 res/cardsfolder/tundra_wolves.txt delete mode 100644 res/cardsfolder/tunnel.txt delete mode 100644 res/cardsfolder/tunneler_wurm.txt delete mode 100644 res/cardsfolder/turn_aside.txt delete mode 100644 res/cardsfolder/turn_the_tide.txt delete mode 100644 res/cardsfolder/turn_to_dust.txt delete mode 100644 res/cardsfolder/turn_to_mist.txt delete mode 100644 res/cardsfolder/turn_to_slag.txt delete mode 100644 res/cardsfolder/turnabout.txt delete mode 100644 res/cardsfolder/turntimber_grove.txt delete mode 100644 res/cardsfolder/turntimber_ranger.txt delete mode 100644 res/cardsfolder/turtleshell_changeling.txt delete mode 100644 res/cardsfolder/twiddle.txt delete mode 100644 res/cardsfolder/twigwalker.txt delete mode 100644 res/cardsfolder/twilight_drover.txt delete mode 100644 res/cardsfolder/twilight_mire.txt delete mode 100644 res/cardsfolder/twinblade_slasher.txt delete mode 100644 res/cardsfolder/twincast.txt delete mode 100644 res/cardsfolder/twisted_abomination.txt delete mode 100644 res/cardsfolder/twisted_experiment.txt delete mode 100644 res/cardsfolder/twisted_image.txt delete mode 100644 res/cardsfolder/twitch.txt delete mode 100644 res/cardsfolder/typhoon.txt delete mode 100644 res/cardsfolder/tyrranax.txt delete mode 100644 res/cardsfolder/uktabi_drake.txt delete mode 100644 res/cardsfolder/uktabi_efreet.txt delete mode 100644 res/cardsfolder/uktabi_faerie.txt delete mode 100644 res/cardsfolder/uktabi_orangutan.txt delete mode 100644 res/cardsfolder/uktabi_wildcats.txt delete mode 100644 res/cardsfolder/ulamog_the_infinite_gyre.txt delete mode 100644 res/cardsfolder/ulamogs_crusher.txt delete mode 100644 res/cardsfolder/umara_raptor.txt delete mode 100644 res/cardsfolder/umbra_stalker.txt delete mode 100644 res/cardsfolder/umbral_mantle.txt delete mode 100644 res/cardsfolder/umezawas_jitte.txt delete mode 100644 res/cardsfolder/unbender_tine.txt delete mode 100644 res/cardsfolder/unburden.txt delete mode 100644 res/cardsfolder/uncle_istvan.txt delete mode 100644 res/cardsfolder/uncontrollable_anger.txt delete mode 100644 res/cardsfolder/undead_gladiator.txt delete mode 100644 res/cardsfolder/undead_leotau.txt delete mode 100644 res/cardsfolder/undead_slayer.txt delete mode 100644 res/cardsfolder/undead_warchief.txt delete mode 100644 res/cardsfolder/undercity_shade.txt delete mode 100644 res/cardsfolder/underground_river.txt delete mode 100644 res/cardsfolder/underground_sea.txt delete mode 100644 res/cardsfolder/undergrowth.txt delete mode 100644 res/cardsfolder/undermine.txt delete mode 100644 res/cardsfolder/undertaker.txt delete mode 100644 res/cardsfolder/undertow.txt delete mode 100644 res/cardsfolder/underworld_dreams.txt delete mode 100644 res/cardsfolder/undiscovered_paradise.txt delete mode 100644 res/cardsfolder/undo.txt delete mode 100644 res/cardsfolder/undying_beast.txt delete mode 100644 res/cardsfolder/undying_rage.txt delete mode 100644 res/cardsfolder/unearth.txt delete mode 100644 res/cardsfolder/unearthly_blizzard.txt delete mode 100644 res/cardsfolder/unfulfilled_desires.txt delete mode 100644 res/cardsfolder/unhinge.txt delete mode 100644 res/cardsfolder/unholy_grotto.txt delete mode 100644 res/cardsfolder/unholy_strength.txt delete mode 100644 res/cardsfolder/unifying_theory.txt delete mode 100644 res/cardsfolder/unlikely_alliance.txt delete mode 100644 res/cardsfolder/unliving_psychopath.txt delete mode 100644 res/cardsfolder/unmake.txt delete mode 100644 res/cardsfolder/unmask.txt delete mode 100644 res/cardsfolder/unnatural_predation.txt delete mode 100644 res/cardsfolder/unnatural_speed.txt delete mode 100644 res/cardsfolder/unnerve.txt delete mode 100644 res/cardsfolder/unquestioned_authority.txt delete mode 100644 res/cardsfolder/unseen_walker.txt delete mode 100644 res/cardsfolder/unspeakable_symbol.txt delete mode 100644 res/cardsfolder/unstable_hulk.txt delete mode 100644 res/cardsfolder/unstable_mutation.txt delete mode 100644 res/cardsfolder/unsummon.txt delete mode 100644 res/cardsfolder/untamed_might.txt delete mode 100644 res/cardsfolder/untamed_wilds.txt delete mode 100644 res/cardsfolder/unwilling_recruit.txt delete mode 100644 res/cardsfolder/unwinding_clock.txt delete mode 100644 res/cardsfolder/unworthy_dead.txt delete mode 100644 res/cardsfolder/unyaro_bee_sting.txt delete mode 100644 res/cardsfolder/unyaro_bees.txt delete mode 100644 res/cardsfolder/unyaro_griffin.txt delete mode 100644 res/cardsfolder/updraft.txt delete mode 100644 res/cardsfolder/upheaval.txt delete mode 100644 res/cardsfolder/uproot.txt delete mode 100644 res/cardsfolder/upwelling.txt delete mode 100644 res/cardsfolder/ur_drago.txt delete mode 100644 res/cardsfolder/ur_golems_eye.txt delete mode 100644 res/cardsfolder/urabrask_the_hidden.txt delete mode 100644 res/cardsfolder/urborg_drake.txt delete mode 100644 res/cardsfolder/urborg_elf.txt delete mode 100644 res/cardsfolder/urborg_emissary.txt delete mode 100644 res/cardsfolder/urborg_justice.txt delete mode 100644 res/cardsfolder/urborg_mindsucker.txt delete mode 100644 res/cardsfolder/urborg_phantom.txt delete mode 100644 res/cardsfolder/urborg_shambler.txt delete mode 100644 res/cardsfolder/urborg_skeleton.txt delete mode 100644 res/cardsfolder/urborg_stalker.txt delete mode 100644 res/cardsfolder/urborg_syphon_mage.txt delete mode 100644 res/cardsfolder/urborg_tomb_of_yawgmoth.txt delete mode 100644 res/cardsfolder/urborg_uprising.txt delete mode 100644 res/cardsfolder/urborg_volcano.txt delete mode 100644 res/cardsfolder/uril_the_miststalker.txt delete mode 100644 res/cardsfolder/ursapine.txt delete mode 100644 res/cardsfolder/urzas_armor.txt delete mode 100644 res/cardsfolder/urzas_blueprints.txt delete mode 100644 res/cardsfolder/urzas_chalice.txt delete mode 100644 res/cardsfolder/urzas_factory.txt delete mode 100644 res/cardsfolder/urzas_guilt.txt delete mode 100644 res/cardsfolder/urzas_mine.txt delete mode 100644 res/cardsfolder/urzas_power_plant.txt delete mode 100644 res/cardsfolder/urzas_rage.txt delete mode 100644 res/cardsfolder/urzas_tower.txt delete mode 100644 res/cardsfolder/uthden_troll.txt delete mode 100644 res/cardsfolder/utopia_mycon.txt delete mode 100644 res/cardsfolder/utopia_tree.txt delete mode 100644 res/cardsfolder/utopia_vow.txt delete mode 100644 res/cardsfolder/utvara_scalper.txt delete mode 100644 res/cardsfolder/uyo_silent_prophet.txt delete mode 100644 res/cardsfolder/vacuumelt.txt delete mode 100644 res/cardsfolder/vaevictis_asmadi.txt delete mode 100644 res/cardsfolder/vagrant_plowbeasts.txt delete mode 100644 res/cardsfolder/valakut_fireboar.txt delete mode 100644 res/cardsfolder/valakut_the_molten_pinnacle.txt delete mode 100644 res/cardsfolder/valeron_outlander.txt delete mode 100644 res/cardsfolder/valiant_guard.txt delete mode 100644 res/cardsfolder/valley_rannet.txt delete mode 100644 res/cardsfolder/valor.txt delete mode 100644 res/cardsfolder/valorous_charge.txt delete mode 100644 res/cardsfolder/vampire_aristocrat.txt delete mode 100644 res/cardsfolder/vampire_bats.txt delete mode 100644 res/cardsfolder/vampire_hexmage.txt delete mode 100644 res/cardsfolder/vampire_hounds.txt delete mode 100644 res/cardsfolder/vampire_lacerator.txt delete mode 100644 res/cardsfolder/vampire_nighthawk.txt delete mode 100644 res/cardsfolder/vampire_nocturnus.txt delete mode 100644 res/cardsfolder/vampires_bite.txt delete mode 100644 res/cardsfolder/vampiric_dragon.txt delete mode 100644 res/cardsfolder/vampiric_embrace.txt delete mode 100644 res/cardsfolder/vampiric_feast.txt delete mode 100644 res/cardsfolder/vampiric_link.txt delete mode 100644 res/cardsfolder/vampiric_sliver.txt delete mode 100644 res/cardsfolder/vampiric_spirit.txt delete mode 100644 res/cardsfolder/vampiric_touch.txt delete mode 100644 res/cardsfolder/vampiric_tutor.txt delete mode 100644 res/cardsfolder/vampirism.txt delete mode 100644 res/cardsfolder/vanquish.txt delete mode 100644 res/cardsfolder/vapor_snag.txt delete mode 100644 res/cardsfolder/varchilds_crusader.txt delete mode 100644 res/cardsfolder/vastwood_animist.txt delete mode 100644 res/cardsfolder/vastwood_gorger.txt delete mode 100644 res/cardsfolder/vastwood_zendikon.txt delete mode 100644 res/cardsfolder/vault_of_whispers.txt delete mode 100644 res/cardsfolder/vault_skirge.txt delete mode 100644 res/cardsfolder/vault_skyward.txt delete mode 100644 res/cardsfolder/vec_townships.txt delete mode 100644 res/cardsfolder/vectis_agents.txt delete mode 100644 res/cardsfolder/vectis_silencers.txt delete mode 100644 res/cardsfolder/vector_asp.txt delete mode 100644 res/cardsfolder/vedalken_aethermage.txt delete mode 100644 res/cardsfolder/vedalken_anatomist.txt delete mode 100644 res/cardsfolder/vedalken_archmage.txt delete mode 100644 res/cardsfolder/vedalken_certarch.txt delete mode 100644 res/cardsfolder/vedalken_dismisser.txt delete mode 100644 res/cardsfolder/vedalken_entrancer.txt delete mode 100644 res/cardsfolder/vedalken_ghoul.txt delete mode 100644 res/cardsfolder/vedalken_heretic.txt delete mode 100644 res/cardsfolder/vedalken_infuser.txt delete mode 100644 res/cardsfolder/vedalken_mastermind.txt delete mode 100644 res/cardsfolder/vedalken_orrery.txt delete mode 100644 res/cardsfolder/vedalken_outlander.txt delete mode 100644 res/cardsfolder/vedalken_plotter.txt delete mode 100644 res/cardsfolder/vedalken_shackles.txt delete mode 100644 res/cardsfolder/veil_of_birds.txt delete mode 100644 res/cardsfolder/veiled_apparition.txt delete mode 100644 res/cardsfolder/vein_drinker.txt delete mode 100644 res/cardsfolder/veinfire_borderpost.txt delete mode 100644 res/cardsfolder/veldrane_of_sengir.txt delete mode 100644 res/cardsfolder/veldt.txt delete mode 100644 res/cardsfolder/venarian_gold.txt delete mode 100644 res/cardsfolder/vendetta.txt delete mode 100644 res/cardsfolder/vendilion_clique.txt delete mode 100644 res/cardsfolder/venerable_kumo.txt delete mode 100644 res/cardsfolder/venerable_monk.txt delete mode 100644 res/cardsfolder/venerated_teacher.txt delete mode 100644 res/cardsfolder/vengeance.txt delete mode 100644 res/cardsfolder/vengeful_dead.txt delete mode 100644 res/cardsfolder/vengeful_dreams.txt delete mode 100644 res/cardsfolder/vengeful_firebrand.txt delete mode 100644 res/cardsfolder/vengevine.txt delete mode 100644 res/cardsfolder/venomous_dragonfly.txt delete mode 100644 res/cardsfolder/venomous_vines.txt delete mode 100644 res/cardsfolder/venomspout_brackus.txt delete mode 100644 res/cardsfolder/venser_the_sojourner.txt delete mode 100644 res/cardsfolder/vensers_journal.txt delete mode 100644 res/cardsfolder/vensers_sliver.txt delete mode 100644 res/cardsfolder/vent_sentinel.txt delete mode 100644 res/cardsfolder/verdant_catacombs.txt delete mode 100644 res/cardsfolder/verdant_eidolon.txt delete mode 100644 res/cardsfolder/verdant_field.txt delete mode 100644 res/cardsfolder/verdant_force.txt delete mode 100644 res/cardsfolder/verdant_touch.txt delete mode 100644 res/cardsfolder/verdigris.txt delete mode 100644 res/cardsfolder/verduran_emissary.txt delete mode 100644 res/cardsfolder/verduran_enchantress.txt delete mode 100644 res/cardsfolder/vermiculos.txt delete mode 100644 res/cardsfolder/vernal_bloom.txt delete mode 100644 res/cardsfolder/vernal_equinox.txt delete mode 100644 res/cardsfolder/vertigo_spawn.txt delete mode 100644 res/cardsfolder/vesper_ghoul.txt delete mode 100644 res/cardsfolder/vesuvan_doppelganger.txt delete mode 100644 res/cardsfolder/veteran_armorer.txt delete mode 100644 res/cardsfolder/veteran_armorsmith.txt delete mode 100644 res/cardsfolder/veteran_brawlers.txt delete mode 100644 res/cardsfolder/veteran_cavalier.txt delete mode 100644 res/cardsfolder/veteran_explorer.txt delete mode 100644 res/cardsfolder/veteran_of_the_depths.txt delete mode 100644 res/cardsfolder/veteran_swordsmith.txt delete mode 100644 res/cardsfolder/veterans_reflexes.txt delete mode 100644 res/cardsfolder/vex.txt delete mode 100644 res/cardsfolder/vexing_beetle.txt delete mode 100644 res/cardsfolder/viashino_bladescout.txt delete mode 100644 res/cardsfolder/viashino_cutthroat.txt delete mode 100644 res/cardsfolder/viashino_fangtail.txt delete mode 100644 res/cardsfolder/viashino_grappler.txt delete mode 100644 res/cardsfolder/viashino_heretic.txt delete mode 100644 res/cardsfolder/viashino_outrider.txt delete mode 100644 res/cardsfolder/viashino_sandscout.txt delete mode 100644 res/cardsfolder/viashino_sandstalker.txt delete mode 100644 res/cardsfolder/viashino_skeleton.txt delete mode 100644 res/cardsfolder/viashino_slasher.txt delete mode 100644 res/cardsfolder/viashino_slaughtermaster.txt delete mode 100644 res/cardsfolder/viashino_spearhunter.txt delete mode 100644 res/cardsfolder/viashino_warrior.txt delete mode 100644 res/cardsfolder/viashino_weaponsmith.txt delete mode 100644 res/cardsfolder/viashivan_dragon.txt delete mode 100644 res/cardsfolder/vibrating_sphere.txt delete mode 100644 res/cardsfolder/vicious_hunger.txt delete mode 100644 res/cardsfolder/vicious_kavu.txt delete mode 100644 res/cardsfolder/victorious_destruction.txt delete mode 100644 res/cardsfolder/victorys_herald.txt delete mode 100644 res/cardsfolder/victual_sliver.txt delete mode 100644 res/cardsfolder/vigean_intuition.txt delete mode 100644 res/cardsfolder/vigil_for_the_lost.txt delete mode 100644 res/cardsfolder/vigilance.txt delete mode 100644 res/cardsfolder/vigilant_drake.txt delete mode 100644 res/cardsfolder/vigilant_martyr.txt delete mode 100644 res/cardsfolder/vigilant_sentry.txt delete mode 100644 res/cardsfolder/vile_deacon.txt delete mode 100644 res/cardsfolder/vile_requiem.txt delete mode 100644 res/cardsfolder/village_elder.txt delete mode 100644 res/cardsfolder/villainous_ogre.txt delete mode 100644 res/cardsfolder/vindicate.txt delete mode 100644 res/cardsfolder/vindictive_mob.txt delete mode 100644 res/cardsfolder/vine_dryad.txt delete mode 100644 res/cardsfolder/vine_trellis.txt delete mode 100644 res/cardsfolder/vinelasher_kudzu.txt delete mode 100644 res/cardsfolder/vines_of_vastwood.txt delete mode 100644 res/cardsfolder/vintara_snapper.txt delete mode 100644 res/cardsfolder/violent_outburst.txt delete mode 100644 res/cardsfolder/violent_ultimatum.txt delete mode 100644 res/cardsfolder/violet_pall.txt delete mode 100644 res/cardsfolder/viral_drake.txt delete mode 100644 res/cardsfolder/viridescent_wisps.txt delete mode 100644 res/cardsfolder/viridian_acolyte.txt delete mode 100644 res/cardsfolder/viridian_betrayers.txt delete mode 100644 res/cardsfolder/viridian_claw.txt delete mode 100644 res/cardsfolder/viridian_corrupter.txt delete mode 100644 res/cardsfolder/viridian_emissary.txt delete mode 100644 res/cardsfolder/viridian_harvest.txt delete mode 100644 res/cardsfolder/viridian_joiner.txt delete mode 100644 res/cardsfolder/viridian_longbow.txt delete mode 100644 res/cardsfolder/viridian_lorebearers.txt delete mode 100644 res/cardsfolder/viridian_revel.txt delete mode 100644 res/cardsfolder/viridian_scout.txt delete mode 100644 res/cardsfolder/viridian_shaman.txt delete mode 100644 res/cardsfolder/viridian_zealot.txt delete mode 100644 res/cardsfolder/virtues_ruin.txt delete mode 100644 res/cardsfolder/virtuous_charge.txt delete mode 100644 res/cardsfolder/virulent_sliver.txt delete mode 100644 res/cardsfolder/virulent_wound.txt delete mode 100644 res/cardsfolder/visara_the_dreadful.txt delete mode 100644 res/cardsfolder/viscera_dragger.txt delete mode 100644 res/cardsfolder/viscera_seer.txt delete mode 100644 res/cardsfolder/viscerid_armor.txt delete mode 100644 res/cardsfolder/viscerid_deepwalker.txt delete mode 100644 res/cardsfolder/viscid_lemures.txt delete mode 100644 res/cardsfolder/viseling.txt delete mode 100644 res/cardsfolder/vision_skeins.txt delete mode 100644 res/cardsfolder/visions.txt delete mode 100644 res/cardsfolder/vital_splicer.txt delete mode 100644 res/cardsfolder/vital_surge.txt delete mode 100644 res/cardsfolder/vitality_charm.txt delete mode 100644 res/cardsfolder/vitalize.txt delete mode 100644 res/cardsfolder/vitalizing_cascade.txt delete mode 100644 res/cardsfolder/vitalizing_wind.txt delete mode 100644 res/cardsfolder/vitaspore_thallid.txt delete mode 100644 res/cardsfolder/vithian_renegades.txt delete mode 100644 res/cardsfolder/vithian_stinger.txt delete mode 100644 res/cardsfolder/vitu_ghazi_the_city_tree.txt delete mode 100644 res/cardsfolder/vivid_crag.txt delete mode 100644 res/cardsfolder/vivid_creek.txt delete mode 100644 res/cardsfolder/vivid_grove.txt delete mode 100644 res/cardsfolder/vivid_marsh.txt delete mode 100644 res/cardsfolder/vivid_meadow.txt delete mode 100644 res/cardsfolder/vivify.txt delete mode 100644 res/cardsfolder/vivisection.txt delete mode 100644 res/cardsfolder/vizzerdrix.txt delete mode 100644 res/cardsfolder/vodalian_hypnotist.txt delete mode 100644 res/cardsfolder/vodalian_knights.txt delete mode 100644 res/cardsfolder/vodalian_mage.txt delete mode 100644 res/cardsfolder/vodalian_merchant.txt delete mode 100644 res/cardsfolder/vodalian_serpent.txt delete mode 100644 res/cardsfolder/vodalian_soldiers.txt delete mode 100644 res/cardsfolder/vodalian_zombie.txt delete mode 100644 res/cardsfolder/voice_of_duty.txt delete mode 100644 res/cardsfolder/voice_of_grace.txt delete mode 100644 res/cardsfolder/voice_of_law.txt delete mode 100644 res/cardsfolder/voice_of_reason.txt delete mode 100644 res/cardsfolder/voice_of_the_woods.txt delete mode 100644 res/cardsfolder/voice_of_truth.txt delete mode 100644 res/cardsfolder/voices_from_the_void.txt delete mode 100644 res/cardsfolder/voidmage_prodigy.txt delete mode 100644 res/cardsfolder/voidslime.txt delete mode 100644 res/cardsfolder/volcanic_awakening.txt delete mode 100644 res/cardsfolder/volcanic_dragon.txt delete mode 100644 res/cardsfolder/volcanic_eruption.txt delete mode 100644 res/cardsfolder/volcanic_fallout.txt delete mode 100644 res/cardsfolder/volcanic_geyser.txt delete mode 100644 res/cardsfolder/volcanic_hammer.txt delete mode 100644 res/cardsfolder/volcanic_island.txt delete mode 100644 res/cardsfolder/volcanic_spray.txt delete mode 100644 res/cardsfolder/volcanic_strength.txt delete mode 100644 res/cardsfolder/volcanic_submersion.txt delete mode 100644 res/cardsfolder/volcano_imp.txt delete mode 100644 res/cardsfolder/volition_reins.txt delete mode 100644 res/cardsfolder/volrath_the_fallen.txt delete mode 100644 res/cardsfolder/volraths_dungeon.txt delete mode 100644 res/cardsfolder/volraths_gardens.txt delete mode 100644 res/cardsfolder/volraths_stronghold.txt delete mode 100644 res/cardsfolder/volt_charge.txt delete mode 100644 res/cardsfolder/voltaic_construct.txt delete mode 100644 res/cardsfolder/voltaic_key.txt delete mode 100644 res/cardsfolder/volunteer_militia.txt delete mode 100644 res/cardsfolder/voracious_cobra.txt delete mode 100644 res/cardsfolder/voracious_hatchling.txt delete mode 100644 res/cardsfolder/vorinclex_voice_of_hunger.txt delete mode 100644 res/cardsfolder/vorosh_the_hunter.txt delete mode 100644 res/cardsfolder/vorrac_battlehorns.txt delete mode 100644 res/cardsfolder/votary_of_the_conclave.txt delete mode 100644 res/cardsfolder/voyager_drake.txt delete mode 100644 res/cardsfolder/vug_lizard.txt delete mode 100644 res/cardsfolder/vulshok_battlegear.txt delete mode 100644 res/cardsfolder/vulshok_berserker.txt delete mode 100644 res/cardsfolder/vulshok_gauntlets.txt delete mode 100644 res/cardsfolder/vulshok_heartstoker.txt delete mode 100644 res/cardsfolder/vulshok_morningstar.txt delete mode 100644 res/cardsfolder/vulshok_refugee.txt delete mode 100644 res/cardsfolder/vulshok_replica.txt delete mode 100644 res/cardsfolder/vulshok_sorcerer.txt delete mode 100644 res/cardsfolder/vulturous_zombie.txt delete mode 100644 res/cardsfolder/wail_of_the_nim.txt delete mode 100644 res/cardsfolder/waiting_in_the_weeds.txt delete mode 100644 res/cardsfolder/wake_of_vultures.txt delete mode 100644 res/cardsfolder/wake_thrasher.txt delete mode 100644 res/cardsfolder/wakestone_gargoyle.txt delete mode 100644 res/cardsfolder/waking_nightmare.txt delete mode 100644 res/cardsfolder/walker_of_secret_ways.txt delete mode 100644 res/cardsfolder/walker_of_the_grove.txt delete mode 100644 res/cardsfolder/walking_archive.txt delete mode 100644 res/cardsfolder/walking_atlas.txt delete mode 100644 res/cardsfolder/walking_dead.txt delete mode 100644 res/cardsfolder/walking_desecration.txt delete mode 100644 res/cardsfolder/walking_dream.txt delete mode 100644 res/cardsfolder/walking_wall.txt delete mode 100644 res/cardsfolder/wall_of_air.txt delete mode 100644 res/cardsfolder/wall_of_blood.txt delete mode 100644 res/cardsfolder/wall_of_blossoms.txt delete mode 100644 res/cardsfolder/wall_of_bone.txt delete mode 100644 res/cardsfolder/wall_of_brambles.txt delete mode 100644 res/cardsfolder/wall_of_denial.txt delete mode 100644 res/cardsfolder/wall_of_diffusion.txt delete mode 100644 res/cardsfolder/wall_of_distortion.txt delete mode 100644 res/cardsfolder/wall_of_earth.txt delete mode 100644 res/cardsfolder/wall_of_essence.txt delete mode 100644 res/cardsfolder/wall_of_faith.txt delete mode 100644 res/cardsfolder/wall_of_fire.txt delete mode 100644 res/cardsfolder/wall_of_frost.txt delete mode 100644 res/cardsfolder/wall_of_granite.txt delete mode 100644 res/cardsfolder/wall_of_heat.txt delete mode 100644 res/cardsfolder/wall_of_hope.txt delete mode 100644 res/cardsfolder/wall_of_ice.txt delete mode 100644 res/cardsfolder/wall_of_junk.txt delete mode 100644 res/cardsfolder/wall_of_kelp.txt delete mode 100644 res/cardsfolder/wall_of_lava.txt delete mode 100644 res/cardsfolder/wall_of_light.txt delete mode 100644 res/cardsfolder/wall_of_mulch.txt delete mode 100644 res/cardsfolder/wall_of_omens.txt delete mode 100644 res/cardsfolder/wall_of_opposition.txt delete mode 100644 res/cardsfolder/wall_of_pine_needles.txt delete mode 100644 res/cardsfolder/wall_of_putrid_flesh.txt delete mode 100644 res/cardsfolder/wall_of_razors.txt delete mode 100644 res/cardsfolder/wall_of_resistance.txt delete mode 100644 res/cardsfolder/wall_of_reverence.txt delete mode 100644 res/cardsfolder/wall_of_roots.txt delete mode 100644 res/cardsfolder/wall_of_souls.txt delete mode 100644 res/cardsfolder/wall_of_spears.txt delete mode 100644 res/cardsfolder/wall_of_stone.txt delete mode 100644 res/cardsfolder/wall_of_swords.txt delete mode 100644 res/cardsfolder/wall_of_tanglecord.txt delete mode 100644 res/cardsfolder/wall_of_tears.txt delete mode 100644 res/cardsfolder/wall_of_tombstones.txt delete mode 100644 res/cardsfolder/wall_of_vines.txt delete mode 100644 res/cardsfolder/wall_of_water.txt delete mode 100644 res/cardsfolder/wall_of_wonder.txt delete mode 100644 res/cardsfolder/wall_of_wood.txt delete mode 100644 res/cardsfolder/wallop.txt delete mode 100644 res/cardsfolder/wand_of_the_elements.txt delete mode 100644 res/cardsfolder/wanderbrine_rootcutters.txt delete mode 100644 res/cardsfolder/wanderers_twig.txt delete mode 100644 res/cardsfolder/wanderguard_sentry.txt delete mode 100644 res/cardsfolder/wandering_goblins.txt delete mode 100644 res/cardsfolder/wandering_graybeard.txt delete mode 100644 res/cardsfolder/wandering_ones.txt delete mode 100644 res/cardsfolder/wandering_stream.txt delete mode 100644 res/cardsfolder/wanderlust.txt delete mode 100644 res/cardsfolder/wanderwine_hub.txt delete mode 100644 res/cardsfolder/wanderwine_prophets.txt delete mode 100644 res/cardsfolder/waning_wurm.txt delete mode 100644 res/cardsfolder/war_chariot.txt delete mode 100644 res/cardsfolder/war_dance.txt delete mode 100644 res/cardsfolder/war_mammoth.txt delete mode 100644 res/cardsfolder/war_priest_of_thune.txt delete mode 100644 res/cardsfolder/war_report.txt delete mode 100644 res/cardsfolder/war_spike_changeling.txt delete mode 100644 res/cardsfolder/war_torch_goblin.txt delete mode 100644 res/cardsfolder/warbreak_trumpeter.txt delete mode 100644 res/cardsfolder/wargate.txt delete mode 100644 res/cardsfolder/warlords_axe.txt delete mode 100755 res/cardsfolder/warmonger.txt delete mode 100644 res/cardsfolder/warmongers_chariot.txt delete mode 100644 res/cardsfolder/warmth.txt delete mode 100644 res/cardsfolder/warning.txt delete mode 100644 res/cardsfolder/warp_artifact.txt delete mode 100755 res/cardsfolder/warpath.txt delete mode 100644 res/cardsfolder/warpath_ghoul.txt delete mode 100644 res/cardsfolder/warped_devotion.txt delete mode 100644 res/cardsfolder/warped_researcher.txt delete mode 100644 res/cardsfolder/warren_instigator.txt delete mode 100644 res/cardsfolder/warren_scourge_elf.txt delete mode 100644 res/cardsfolder/warrior_angel.txt delete mode 100644 res/cardsfolder/warriors_charge.txt delete mode 100644 res/cardsfolder/warriors_honor.txt delete mode 100644 res/cardsfolder/warthog.txt delete mode 100644 res/cardsfolder/wasp_lancer.txt delete mode 100644 res/cardsfolder/waste_away.txt delete mode 100644 res/cardsfolder/wasteland.txt delete mode 100644 res/cardsfolder/watcher_sliver.txt delete mode 100644 res/cardsfolder/watchwing_scarecrow.txt delete mode 100644 res/cardsfolder/watchwolf.txt delete mode 100644 res/cardsfolder/water_elemental.txt delete mode 100644 res/cardsfolder/water_servant.txt delete mode 100644 res/cardsfolder/water_wurm.txt delete mode 100644 res/cardsfolder/waterfront_bouncer.txt delete mode 100644 res/cardsfolder/waterspout_elemental.txt delete mode 100644 res/cardsfolder/waterspout_weavers.txt delete mode 100644 res/cardsfolder/waterveil_cavern.txt delete mode 100644 res/cardsfolder/watery_grave.txt delete mode 100644 res/cardsfolder/wave_elemental.txt delete mode 100644 res/cardsfolder/wave_of_indifference.txt delete mode 100644 res/cardsfolder/wave_of_terror.txt delete mode 100644 res/cardsfolder/waveskimmer_aven.txt delete mode 100644 res/cardsfolder/wayfarers_bauble.txt delete mode 100644 res/cardsfolder/wayfaring_giant.txt delete mode 100644 res/cardsfolder/waylay.txt delete mode 100644 res/cardsfolder/wayward_soul.txt delete mode 100644 res/cardsfolder/weakness.txt delete mode 100644 res/cardsfolder/weakstone.txt delete mode 100644 res/cardsfolder/weathered_wayfarer.txt delete mode 100644 res/cardsfolder/weatherseed_elf.txt delete mode 100644 res/cardsfolder/weatherseed_faeries.txt delete mode 100644 res/cardsfolder/weatherseed_treefolk.txt delete mode 100644 res/cardsfolder/web.txt delete mode 100644 res/cardsfolder/wee_dragonauts.txt delete mode 100644 res/cardsfolder/weed_pruner_poplar.txt delete mode 100644 res/cardsfolder/wei_ambush_force.txt delete mode 100644 res/cardsfolder/wei_elite_companions.txt delete mode 100644 res/cardsfolder/wei_infantry.txt delete mode 100644 res/cardsfolder/wei_night_raiders.txt delete mode 100644 res/cardsfolder/wei_scout.txt delete mode 100644 res/cardsfolder/wei_strike_force.txt delete mode 100644 res/cardsfolder/weirding_shaman.txt delete mode 100644 res/cardsfolder/welding_jar.txt delete mode 100644 res/cardsfolder/welkin_guide.txt delete mode 100644 res/cardsfolder/welkin_hawk.txt delete mode 100644 res/cardsfolder/welkin_tern.txt delete mode 100644 res/cardsfolder/well_laid_plans.txt delete mode 100644 res/cardsfolder/well_of_discovery.txt delete mode 100644 res/cardsfolder/well_of_life.txt delete mode 100644 res/cardsfolder/wellspring.txt delete mode 100644 res/cardsfolder/wellwisher.txt delete mode 100644 res/cardsfolder/werebear.txt delete mode 100644 res/cardsfolder/western_paladin.txt delete mode 100644 res/cardsfolder/whalebone_glider.txt delete mode 100644 res/cardsfolder/wheel_and_deal.txt delete mode 100644 res/cardsfolder/wheel_of_fortune.txt delete mode 100644 res/cardsfolder/wheel_of_torture.txt delete mode 100644 res/cardsfolder/where_ancients_tread.txt delete mode 100644 res/cardsfolder/whetstone.txt delete mode 100644 res/cardsfolder/whetwheel.txt delete mode 100644 res/cardsfolder/whimwader.txt delete mode 100644 res/cardsfolder/whip_sergeant.txt delete mode 100644 res/cardsfolder/whip_silk.txt delete mode 100644 res/cardsfolder/whip_spine_drake.txt delete mode 100644 res/cardsfolder/whipcorder.txt delete mode 100644 res/cardsfolder/whipflare.txt delete mode 100644 res/cardsfolder/whipstitched_zombie.txt delete mode 100644 res/cardsfolder/whiptail_moloch.txt delete mode 100644 res/cardsfolder/whiptail_wurm.txt delete mode 100644 res/cardsfolder/whiptongue_frog.txt delete mode 100644 res/cardsfolder/whirling_catapult.txt delete mode 100644 res/cardsfolder/whirling_dervish.txt delete mode 100644 res/cardsfolder/whirlpool_drake.txt delete mode 100644 res/cardsfolder/whirlpool_rider.txt delete mode 100644 res/cardsfolder/whirlwind.txt delete mode 100644 res/cardsfolder/whispering_shade.txt delete mode 100644 res/cardsfolder/whispering_specter.txt delete mode 100644 res/cardsfolder/whispers_of_the_muse.txt delete mode 100644 res/cardsfolder/whispersilk_cloak.txt delete mode 100644 res/cardsfolder/white_knight.txt delete mode 100644 res/cardsfolder/white_mana_battery.txt delete mode 100644 res/cardsfolder/white_scarab.txt delete mode 100644 res/cardsfolder/white_shield_crusader.txt delete mode 100644 res/cardsfolder/white_suns_zenith.txt delete mode 100644 res/cardsfolder/white_ward.txt delete mode 100644 res/cardsfolder/whitemane_lion.txt delete mode 100644 res/cardsfolder/whitesuns_passage.txt delete mode 100644 res/cardsfolder/wicked_pact.txt delete mode 100644 res/cardsfolder/wicked_reward.txt delete mode 100644 res/cardsfolder/wicker_warcrawler.txt delete mode 100644 res/cardsfolder/wickerbough_elder.txt delete mode 100644 res/cardsfolder/wielding_the_green_dragon.txt delete mode 100644 res/cardsfolder/wild_aesthir.txt delete mode 100644 res/cardsfolder/wild_cantor.txt delete mode 100644 res/cardsfolder/wild_colos.txt delete mode 100644 res/cardsfolder/wild_elephant.txt delete mode 100644 res/cardsfolder/wild_griffin.txt delete mode 100644 res/cardsfolder/wild_growth.txt delete mode 100644 res/cardsfolder/wild_jhovall.txt delete mode 100644 res/cardsfolder/wild_leotau.txt delete mode 100644 res/cardsfolder/wild_mongrel.txt delete mode 100644 res/cardsfolder/wild_nacatl.txt delete mode 100644 res/cardsfolder/wild_ox.txt delete mode 100644 res/cardsfolder/wild_research.txt delete mode 100644 res/cardsfolder/wild_wurm.txt delete mode 100644 res/cardsfolder/wilderness_elemental.txt delete mode 100644 res/cardsfolder/wilderness_hypnotist.txt delete mode 100644 res/cardsfolder/wildfield_borderpost.txt delete mode 100644 res/cardsfolder/wildfire.txt delete mode 100644 res/cardsfolder/wildfire_emissary.txt delete mode 100644 res/cardsfolder/wildheart_invoker.txt delete mode 100644 res/cardsfolder/wildsize.txt delete mode 100644 res/cardsfolder/wildslayer_elves.txt delete mode 100644 res/cardsfolder/will_o_the_wisp.txt delete mode 100644 res/cardsfolder/willow_dryad.txt delete mode 100644 res/cardsfolder/willow_elf.txt delete mode 100644 res/cardsfolder/willow_faerie.txt delete mode 100644 res/cardsfolder/willow_priestess.txt delete mode 100644 res/cardsfolder/willow_satyr.txt delete mode 100644 res/cardsfolder/wilt_leaf_cavaliers.txt delete mode 100644 res/cardsfolder/wilt_leaf_liege.txt delete mode 100644 res/cardsfolder/wind_dancer.txt delete mode 100644 res/cardsfolder/wind_drake.txt delete mode 100644 res/cardsfolder/wind_sail.txt delete mode 100644 res/cardsfolder/wind_shear.txt delete mode 100644 res/cardsfolder/wind_zendikon.txt delete mode 100644 res/cardsfolder/windborn_muse.txt delete mode 100644 res/cardsfolder/windborne_charge.txt delete mode 100644 res/cardsfolder/windbrisk_raptor.txt delete mode 100644 res/cardsfolder/windfall.txt delete mode 100644 res/cardsfolder/winding_wurm.txt delete mode 100644 res/cardsfolder/windreaper_falcon.txt delete mode 100644 res/cardsfolder/windreaver.txt delete mode 100644 res/cardsfolder/windrider_eel.txt delete mode 100644 res/cardsfolder/winds_of_change.txt delete mode 100644 res/cardsfolder/winds_of_rath.txt delete mode 100644 res/cardsfolder/windscouter.txt delete mode 100644 res/cardsfolder/windseeker_centaur.txt delete mode 100644 res/cardsfolder/windstorm.txt delete mode 100644 res/cardsfolder/windswept_heath.txt delete mode 100644 res/cardsfolder/windwright_mage.txt delete mode 100644 res/cardsfolder/wing_puncture.txt delete mode 100644 res/cardsfolder/wing_shards.txt delete mode 100644 res/cardsfolder/wing_snare.txt delete mode 100644 res/cardsfolder/wing_splicer.txt delete mode 100644 res/cardsfolder/wing_storm.txt delete mode 100644 res/cardsfolder/wingbeat_warrior.txt delete mode 100644 res/cardsfolder/winged_coatl.txt delete mode 100644 res/cardsfolder/winged_sliver.txt delete mode 100644 res/cardsfolder/wingrattle_scarecrow.txt delete mode 100644 res/cardsfolder/wings_of_aesthir.txt delete mode 100644 res/cardsfolder/wings_of_hope.txt delete mode 100644 res/cardsfolder/wings_of_velis_vel.txt delete mode 100644 res/cardsfolder/winnower_patrol.txt delete mode 100644 res/cardsfolder/winter_orb.txt delete mode 100644 res/cardsfolder/winter_sky.txt delete mode 100644 res/cardsfolder/wintermoon_mesa.txt delete mode 100644 res/cardsfolder/winters_grasp.txt delete mode 100644 res/cardsfolder/winters_night.txt delete mode 100644 res/cardsfolder/wipe_away.txt delete mode 100644 res/cardsfolder/wipe_clean.txt delete mode 100644 res/cardsfolder/wirecat.txt delete mode 100644 res/cardsfolder/wirefly_hive.txt delete mode 100644 res/cardsfolder/wirewood_channeler.txt delete mode 100644 res/cardsfolder/wirewood_elf.txt delete mode 100644 res/cardsfolder/wirewood_guardian.txt delete mode 100644 res/cardsfolder/wirewood_herald.txt delete mode 100644 res/cardsfolder/wirewood_hivemaster.txt delete mode 100644 res/cardsfolder/wirewood_lodge.txt delete mode 100644 res/cardsfolder/wirewood_pride.txt delete mode 100644 res/cardsfolder/wirewood_savage.txt delete mode 100644 res/cardsfolder/wirewood_symbiote.txt delete mode 100644 res/cardsfolder/wispmare.txt delete mode 100644 res/cardsfolder/wistful_selkie.txt delete mode 100644 res/cardsfolder/wistful_thinking.txt delete mode 100644 res/cardsfolder/witch_hunter.txt delete mode 100644 res/cardsfolder/witch_maw_nephilim.txt delete mode 100644 res/cardsfolder/witchs_mist.txt delete mode 100644 res/cardsfolder/withered_wretch.txt delete mode 100644 res/cardsfolder/withering_boon.txt delete mode 100644 res/cardsfolder/withering_gaze.txt delete mode 100644 res/cardsfolder/withering_hex.txt delete mode 100644 res/cardsfolder/withstand.txt delete mode 100644 res/cardsfolder/withstand_death.txt delete mode 100644 res/cardsfolder/wits_end.txt delete mode 100644 res/cardsfolder/wizard_mentor.txt delete mode 100644 res/cardsfolder/wizard_replica.txt delete mode 100644 res/cardsfolder/wizards_school.txt delete mode 100644 res/cardsfolder/wizened_cenn.txt delete mode 100644 res/cardsfolder/woebearer.txt delete mode 100644 res/cardsfolder/wojek_embermage.txt delete mode 100644 res/cardsfolder/wolf_skull_shaman.txt delete mode 100644 res/cardsfolder/wolfbriar_elemental.txt delete mode 100644 res/cardsfolder/wolverine_pack.txt delete mode 100644 res/cardsfolder/wonder.txt delete mode 100644 res/cardsfolder/wood_elves.txt delete mode 100644 res/cardsfolder/woodcloaker.txt delete mode 100644 res/cardsfolder/wooded_bastion.txt delete mode 100644 res/cardsfolder/wooded_foothills.txt delete mode 100644 res/cardsfolder/wooden_sphere.txt delete mode 100644 res/cardsfolder/woodfall_primus.txt delete mode 100644 res/cardsfolder/woodland_changeling.txt delete mode 100644 res/cardsfolder/woodland_druid.txt delete mode 100644 res/cardsfolder/woodland_guidance.txt delete mode 100644 res/cardsfolder/woodlurker_mimic.txt delete mode 100644 res/cardsfolder/woodripper.txt delete mode 100644 res/cardsfolder/woodwraith_corrupter.txt delete mode 100644 res/cardsfolder/woodwraith_strangler.txt delete mode 100644 res/cardsfolder/woolly_mammoths.txt delete mode 100644 res/cardsfolder/woolly_spider.txt delete mode 100644 res/cardsfolder/woolly_thoctar.txt delete mode 100644 res/cardsfolder/word_of_binding.txt delete mode 100644 res/cardsfolder/word_of_blasting.txt delete mode 100644 res/cardsfolder/word_of_seizing.txt delete mode 100644 res/cardsfolder/words_of_wisdom.txt delete mode 100644 res/cardsfolder/workhorse.txt delete mode 100644 res/cardsfolder/worldgorger_dragon.txt delete mode 100644 res/cardsfolder/worldly_counsel.txt delete mode 100644 res/cardsfolder/worldly_tutor.txt delete mode 100644 res/cardsfolder/worldslayer.txt delete mode 100644 res/cardsfolder/worm_harvest.txt delete mode 100644 res/cardsfolder/wormfang_behemoth.txt delete mode 100644 res/cardsfolder/wormfang_drake.txt delete mode 100644 res/cardsfolder/wormfang_manta.txt delete mode 100644 res/cardsfolder/wormfang_newt.txt delete mode 100644 res/cardsfolder/wormfang_turtle.txt delete mode 100644 res/cardsfolder/wormwood_dryad.txt delete mode 100644 res/cardsfolder/wormwood_treefolk.txt delete mode 100644 res/cardsfolder/worn_powerstone.txt delete mode 100644 res/cardsfolder/worry_beads.txt delete mode 100644 res/cardsfolder/worship.txt delete mode 100644 res/cardsfolder/wort_boggart_auntie.txt delete mode 100644 res/cardsfolder/wrap_in_flames.txt delete mode 100644 res/cardsfolder/wrap_in_vigor.txt delete mode 100644 res/cardsfolder/wrath_of_god.txt delete mode 100644 res/cardsfolder/wrath_of_marit_lage.txt delete mode 100644 res/cardsfolder/wreak_havoc.txt delete mode 100644 res/cardsfolder/wrecking_ball.txt delete mode 100644 res/cardsfolder/wrench_mind.txt delete mode 100644 res/cardsfolder/wrens_run_packmaster.txt delete mode 100644 res/cardsfolder/wretched_anurid.txt delete mode 100644 res/cardsfolder/wu_admiral.txt delete mode 100644 res/cardsfolder/wu_elite_cavalry.txt delete mode 100644 res/cardsfolder/wu_infantry.txt delete mode 100644 res/cardsfolder/wu_light_cavalry.txt delete mode 100644 res/cardsfolder/wu_longbowman.txt delete mode 100644 res/cardsfolder/wu_scout.txt delete mode 100644 res/cardsfolder/wu_spy.txt delete mode 100644 res/cardsfolder/wu_warship.txt delete mode 100644 res/cardsfolder/wurmcoil_engine.txt delete mode 100644 res/cardsfolder/wurms_tooth.txt delete mode 100644 res/cardsfolder/wurmskin_forger.txt delete mode 100644 res/cardsfolder/wydwen_the_biting_gale.txt delete mode 100644 res/cardsfolder/wyluli_wolf.txt delete mode 100644 res/cardsfolder/xanthic_statue.txt delete mode 100644 res/cardsfolder/xenograft.txt delete mode 100644 res/cardsfolder/xiahou_dun_the_one_eyed.txt delete mode 100644 res/cardsfolder/xira_arien.txt delete mode 100644 res/cardsfolder/xun_yu_wei_advisor.txt delete mode 100644 res/cardsfolder/yamabushis_flame.txt delete mode 100644 res/cardsfolder/yavimaya_ancients.txt delete mode 100644 res/cardsfolder/yavimaya_ants.txt delete mode 100644 res/cardsfolder/yavimaya_barbarian.txt delete mode 100644 res/cardsfolder/yavimaya_coast.txt delete mode 100644 res/cardsfolder/yavimaya_elder.txt delete mode 100644 res/cardsfolder/yavimaya_enchantress.txt delete mode 100644 res/cardsfolder/yavimaya_gnats.txt delete mode 100644 res/cardsfolder/yavimaya_granger.txt delete mode 100644 res/cardsfolder/yavimaya_hollow.txt delete mode 100644 res/cardsfolder/yavimaya_kavu.txt delete mode 100644 res/cardsfolder/yavimaya_scion.txt delete mode 100644 res/cardsfolder/yavimaya_wurm.txt delete mode 100644 res/cardsfolder/yavimayas_embrace.txt delete mode 100644 res/cardsfolder/yawgmoth_demon.txt delete mode 100644 res/cardsfolder/yawgmoths_bargain.txt delete mode 100644 res/cardsfolder/yawgmoths_edict.txt delete mode 100644 res/cardsfolder/yawning_fissure.txt delete mode 100644 res/cardsfolder/yellow_scarves_cavalry.txt delete mode 100644 res/cardsfolder/yellow_scarves_general.txt delete mode 100644 res/cardsfolder/yellow_scarves_troops.txt delete mode 100644 res/cardsfolder/yoke_of_the_damned.txt delete mode 100644 res/cardsfolder/yoked_plowbeast.txt delete mode 100644 res/cardsfolder/yomiji_who_bars_the_way.txt delete mode 100644 res/cardsfolder/yore_tiller_nephilim.txt delete mode 100644 res/cardsfolder/yosei_the_morning_star.txt delete mode 100644 res/cardsfolder/yotian_soldier.txt delete mode 100644 res/cardsfolder/young_wei_recruits.txt delete mode 100644 res/cardsfolder/youthful_knight.txt delete mode 100644 res/cardsfolder/yuan_shao_the_indecisive.txt delete mode 100644 res/cardsfolder/yuan_shaos_infantry.txt delete mode 100644 res/cardsfolder/yuki_onna.txt delete mode 100644 res/cardsfolder/zap.txt delete mode 100644 res/cardsfolder/zealots_en_dal.txt delete mode 100644 res/cardsfolder/zealous_guardian.txt delete mode 100644 res/cardsfolder/zealous_persecution.txt delete mode 100644 res/cardsfolder/zebra_unicorn.txt delete mode 100644 res/cardsfolder/zektar_shrine_expedition.txt delete mode 100644 res/cardsfolder/zendikar_farguide.txt delete mode 100644 res/cardsfolder/zephid.txt delete mode 100644 res/cardsfolder/zephids_embrace.txt delete mode 100644 res/cardsfolder/zephyr_falcon.txt delete mode 100644 res/cardsfolder/zephyr_net.txt delete mode 100644 res/cardsfolder/zephyr_spirit.txt delete mode 100644 res/cardsfolder/zephyr_sprite.txt delete mode 100644 res/cardsfolder/zhalfirin_commander.txt delete mode 100644 res/cardsfolder/zhalfirin_knight.txt delete mode 100644 res/cardsfolder/zhang_fei_fierce_warrior.txt delete mode 100644 res/cardsfolder/zhang_he_wei_general.txt delete mode 100644 res/cardsfolder/zhang_liao_hero_of_hefei.txt delete mode 100644 res/cardsfolder/zhao_zilong_tiger_general.txt delete mode 100644 res/cardsfolder/zhou_yu_chief_commander.txt delete mode 100644 res/cardsfolder/zhuge_jin_wu_strategist.txt delete mode 100644 res/cardsfolder/zirilan_of_the_claw.txt delete mode 100644 res/cardsfolder/zo_zu_the_punisher.txt delete mode 100644 res/cardsfolder/zodiac_dog.txt delete mode 100644 res/cardsfolder/zodiac_dragon.txt delete mode 100644 res/cardsfolder/zodiac_goat.txt delete mode 100644 res/cardsfolder/zodiac_horse.txt delete mode 100644 res/cardsfolder/zodiac_monkey.txt delete mode 100644 res/cardsfolder/zodiac_ox.txt delete mode 100644 res/cardsfolder/zodiac_pig.txt delete mode 100644 res/cardsfolder/zodiac_rabbit.txt delete mode 100644 res/cardsfolder/zodiac_rat.txt delete mode 100644 res/cardsfolder/zodiac_rooster.txt delete mode 100644 res/cardsfolder/zodiac_snake.txt delete mode 100644 res/cardsfolder/zodiac_tiger.txt delete mode 100644 res/cardsfolder/zoetic_cavern.txt delete mode 100644 res/cardsfolder/zof_shade.txt delete mode 100644 res/cardsfolder/zombie_cannibal.txt delete mode 100644 res/cardsfolder/zombie_cutthroat.txt delete mode 100644 res/cardsfolder/zombie_goliath.txt delete mode 100644 res/cardsfolder/zombie_infestation.txt delete mode 100644 res/cardsfolder/zombie_master.txt delete mode 100644 res/cardsfolder/zombie_mob.txt delete mode 100644 res/cardsfolder/zombie_musher.txt delete mode 100644 res/cardsfolder/zombie_outlander.txt delete mode 100644 res/cardsfolder/zombie_trailblazer.txt delete mode 100644 res/cardsfolder/zombify.txt delete mode 100644 res/cardsfolder/zoologist.txt delete mode 100644 res/cardsfolder/zuberi_golden_feather.txt delete mode 100644 res/cardsfolder/zulaport_enforcer.txt delete mode 100644 res/cardsfolder/zuo_ci_the_mocking_sage.txt delete mode 100644 res/cardsfolder/zur_the_enchanter.txt delete mode 100644 res/cardsfolder/zuran_enchanter.txt delete mode 100644 res/cardsfolder/zuran_orb.txt delete mode 100644 res/cardsfolder/zuran_spellcaster.txt delete mode 100644 res/lib/google-collections-1.0.jar delete mode 100644 res/lib/java-image-scaling-0.8.4.jar delete mode 100644 res/lib/jl1.0.1.jar delete mode 100644 res/lib/miglayout-3.7.3.1-swing.jar delete mode 100644 res/lib/napkinlaf-1.2.jar delete mode 100644 res/lib/nimrodlf.jar delete mode 100644 res/lib/substance.jar delete mode 100644 res/lib/xpp3_min-1.1.4c.jar delete mode 100644 res/lib/xstream-1.3.1.jar delete mode 100644 res/quest/decks/Cave Troll 2.dck delete mode 100644 src/com/cloudgarden/layout/AnchorConstraint.java delete mode 100644 src/com/cloudgarden/layout/AnchorLayout.java delete mode 100644 src/com/esotericsoftware/minlog/Log.java delete mode 100644 src/forge/BoosterPack.java delete mode 100644 src/forge/GuiDisplay2.java delete mode 100644 src/forge/GuiDisplay3.java delete mode 100644 src/forge/Gui_DownloadPictures.java delete mode 100644 src/forge/Gui_MultipleBlockers.java delete mode 100644 src/forge/KeyListenerTest.java delete mode 100644 src/forge/MP3Player.java delete mode 100644 src/forge/QuestData.java delete mode 100644 src/forge/QuestData_BoosterPack.java delete mode 100644 src/forge/QuestData_Prefs.java delete mode 100644 src/forge/QuestData_State.java delete mode 100644 src/forge/ReadCard.java delete mode 100644 src/forge/RunTest.java delete mode 100644 src/forge/Test.java delete mode 100644 src/forge/TestMove.java delete mode 100644 src/forge/TestPanel.java delete mode 100644 src/forge/card/cardFactory/CardFactory.java delete mode 100644 src/forge/card/mana/Mana_PartTest.java delete mode 100644 src/forge/deck/generate/GenerateSealedDeck.java delete mode 100644 src/forge/gui/ForgeFontConstants.java delete mode 100644 src/org/jdesktop/beans/AbstractBean.java delete mode 100644 src/org/jdesktop/swingworker/AccumulativeRunnable.java delete mode 100644 src/org/jdesktop/swingworker/SwingPropertyChangeSupport.java delete mode 100644 src/org/jdesktop/swingworker/SwingWorker.java delete mode 100644 src/org/jdesktop/swingx/JXMultiSplitPane.java delete mode 100644 src/org/jdesktop/swingx/MultiSplitLayout.java delete mode 100644 src/org/jdesktop/swingx/graphics/GraphicsUtilities.java delete mode 100644 src/org/jdesktop/swingx/painter/AbstractPainter.java delete mode 100644 src/org/jdesktop/swingx/painter/Painter.java 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 8e394facdf9169ae6df0595e1602318c1f4dbfba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 639592 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

-nRpA$gL>9%yTEmql~rde&%6dz^V2c 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

) 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
  • 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�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 diff --git a/res/lib/jl1.0.1.jar b/res/lib/jl1.0.1.jar deleted file mode 100644 index bd5fb8b8eb28746e4a3d7cfee2b54c4fd54f5043..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105363 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

    W(94n+m(@89xah6`eR%%`DDLQJ z@Aw-tzAuT|%L0%GK<*i@V2Akr4eM@f3U;=%2Sy>6YsHYQLyEK|Z8bpL11_>F}YRuJ#JGFcwh-A`V6?P`n%x%Z*Y#rY~0twp7PN3*a12I3Y5yr*v}s+&yP&# zdYIT>-6EwD$Pr}w8(TVd>&T)3#c>M-GRIRQf23Zo`6c~Y#_&1s||(pA8~*3 zH#28kbvgk20OTI1CqGl3AHU3>p?~%^eue<^AV9+d*vvnvm*t&I?s~4cgA2&U($mzD zQe0WW#m@NmC5hTx`!yd>GqZpW@@ieWC;u<(>n+>%lU>h*s|M9D?t~>iW#je6v|d1&9s6 zb+vIi{ZG{2RHz)qO?*4R3K@VEt~O5drvIkwpNlI~wVO%^pzLJ;_|>`#acVut_owv?%mQkhV3n_!p>}v!%^%jDUDUniLKw{dqv?zkE9TBjx$I+g?xo?k(vb zEtZOlkrBwwH8o_YNTLDy^l$qz=Z2x#V>0@Kv1(~W13{se_|_;;VMUoS(v(ILJLu#g=v zA`|~57?pf!^x6apPaLUHYdO6%py{b3mX@NKXu4zX2E96*NNae?*%(gN%MRwX#Ln zM4bT8^gy|~I(Kt^_TTX4j(?fvHw_`Ffyo*HAYc->u1;u^>i?SnXH#3Sy(7rd@i&8Z zrykQ_MPN&K=aE` z53(!1MP0ofD-W^*ng4Fa7Khs^nF^qAfWm$ihqQJ*?vE2dT3f%31pvkN|7zs=`fqS9 z&cJX+)B2MXNPQ5^i+>#2XO42b+;s(P|+jc^Xw@A5RJJ6G%& z_U<>#KMc0+Gt#8C;6Ong0lm=GVNo|w%&v2`iie%Eg{hOJ6R@HI^l;ZZyW!OO-5ns~ zguq2|Maf=h=xebc7k1#F%FB}iA={f|vHPEI17j=B4#Qi~UngEcQXx+}`bB*q|8LYQJA)y?kVoqL0@o^D z3%>S%9Y`wV(Hg&~(5lx`Wqy0m1|%ACd-N}KlJye&wkP`%>WUo3JHgdkNgEM0iJ367xW3{UzcK*aUm1zg`JK*mS>V&ZsS%lsKFp(G0nOyi)SRDgfygiuhx J<3Ql2{{u2lHQE3G 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 9b88362b4a846b0a77aca9a1abb32459a51baa2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76357 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

    ;oD5yK4t0%0za3rHUocBlb%MF( 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 H52XJC@XnVE diff --git a/res/lib/napkinlaf-1.2.jar b/res/lib/napkinlaf-1.2.jar deleted file mode 100644 index 1c8129edf49c2a7d4002d0dc54106fab442c7bfa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 795524 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

      #hPg78 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

      @$3|c)!S8-9m4taehv#g(xp5o|265$$N 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

      1s+e-tY|Vnf68eGTIA;r@HYpdqeP2< zVS5Spy!K}_$FRc~;E^d~>Is1lrP%2jH1dQziHh~GOWUe%H-yCZ`d%zUxELSpcJ54l4 zXR+3v;i=B63E3>2HDpvMx`0WprY?h`ELd`SVE+(0vQ`IZMw=uMu~lQEk>bN?hhVT$8nRa>E?WnqhC)2K7#qXqQ9`p-QAUsTCQFVNAA7E^uZ3-TSp#up(uq(gi zor6XCYtCF30OuLcJAcJq?Q;di!F6g>!mZNxD_g-yhXmEp9gJaWbWFK+(o5h?06t#6 z+{C8fOF`t?76}QtX4D+MDLgm8gbjPn3(#!xI@7XFuEcB&Pq-+Fib73hng*@KBkzri zh;S0CkB+t#A2!y;2mTsBZL?O2f68q?2|BTh{*#;cf50yQq`YH1Wc;%61!Hb6ct?Io z9_1GU>CXA@8Ygxeh;)!iU0UlS>Va{RY4;Xr8FIFQ_SsRIEb8or+Lblkq40$^GO|gf ztzV1!Eo8qaiaM;(1TPxzimu(rK-g=8R~P@)-(^%`q6m<)pRFBW+&YFpHjS7pkCrMD zv3Hq0@CP}NgQE<&7k4o&`U^56M)}4f2Dn-=E6l=X++hHH%-QD(iykrm62k{P?v>%Y zXr!?i!Xf_^X^8v@Cw$AhRF`QyB~F3sF;68k_=fQuHi%TD*Nea~0MUV=Ch#D|-!Bg|OP3}AR^}-?1Q4!lAJbtH!6)mh zsG@?rw6%7~8Rhmw5g;6N?K{QS%={;Xa;&FinexKDRWFL<4Lr^wIAzQVu@o~L<7xZ< z&hO@5VHdK?*^AhZvsbcLvp2H0uy+~5i#_8hfIMP&1n{t_pA?5rH0-SN1h#kCv?&(n zbuuQbS*!XH&nI<_r~|%Ak9S?;rLl-E#BE?I*`koa3^qB%O`+}K+KIJBhtw_89weVxjhKqM(G(pVb3kUtXLJgq zF|og#WOb*hXU2;QSq0b{wwa8l8wV9aJH7t0O6)JKU`@~=Zs2}K%j|@AVxyT+L8{5mzTM+>dM8;n6rQcj`LH-e=#=pI`103b@+Dv^L)r(`igsA z@tk}9%RORca&$7eQtNR|SZCM(8y0NWHFWs9?i5#%Ri2gRp`AZWMv#Y)&d9ZbZ%PGV z&B8NX*V*KF(~BZv#5Q4JQXN&DIZ4S|l%|4sROc8!hLAiCdYzWCe_&n#73Fn0 zn9b~MF%ZPyT`>8s+sd<8Zf%^We;&N`ha&&Na4;MO6z+i4QVjdg_@$?t z9+-{Ngf$gX5C;T^*ZJw_g(+9;?`kIsXy=X9w8@c)vb4%P5Mlt5b%wcTIq0bSC-1!L3^&En!J`}Rwj4uoK(8wpohR*aa!@9Yf~R|3^OS`iak3i16h>0Df@D;oPV-- z)D1E!SiMn2gLsxj*F74P?!^v>dU0B_SC-b{4bleq1Dp`Zy zSe*_`)EPwN=rdOB!1ooF=vfxFGI2nc`m*Y@r0D}`MORDfw~jou&ow*ZTryNdoIo`e zYk^J#L36o4?hz_bUO;b?PT{(bRDpY^j>cG=8X}lD7I0w&_mt&f(e#4r4m{8GLc1kw zM3grI<6Qt9bR}WRUozecvNyLEo;o!=b!u>QC{_l-M}b?Jr89yQRduod3~^8;=Qb4* zkBX5R&3y8RH0Zw?>B7!TmltRsE(*g0cBH1%y|NM8(L}*MFdC-ogmu{K6lS$xbYM~( zcye!K=fXjvq9}II$50nMq90q>%ga~qPRe_{bL5Wa#8j!~lFDCC+gRp*i=2zN75JD~ z&93skm|nQGBwQ}Rv?<-Jk_Pmg>z#HtIZ#(^t}x?A*F=fBDw0{&KfAYp^3S+c*a1xN zE)wHZ2ZYVMRoWF+DOcNDCpy%7h?+$3Fo{gcz+AF?8=HEu^I>k4Rm^1DDT=dZyf8nj z4x+zY0Dmfq#HL~)3d>~}Z>#Y~pG=O04pswD=2iPA`Qpmz}0bzp; z6;(IYNp&;D7c%w&oq-W2>MVBaa0444z3Ya)(<&pNPNvLJRgl%fe!B_c2Ucg0adL{* z1&74q01L%ULO!RA0MHUiyX!Qi)?o0WR;GJ;5EbRQsmw46->=(@FbXeT1w^%-%_Sf- zd+@k~-2ToGJt@3o#ppx_jfwMWC-$6_VozF%u^uv_=7&~)&`!I(Vau`vMpr?Ql_&D! zM~3$4It5KF9a&VlxEH`{#Z}gw@Yp&{FHJ4YO zxQchU!E-M8_a6D?M?bvs;rzq$n;-sWLwhkPpypO92LUIYdp2uT#;`nmo9q`w^H(KS zjbKc_2{%$xGU`-Nch4;-Z&}x#9Aui1{@c=(DPvt!T=xV9jacdqI6!hnv>eufZ0UtD z(tY2Mew7R<^#Oq?raOoF>sU+FN^70Ef#C({0xmMK*7#;k5)w+i#29!T88|?3TNVVzpWnUn0vX-R}l*LOt71Q$PMSYOmV=V@eZ!{8R4NR0irb zT&lgm7-+&`XOjvQ>i#|;>~0IAJlH|SV~o?+Am2NRz)ZUmW*P< z78q?^BBO<#8ckFCB`PZ8Iu%t%<8%f98@p5xV(q@+6i+}Wzz~m$Glc1}yVJ9luS0X7 za&#krirB)0+%)lbsp%;1yRKV|xrM0L0NH-k{&zrL-(!4;GMhgE(*0-DH}a_A?ujA= zLyL%Rqe&LVMjCZO9NRhYB_AZnH;EtPol#MH3LC!*wq((POM2v`ZaAn@PAGud#7$XK zEM@DcLM@pk!L(ur1dXz>8gV37&??_K5Y<`l(J7uHY(WWo{7}HkoYfmM3g}`c3;>Cp ztw|ll`t`;sM-BHV@{M_L3C{};*|zI7=$g!CY(}6tTp(pPpkoQ(-mLsd9hzIpUa`53 zqEhHm)HQlkTpDg9GQsqCy=C2a+QV3qLI9;6Dvo-OfA6#x2O+GIWy=RX#4w!>vrgYh zEIM)K`*Vugo2np8u}Vs~iRV}*P#?-i@j!*j&S)~MFy-2uqwGGiBUo`2ooq*^Y85$X zoTxh3LH%=W7N002Xl_c^>a7g)h0(gkrHOqXLYI7Kyh-n-Ws19sWD|$2^Z%$og2WrP zu|wTBjo6MZ%?C+0dz;S!2m$~5%=I1iXZ~C(7D$^YYde|I*_U81W6UjMRuZ|Gi??`W zq-<szbB{MRfm8O`{&Q!>{RZ04u>NCfMyc z=2U`A1vD0Bp;K>g&oKkvM$6~g0zf+Tg9cHTN$2q|I=xO7cS$*$thLce5{3QDn6H!S zbuq?pKF=LbDh0N=0HkW!3kyNO-%Y7NjQWHZKw^C?dB-+`1t%(t({KakuaY~4JJgdI z9ZJ~t&h>&)dN)WvkN$fvG!vp*s~z~R9j5J`Prlip3>b!R%{jAwa-LkJj@*V-Xd3L{B-o{FDg0TYzrRwdHjj0-G3wUKBJ; zfzoy6cDA>>v`1>dOfeKmLE6iI_VUpBBudf?WNU8DAIzMxS`1| z;jIp~Xvx*~u7UHwNVX`ZY2KDpg>W%r8dO}6HYyLtf)pgh@2F8EIe6<9f~d>hiA#|x z_#Ngtu8%Z1m1eLUsyL6yYt>a+gtyy;{(RWjZf0uV*EXGPx3#}IrS7Z)N??vwk}r^J52dCnCgtG(dI051qmR`NL_7R9Mo^?K;*2Y+-OqMINI^j0x8W? zOy50Yd#h2?7jL^UcR&0;oF zF0A?&cY48wOSg5P(mBL2$8KI0*dk9ionm1IXxaz$?Nzk_HXXNgT(evp4hu{Y^lQ?F z@W%%7=Zk!01bj;xtR_6L-;DG=yv8YQ$;u0trB$BCY5QSHgE%rV+syFS843Q z>VN9~H+Tyq?90YrFaG$)0lJEZ`K1eS8GnA(=(_GrC<$Sf)##L@{Qb>?JDkA7tyMwo z24KydAe#JW;!or4ElPQ5?i``0tI{;Dodb<;d)B<3zO4>!1pyd&myv&hoYWwGsD_G} zJhB&&s~J!tp-9s?eqv!Tue-?Cectr))y^}*ow)4aS7GbM^g`wBq)K8}XQDZlvBdd#X)p2z@D6kb>Ig2=% z=rsa%7-&LI&`{OE7)<+QsVo*37E(V;KrJ@IL^Xl{Ua-FzFVdq&Mj)ZKvLYogr;Dc@1z?jzzQ`CgID8E4CH`a{aK{scf~qy5A#@i@vM-%EDx3o{(W@ zbufA2_SVqLT?$hGcJR_rQD!9vE`yQ=zijM2zH)rAH5k~GiY>#en^~@d#p`8lZ{QgC zBv}r>ikgIcCd_!-{`a|nk^T(&Zhx0O_qk_pI4gXP!78K4wg$T}tfmL~W$T2bE}B^f zDmvCb<2nd1k4-m5^@`T<=!1&wEp*dv)m?x>uDko<3~JLqYf7qHZNRMc*g>o3CP{ME zO3iBe_krTQmN~QBGLy_V-gF4&KGOFPg4a!^0E{=V{g#RG#1YeZJ`NySH*l0l*Am+c zlJK18o^j{rDvh~x%2yU!rpQ}`)a^$xn5itsmNpE1%XcNCRuq&frh6*lv7&`gcg%|g zOz~6PS!NlfCta6j-~Ce?*v-fA#)7{PO*8 z08-dAF2MUzz*_CN!qBR_I@D-jyUtt0C8ay&6@<*!x7N0``)jA}KmRa+9Oil5AhegS zIO3I6&X?9VV|npAFT+-cn6C*Mnv1ed{fKqa>^_f+Id#I-b@<4*>XXTkVyOuvCOifpj^IPLI`m0_0u!FcZO{ z+!)O1wJ}N!e9fDm18QOgVbuK4 zT#H>x&f#+c+ZEP*a1mjVP0*5$o%yhHn~d*K!_mA+;RxY*s`i&lS=%iPj-vlM^b#R0 z&tm7XaE|-{Cf(sA@Ah5GD^ouNd>k^Jf}w3D#or3L`4;+Zs3KDL{ifnn*+n5sgTzI< zYbl;fY*U1bq2U2wwi81dHv&=)_-W&;@qUo1F94qL_vAxZYhhqU)Dl>W9i7KH+0i+g z)Kv(vu8xV5e6qRUYacfFtWwA86r>kXE{25KXcPZNN( zXnegIO*KuNCryKpLkZt3PZnJ749rbz)dPioAImlsX{-9yV!FdzVRg58 z1vA+X(gD#QvSGR+$tv40Kf)vZf-y7>^a>E|LeV2#G~gdXH|%^>m*+FZZncUc!bb-s)TPF8 zmgA9@W+u6#fLpz8|F?L=e#n zZmk?*hbdrC6YW@Py4*MS^=q1+k@grJ4j<^67k#4?Rp@MSOXpurYj>;OO|e#&r06?U zjCDe?4rk16I7sEQb+#AXfC{^?iMr|X>&k_d0&kl_4eAo^!J!=1*1#9W5AVo>6;x-i zDLnUERpnbn7BRew7MIFZ2aQqiJF!`JyF#Ih7P=`Y1Zk8{Z4biJc{$S++`3xmc)1c`e2S}^-KL{_zK5<2>vryQF{IOEnNCvcqq7F4aU>c0k z3ge~w|IUx`tBpI14;sH}lzZNXJ}lnB3SeLwzSV`(wNcR~4g_VpoHh;HK?*FL9jCQe z<2pfOj?S4{S6QTUNbW*MgRfrQxPP*_J(hfD7kI z#>xV!YJ>rh%)YY((TEfJJ0Hf4*~#93o;PH`z6jKteEz@SH`k)=d zRtPf^D1~VswP#Ne6C{ZSN$GY9_J}fpD*Pu*8bI$2DLvJq27DmfUXm7ZaU!z9B%$O3 zTZ_LJu@B@f-f{6pz%y<372{6hyz!v%u<>7w&w~Y8+w0tN%cstsz4qF7h>u(>KD8&x zkbml-7rpVJhm5-A2l}>uB;%rCz^qR7JamURa==VL2*$Ja{v$p8JBMy5SF`U?Q(UYI z=rEB}L;o!p4|uD`N>oEjWVog}I0>@TW9Sv%nbz)D^q#|!Dlm;ZM7Ili1&6FQihQ(i zIQ{a*g?Uuat{=$p)hEi$m0lVE_mTF2t1_7+#W)nec!AP}KC&PI1Xz5FYY$$OdAhFU z0hmMV9gA@yzl>d;Q6^O`WXVq8jr<(;_;&$cV(qdGu-FR&>&M?wheohsmK584=yrd( z-_~mGg>&P{rM7Kfj5iyj6q$b+KQX6X*R9;_1@Zh!CpEn=)G5d=%LH$Sg!-M-bAdHD zHcon zVPg$-!p$IzEV}a%l9KCGgtkukZq$kaQMs;nmTpgm)da8Df1E#;{|)GkPZ_^we9>6l zYr#NZTS?HfUwrMOmpyvXBMXnlk38~d9YT5R!2eE3$E>L>*LtPYi8$0I1IS_1TSkXc zC`u^wZHq~!NX+Uk8}~91>~< zO~#s}51lUd3hZg0_=AgvcuN$=5flc*0$0qAl0oQ~}Z6|g{(DP2LS!3Tley76M;)Iq2z-5`$$g~D97x7&y%%>L5C=RlwM zPAtiDlCn8~6H8v?hs$BlM`Z{5^y=H#w3;;>y|n0OXRsibmH$KKqe6kfFB>`8Eb=kT&Y*`3b>yQIcx zD?u5yY{LkRoAK{SL66;ReA@VDXJoF*X?$V(`@Ev`VxR6zo zVhVyc(Xr^-1a4C*sxA(0`YY%zG5jJ{*3rQ6q`7~TDC)kVvlRDGX!N#Kwcd`U4$@Sd@Y_3|=&W_2f?D#=~8Ep)V<-Nnw^Eg&4 z@Je|-*B#ilWaSlp?Aaz&Wdzj#RhFM_6~$>;Rmr6ncZyCC%meO5#pj_E0v>`dh`#5Y zEnHh*3pgxXwj%7)h)xN3o@WTaWc;Cbz4l}+ zllnGTtUBnT0isbya>0fcW7IPG_IxL2w;BKpHQuJKvIONZLt+6%>)`$r+EwZ7)TQCb zU8%jylxknL)^tAFg7qr8n{+D)ZA$k{JR!Z)JoBs2%;7|(3z$*L^UEwQN_|Uh;hVjM zp(8c?jT!aX43Ze22VhSDrp5{IKE44AIQcEp5lBJdlw!$t3U+wq%=hON5`9xRT zh@>d+h9{IN8<&O5%TDAuewhC>fO#~5c)uA(6+ns7Bv#ZwrhU9+msxO-FG2U2WY}OU za=ZZGoD+tYZWKy)t->;@AW7v9?U+5+b*~)^&VXnJtMqjf?bHYM-_I}SXN>0=w;FdF zuQ!(V@_Sw_9827@d(Ry|^$Kyv?hAI0?2?UoOa~ZNkf2jEXqS!Zg8oyS5=?dg^Qbd=Y9E&VzsvN^kud&CH;BN70(Cb&YA#Smr050vop!(d7I*io_GXZy z4+PW$ld%M<713!g@B#oRj_-#q43H`B%I25!{fnt`3#`%uVC@mv7IX($Y$XkgG7Ic5 z4MY0_URrwXwCops)@_H#O!U1Vu>K83R%SVXOjrhyICcJ15@7;J;I=*L1OL}m7n?)j zJ<-V@igA4A0xf}M7+Phka{3m+n|FsG8GhTl%P&)}UG{o0@QqvcuVSBtxp;~3E5;|W zE9WP=O^@b6-?5QWk1(pU_9KNz+LM7HMaq*nCFG9V-jmJz~QWPy!9ARLg0ge?fz8v-#}VK9-sF>50*PQ{xP*(AnQ zc49)++Uq#6D~avGi652qCR^Te5_a>n<66gN_W%ELx@RP#VUtv?z4WNneYD+uWFnLl}l1) zR3|pFv0tzH#gLn%^Z>5LbWPYKllAe){X4Rl@G9_5*?HJTan)jM9AfScjWBf+YQM;NwIv$Ek3A8Y9 z^A+|r_Gj$dY<{`BPc)#zbHyM=8pOAM>C7`{o<4K-%!khGIkO56t9={tZm@$|rBbeK z0Bl0U1}BN;hS&PdixpX*%z159!wd$4r>XiL-z*Ddq;x?kJtvgSq}DW3p~|QuTP?A~ zyteG~xMCZm0?fIJObo75DsM+C-~m$Ymm>CWsSo72Gfg2okPgB*xE5@EV;0iGUEhf}NqI ztGXq)jtwqqz?s6yb3PQJsIsoT6YlM!o@$&|2<+JA>3=Rsrz}6VF)c9w$Hhfi!J5F6 z-jqjR9Zk5Z$V#|rns{fWUZzbIUCKSOE$Y&PJfxCgrErGje$aCI=X;C6JQgV20S^Ge zEeZXAcIrv3sT(~T2Eb8_!GLOyx4=E~Z3;d9w))8Y-hJM+*TR?BjK6Wg1ltWg#%RKP0Nj+`Qlf=srKUO6O zSle1k)OcN!Tb1Un0Z3u%L_tOv23M)VmBB+ry_y0~tO9OSFmI+#UM*6#3L0KxP8H#D zB8He>T#SP8Sd;wb8b1%Dm-wl=<3pZpqvT!D6B~h^K8<{`!mvy)Em&b3JK2= zDv%sETTbXDp6>=8oZNSzzmsxpF-CeXfu3!Y{~EiUeS*D!RiA@RQHY2Lie$WVoHew%b4FbmRX`Jw`L3NDF{tU7*e z5o*YH`LN+a&vXCE3V)e@8rsM6ELb*X#gt$;o=wm2DrQST6of`q#c?&>zoJf)auI7& zkP9-KS(WSY%3-qRr6;R6nZZAjAP!N7epPv>8n|H7IA5%?qlm0VlZHxe;p-t|3t|*2 z5ELPkFleS^N#Irl13iu1Dv*jeILpEVBz0Oak@${jxl!s__uHPQky(!EJJ=l>ehkJD zZ-NtzelRMcB4IfKkD4i|a+73syNl=D9jik8f0`an;w@@)cf60`Bdph0C(`M1xe+!J z7?|veGnZsf%1i=C>E2Q$ANLw~_XGFKSTAZwhI~nM1D-dJeAkymiy}wtq3$Pf;w76V zHaLC-eB*_7BR*@$(~@}Vt>av%i)yq)pw@PUu6Qssdsj9Mj2 z^UCgC16ml7Ryb_87Nk(uoK!)SN?&UP77V3qQ~h6+^_|NrhImkwEovwLHJRXZSyfj) zOwegm3LDwNRqeT^0=UK?9Wbm!pGRazu^?53r*ny=l_eaiuAT%D35n_0PFMwfh!fFh zYRWJSB*e{0lfY1=4g0(}wUm+wM!#$Vs~~jqS=F!b-z+4iSQR8=yTtnAI5P~miyio-wC)Y1Ds_=HSVU|>fHH11noWyJij$x$a#v}i+oEYxX$%sI zzf3Atz1U7Augo5CH*__>%s$2=Uc!z^cKwb%?y(QBv+P%y2k+5fuYlJAUJLeN)cu6{ z{Y>ya_DS|{VgFV(%C^8f$o?bzjj}buu-jJ)@lb+TBVxsc)zrDHoST$sNHlr$1&OPX z#CUakq!eaRv7FR)J4q+j5-H?f7In%DBN<@$%Lf8uKn-gf??K(;!kVL$sU^kE=2nks zEJ_hHvA9qvFRIdy8unqG#|#%DSr<|MZdl`q5(No?M`Rf@JaGJ8b8xulI~W2`*$7iu zG2FktEBZu~C76t){EnlA6QKy=7)L$BqH#~9BjD0-$HM^ZTjZ5T?(kLd6G~z_j)Qn! zE_I!hCJwy-_ftx3+nHg3mE!IlACs;0TTU8*V*#Dqngc}ub}_4CB_sOt-|R2uv@KQ%?NTl5Y0auXhV)F{Q%SXhp$ImASgq>epS zmSeUzv+c62Gd=~%F}fY+mWhEeaX3xnL)TG7%IO!uA}#X_ zRnB&rnh~##z2M^`m5I)^pFNQiv_NYP^R&^lpM)ROJ+OKVxbOA5_B$-q&!cpi=YXJ62=OVXBBnlFox}QZbh6koxOeKhvF9gJ@$+2DfS%u4C`Nx zQ}A&={wvSjb9(W)?&qF6y=ncIqnBf?RSrxhe~iDYM8Fot<=bUO<~aDnb)F zHs39J%U0RlbRjjSjvS%O0cTVv*c`PdEB}OoMF-ezaF*hB{(x@xdQfNA8 zx>&+XBj2>unBL%8KXjE6n5AFgp@9JBwY6p-dBdr07VM2i5jwChYIX`6hUVpv&xPHXPY&B6!|{amm)D z#4`-caKo^N#=(Mo3NHwBEy+Sfyx1_!HepST!fj+BMc?gKGfBI;Ny`e1G-w)zo$`R^ zd0$bKNs+j5>PXFlU?|j!Mv}K$y25WnVeCAQI736|x-6D(d=H`H9zof_mb8BszM>>< zF$JL%o+tv7?$WN%nJxG;Ip)B2t$bHp!=GihviGw0fh9GtoQ&M8 z8REhB?|;Moo%<&yC-J2?Y zMwzu*?s92F#g!k-IZo7uYicW7Rp?GNV z5+Yg1u#PP$1i-eBbt+APXXTwn_b7C>OB6SD3k41(Xfc8b%kDCM`K-I!>ks3wr$34; zO=(@-NHJ@SN~f_X`U=lT2f7X0iBZOiP|VSCfy}g-$Q3Vt(n9)4!z}A6%6yk8`+Z5*sYxHcE%A zRwbR5giKh@iV182bS*3`3|e#LT*Xr%g%r!-wMo!zW@8Oo-s&1Ygl$a7h@U}^#D}xCoi$3YVvMNYNQ0jg9)+Wt!N{Ir^z%)9^mwtm*sY~ibcTQc zs8J(GS%i4X!3oRXN5%D@rvL9Liud@fR?Cz3j>vO{uNpI&H7AaA5EWq5P=IE1`i;12 z(A%wV+_XXB3FI49?vRsti(m;9cNVrIBJkiaPGlEudv}-zQpJbzjfD8&2vW!m#Lc=$ z#AoZNus%~&#M={c4U9uU^$a&KUCi>2uwQ3?h?<_8uQ((%J#kp92uLJNh+-R&A)R7% zAVvh{T8%`-kyI7v)bSambqjY>R!b3N!9q%}vg#n}SRnNZHHl=8rr~7_MLD^u@@zgY z;~$Dq1UgzUHKI}~9Y_m@78#9kmPKW>cu3%J!*3R-np8(Sgb@XCV0)ez;|592@i8+g z<0#iGgkMEoDc1n~i0e7NkC_MfK@W1PVpYY4i41eD1LLL%UXa}wrLq9Y2Z9AS z#nh&aA(z7xH}Uz zN_3sREZj7+5Qd}qK^XbI6!~ym#fKPqQnxo6n;7N$)H8vw`Lt~4@Bxs_kXh^ivqf7h zv;V?A&%VT7WZ!0g&whYe_+U{fr}8>kCF5+0P*b9xYL#xnG4T-<1cn0^rHNLqDroYp zyly$$v~pp8WH75@B=6?^t-iY8+n#UBE$(Fu4_bGxA{JI z8obaP>7lX|@vKPz&DM}IU|MNJk%wg;E+?nj)Kz`D&x68NRcrriA}~@kV|2^fTJRQE zC9jCR4Ka-k&a;62&@KX3Axt^De&v7|=AU3+XUVd4@ZfE?eOOB*4ZyjG5edjMD%Nx8 z+!V(&QESMtPYrgmzPw^~7+z4QWNCX~e4F%{%Bsq;znvDe ziP3G)<#;zGMJ#SdzCBBPV=`=Q!D}r*+=rw*C2ej|MJ~}JAX4(cA;K3P%Z>24r87&M zbf)VkKDa-UeijuJ>?ks5bc>B(+wu&40k43w>Zj+n`VKG;{g)!T!CIJU|PO>Nf;T&K6c&&69n<-5=_MuxaBoWR0go^;rGYpF@L5crE4 zc%F$w{RU+k8r+W^+wjw@tKj1>DvZIsb&<|MkNG7^3ni`AL5NKz4 zYWu!appuDj0cVDv8wFZS=-@Ibq0&Dqse(kwdmL!5!lePtu+jz&f2LM6Gk6T%sKi*n zURhaLxttx*df2!kfvLBje%tBW?wWn;eQ(`+<9#>o zJ$T>2y$9|)uy=OvuAQ?xckMiM+3aPzE<3biYRAa-sqG_Uvtzr)4(*!Vb?ClBv-eGn zOikUd8K-AYOYxO2QIz6K=Si^q=->Gp{`8y$c}dWItQ_^-F!H)k>G;mCHF|1(>Qx+& z+&x@-P7)jh$5kro)>_<#%#~A)qqGXE0FxOEGoqUz^I0=&a~}K~+x891HlcrYm2Lv@ z^dMl%PNItSRl}MXO?d9;C~fc?d48!qGTLYBp)l!b(@e^M2nA=r+=p-}qwV_b={7vt zh<4z9(4QpkMMsu&M3|zl>oljDej`D?F%@vovn)Zk2<~^Gd0B67f9`!We^0NTHIO(t zAN(QNsxOLZ{weV=%UCZ9mi11VXjJNkJTEmHkLpUxHK@rKiv*)%lo#oN(e+H0#-O&H~B+A}NisTn^XiC^J!_s7j}`E&?A0dDc~(4L@D3l~GwiK92KXQ>wf~#vhW#U-VBh4u>}xRp2F$~J zg7?C%%GdsL_YL^cF?l*|l_|P%S3Hu;=k2zsOo+kA*G@k{w0zK`9!qn|Ip z-wwVJ{?#z1ssYv`{~C%F6(7K?#wyjy zl2mgYoFqqIHhBqFq^KyB#xF?vp_yWE8$5xgHAhl0^#HIzktb+NuVCJeP?SrGj?S6I z-29$bWp9Zz%vJTw^-4lDOQ#qYqT>yu>O`0XbmsXvtS(kSkCY`E8Is!C{5)cpB>iU- zyV#*?!&Xa3oxOdE;DzGd4m5b%%_HYJBi_a-DB(3zcwi#S_4Rie$q%qRz<|EKIp*wqr9*$jskg{$-Wa-dMv|gRm=2dqc5qd$kUBvEkEUT- zezF*ZVS+M+H;VGjmho_&_t7YEYm&*~1>WAYr(-SJ4e&^uk(JEenJ&xcl4U?kf|NaR0Y zUqkLNL?i#n7s&JeiNzyl7qo16*H1E1x$hjqMs=uZ&rdLbna`swW4SKbGC|sc&y6lC zOfk&2fH`HZJH5*83rt)snE@AZEvh*)=|ALswd6gd7qp$W(YmGHQB8E5b^cbGxY|tD z@LuU1=bUK$-4~d+S~3%^;oGLY?qsdM`vMbJOS(qjyvj-H-Oj)08Wvmw5lHJ!_WHXo zFmbh{YeX(Q0_#n$viky)P)lZG1NL6!Bu=&B{fn=WAo0U`)2r;hz$DZXoL0tC-|^R- z-1T=~U=nIc*T`P&B;LR78ZKNT58Png$yuR8_n@4mpKsU=;5aXGjDQY*S#=r6{p$H!wlDCd*JnT>T}#C9;fr;xevqqHdwzJ-ghIc zpM?1)nBM^NE#gtS*1KSSJ01H7`ze@T4>N9m9~^fL%=_t>Q|v*Q?@-5|q;sEQ2k5gs z!fuE8%`iU<^KO_gfpgyv^Ip0>p8qs_??>P}KFW5%vIFxCFyryp!~8Tm0v6*V>_wP| zU@p|}um_Gi2+N1))_kYF2Zz{8V!!s1VHvxPADH*RDEgrF4SSn?o3qtD>NWisIK0R}E_L8|f=O16VeDRvaUs?L{MSrz$cvu?S<{XxO{NO z{@4B5rT_Et*3Qu@`gR?@a^Uq-SH0ot=GFhOCw^nsH7E8yaqW?Px9)rLO|$#Id;Nwt zdk2r+@Cg1Rc}6@IO1wITcUy3I|fZTP`Hcw9bq@I zqpXkZg7rJ#>)isckHFd#d_DY|WVf>8>@fUoVt2E9*vyslb}^f0vv5{C@-EnR9QMER*1O=G$Klw`u>F~C1YQfMPNE8q^7tjSue z&AM1O>#!cy3m>7M4X`1$0q*$-+lcUPHV!Rq6Z|Ms^dV>29DJk&wg_$RBKUZl*%o#Q z+X}7jGIlw9fh*t^?1o$NdUh4Nn!SPTVQ*yDu)XYBwhvn4o7jG6ao4j0?9J>Ty8%Ay zWAOCe%x;5Qb(G!D1rx^P(YN1m2V=j**!ZXDt61az2T)4`1PTBE00;nAeXKg;e3~#$C@|-+GZTc|SbzGw^-qqpyDCb?+a& z=*^0P9Qc06%U<=Cm;U-YuRWnC_(O{FgT0qO_Q*@V@cG|nit>ri!t3{54i6Xwg6BT* zC-D2=<*$Cj6Z1p;|5TJu`rZ|wqWtY0@IdD^kG%S^pLqO7rttf#;Qcqh?zNA<;R9Dc^bSS22A_vs z2j8ECPt)MFFMQ=kc?ez!4(RgKbGF_X^*Ecq| zws&^-_74uvoIN@|cmBe~OE+DCI2PiQ2||H11Yzy1T_F0TDa=LZ(@ZT{Gbv-s%|SjNM!7_m<_Y{P%Rzoq;y=zm6E zQk4DvXtzH{Q^ZhzXK%kZ8uv#1UHGZ_I)`?5M&mg;MmziG$o?MuCZ0S-bFw+!-8qMk z(Z*beU+3`lIkdmEx4qTEwfJ>^dn-AM&LQzY8b^AKq9lzH_$iJUHW-S< z?=2j+P})K@GT`@G+)+<_cE6|h8Cm|!@D#!4&C%xW#t7aDUqkrV7CMW?2g8Ho5xm3D zr${Vjj^T~{ojKlwb&U4LVsY};;0taHR)%->cAGW8D~-PR)Hz;<1&(+37q<)-N9V{f z8jZ#Bo6C#K_H=nK;&*W)#AyB%Ut)=Jak{uSSgCk8frTI=>dO`HrLe{bZsaV2Wp5>$ zLTI~E=KH(weGWb}(m_m{@ctC8Le8T7G2E=!6R|n4C!^i%WE(DJfV_y5*N+m+5Os0X z&L~!M6&u(j2x-VPa>F7zvZ;+ohzJ-JrY1EpHZgS_lw;eAV!|U%c+JG~E~9o7MKsRW zbJva>zujtcS2GbJgdo*&vG`+{SnWI3s%Kfc78^)Kh%yjGrWv^tk4D3YYRtrjhRxE@ zIOobY2G_x0^OiA+V^SVFFX@7M&Z3!GaREH2mPSfC@RY|2@MPc7twSbsj6n`nyMkB zV+_&(Sx^)15ySf&mEeGys!mL}4}@)a%NWDQANI7{X7F~b!tY3k4e8Xje3SN>3zs%66A?9^=bEX8p)>3iF19%jDTVhq z;PZmO4Kcz<^3`+<+GNOx1m9K+Q! zN`0!>1UU#@^`=AzFL|L}?%)BJr6PsELj=55#4_ts|nThOLGc ztlY-f!-(nzu??*xj_Z(A=Wt)*bwa3Uq?>w2$G(kSVqwcHL0s?-m%_U>_$YY=tbtIe zVd{1DyS?XSVb>`{epdT{}a3j zB%~$;K1VZ|X>##IAy%sM6ylDpbkGaPqY76J!RHBQ1uiKS1`0M4f=vtWc8)Y2%MjK| z7(^U~0kI+}p^YHIN99U75P~M{SJ>Wcq zOWI#N(%keMA7LvDqQp@#vHLtKef?9|@V%%GEn-JJDm)!O=Jb16JzjO(#Er6~GwNBr zUQtixzSC{R^~zLyuBBA?Bl!E2?@|6W$Yw|QcuNAkL` zbci`)aOtpiMm}h%4hh15@IlD5yehOHrr^c&iu;vr#eo~&dX)t#@oXA_ZLBx!&rw^nlTj`3~!IgLoLO5!iumfDQVr2j4Ezs8v|taKSEd&<=RN4%!~8SpfQ8 zZeKFZ>aTKa1s=Ent{PfK;P#46R{;!XU;hLA39_cVNBK_WUjY966-62L8a*0|XbKxF zwh4j^e8K*}PVUOhl;NKUgISn|4BGM^W1$cXi|{Q%H;FfrMMO7xBKD2szJl(GO+N>U z10UD#d076cLO`A3o_KL6m14X3IEKdXs|Qit)){ud={PuqonQuPvGzHiSeAk8V$#7O z!H(x*w?l2ybm0}$c{E{secB3J<5&;L;4$!&4yC3B{tZG7N&KtCgir@NuW|Ek+kg+p zfKDsZGQ2R-!EL!KTW32ah4{jP!0`I*sOzY{4>4r2z2&AmnW-CInpIKV3d6vv%ZP@V zV|u2?gEBM0Df7JD){~6Y=T^-kk3r7{Gca!0d@v9A+cKlT;0{@FnY?@ z%ycjrwbWQuH}0OH&wyKY0;+*%a!&(qk*Ju4jZXYI&dA-$P zwlLAg*_=2+@Cf5Z5%xprE*oPPNX=kc<1+ibebA2OW=mv5$cg7_{3;Tt=|m-@2L0P& zbtA#Pq1h^;PJ6Q#8Z2~-?yzfk9j<2TaPV23`VjFVhQ5f4ZqG)RZDTE<%&9L;jC!~- ztaQBscWRkVlJvh~xlAk1Zgq4g^4yI2!*22`qodmgtX=ZhQIiZ1$i}ED^UK_}`rX`f z+D>O?(O?HhyrZ-k>i|y zqAaS~ z4h@rbSEBUmPvM8~-zYCs-lTjx*eVzeYLKZ!h$ohb8p~YzTq4B__Ng}JwBI})GqSMR z#^A{iegiZqT>bjO;W84+joUkq7M8czd2rC^Jz!m*%DQPX?Z*W}E?5h}q3-w_SMM9< z(<13&;}^jiEC6lA>el9}1LoGf(pNdS-{H8f`*jvD?mD&+rTMj=ccau!-{vFoE(2f# z)r`QW6?_&26!Bre9gfC42dm)qh$c2FyA@q9RVN?j{aZSuXcYwDo?F@JTCs8G`E^cR zKetW$+MgrpF;#PQt3O#Aq{v%yTMW7nBDTVkRM4?&(5rr82W#zl^Pb%SQggzxIN5~9#9D{{&(<@D| zwdXtCDr!&G+__;Dw%39yfYqV5kz-}Ixq|en4H9W=qxllsCH$$_G2wvi)mt7pFv2*o zsAFcmv9AVkKwM@eQ&XembhmKoB1nB7LfRdNU3Bi&cfaXnQ;oTnVf#rt;ihbCv< zg-N|r_inkgADEiKV?O|wb@THc6|1uq74EGoF;b&fjgmbhJ^*cLe7sZ-Va)dY+y%aO zwn#f`nGuI9^z%`u6;-Z9bzlK9Ln;I{=DCC&-+U!0Y}QTkFy@;dxOL-slh$s}ay^KB zVeW%P6k2lb^5wcVhO0xvE16ccDlHn-0rue@kI}o(zkz!^3-SXw%?U&rB*RZ4B2EiQ z0@YIY_V?xsUpALQ-4Tx<{g0{Ub=s93#V82V?EYE&k;*vtdN zZ3XdaOe~$(ErRRgwia>+XLW%>&RA6xZqQ<|>%GY7b#fypjNxQ#TN$-FrEA%tnQvxc zWjj)Ll>Z5RJNheSE_QxTQsOOP$_>mTLIpsw3ll~CIXMcPa1a96k1S#YW*j*Hmy4XY zhOHQUKcx;t0cU-^haLw_Kw91JS!ugt1FdkvC~#cw$hOmV7a%s)++5zn^?Q`RR6ebg zijwX$K6<&cNNy{r+k-Z+y*%0&w5Ac(qs~gm^Y=Sp5IAYS+e=2%IK?h{SFp3u55+al zq8a)$`k>O2>)LF>$5tYd<0<&ln;3Ey2o#|$pSP(#-Ja?w(nv&He;8eO=Y^n)o=d0z zKY*50&>FBLmWEiPiIktB{72=x6j!2D>DlD{9_Xn6P4Lyv0R{i|btdv|7! zb7a2k<5#m4!N33t8Q`&!#K^bzj|a17UAfSn@Al8!zCvSK9X@B|hNH8$bc?f9@4j0% zfzUYHPfEY^*UC5H4=8I(?G*PPH5QLVa;C;&8DpU_GXDZh*7pEYLwFDg1|WV8(J&z- zc4`%%r_M|@!mn`BfazHo6B1&&eYj(9yl?{pRf20dex=4qNFMl?56qq?naK5D!5#by z%00@%0-x$jRv=PK8$!AwYJ+V%N_Uwde6Kt_cDm}&riCr2;Yrg1qK*gxoGky}r=&7XS#Xq`ZCyEBL+2*MJjhvV==`1jq)o0_g(!hy)x+1uso*p)*OGZY)%M;dq<$ zqXeZVzD24L+9#nsx_dQRX@}gJ6K!o+ZY2KV6I)72CP{8WjPkm zK+R>kuUnR_Q_qbnKkcSKDMjw5Yx%JicCya-Rx}H9z<)OIhBufXF>J>G8%o{_fXq5J z`z5%%MJ)u++n(oHfbmm~2KNnpz(GFct&C;EY3LkYIFxbx`d9D{{*H&cMmnRqbPjbr&I%ihb0R-fZT~UNrMPL<7t9jbCJ?W&*s#fyL`!{f#fXxm-J} zDRc4LkO*dM&`Dkyre?=7br8L2AS-Og!FW&`I|fiLiZo_Tp1lGl##Ej|Om{V+Bh_<3 zRm_CxQLEL7EWqe!cKeHW2eZ;QRHABzNmM_pMQ-T&AE6(`f1;cLzoYE$O6Ds-u#nqn zetO}v8^_qhkcQdb$adt5Z3tZi{Gx^q^eS~ChXtXQ^fik{VQ42CX*G@AG_bumo^PM& z9$X$eFA3^lSnN)Uuux?L&}nt=L8E>_j~x~l>3A>j2d^Lop6XIiG70akZ?C! zO)mdw#IEthpG0mLo7fGb(8b7M4pLp;Y@KPHWqZ3Tmghz^+bDJ(+s0ntVJixQ)WeR? zeFsa9E!mQ4+P-5sK%Hvn`Uw$aX0RgJQ4WiYRa2_52ra-|^7pgYDj> za|gMZ#hzdGL)|h=-A~UPtUGQIyPu)lPA;CAbf*)`>($W%t9Mb0e{)-rI{$y8AH@G!*_S#mq$KlxCr zUvT5XLDXcW*SfgZ+rI7DU6Ji{f>31L0b+sME-Zt^ZWz8X8?16~&@D7+DJ;sY`1o)o zSbN?B_pidMO~-WGTf_0i4Y=669k#2Q<3QEdc4qqUjxnz}t#h7ZGbw$YMx{ptx6wfn zF>kGkOsaCX@)SO=_)4c)-3>e~T=@URuSZVY;(h_nXI|DV(~4TrVB#FMqV9*hK`V+o zeK(4-0lKpa`X!$Zl5#bdNabr#8>evnttFBkjhB%nIxPc8Zw1{GLMx9KvqdM#l zY#^S*tUDUVN3483jcPvFv4fKHZoyw01YQ)mm6Q2{R=CwpTPcm~)+WT^67Tz+l5Y&X zR_4*LmR4RtH2%2-3g4HBS-F4Oh7Ld=)fS25(OB>`h$TN^nP!_MrF-os2r|+AVK?+C zaOf9Pj-E$L9c}5j_VUm{e-LV_tv`j+n7hb8-0-E0{}%lidP*sjWB5dwD;CfrT?jzB z75FfLh{^tzP#8%DwneU3<}yY)1e^!muovlSny1>&T50IUUe}9uo_`0n95n;_s18>8 z8nJ0^QxZj@GQy+e(z`G56hX*gNhE1PZg~*|Id%k2d$Hgvlz@r182wCj`Fh`&84eQ!%renMOfHDK^ z*57GZBH4@dFissmBHFbt+cBl)wNL6glNAVpH^}RhKzZ3xCl>|6k4H(JFjA%uxR2{8o zY7Zv<1Q`I{f8ByXksE6q3yiYxN2+i-$7rMB$31%n{T zi?`g`-?=ggtZc34#Gq16UbgvQzq@sqbw{zO+pg)_z-DwrcP6TbgCy3T|745ucfD!+ zg5K!n)yO7(oajeif8|+ke`ps?0@G<1L1@`^8KPTX|Cu|omD=CE`{8MMeyn}jyTfj5dt84t3nOE)4JgsXgV#OOzcPH&I~_k5tBy$n&nE57m3yA}?@ey;j8W!< zY2&f~4t);)h;mtQqx~LJ7joHMhIG=f&y%!l8ZHRvk`9dE;wbfbU%UgkE(jJs%FIZJu=3H$5lv zte4P$NLC3}`x%V}woC^RDT$wg+xso$qsq@OEoo7dkcIkXBwr9k(b*tE*8=M6v1GB! zoYtbd0Wab3GQSFZpg;HvmHh?UeCtk_T@pNp4 zTusYNpWHbt=fkyOZ#uQ239GipY1-9m5Tn=WcKlz8&K*sE2)nM^p+UPWJVZ!uy5<6` z_GpGh;Ty?v*g&9=w#5L6Q&F`d8hosmb)sY*u`*B0xbSt&2PlWEwT-ETQ%y|?W%1$T zhZbWV^$M?EueF**T!)Lh7LT1MHAG++Uc~5mbhX``by7;1r4h637Q1I|TInA6G99P^ z=Tp6UjQ*qD3N_1*QXlC65?xbMbyZMDkb;jLy*ubEna$n!HOkecw~#$2GPeyol;}-V zpQ}wvMtozo<)l&}al1WOQ<)!_j{x1mgvg2t(mclt1TuAbX;;xh4|pw}tj}j5>u`@@ zk95u+T^ir^wRf(dM=!l{OY@i=nUdR!3^R5D*la)Pj=M=tJI|dw@{zHj0lKlx*zqmm z;b`0n&cE~>QiuN>zZL&;QPPeBbWzLVz zOsL1wIAxDGm7}KTI%;dsQdyd`+IIWGZnqfCf`mj#MARUPbT>(XUzMxd>m#5xqu!;R z&Ijt7GOOEb8LS*^4Lhr;WkvnmO@aOd%=94EnNpY}WInf4Vt3ci4%2pIX~2dFA)x)> z99fYkzKw|2-*58p75Xgxe&wwvS;a-iQqn*;a55t8jr+33E;T`Lz@*9GE+XP-Iad0+ zMu4Ct;PK=?b9~|>g)g)n|JDy*B_-f-lC}fJG8S8FTWc2a10N8Wj8@oid^&sX%rO8; zw9mGE&XM?0vqLwtMbi+{3+-Ox(hNQYJP{6Jj!E9>SR(Z#EKfdy9U`|+CZhlhjyrrU_i7ORgg%J=~GqYd6-;M4K2` z<7tb?A~|rHkVgLsalPtxsT;F^y1i)jz`PQvS?T7jfcnX`=d9lT%1ayBrQ=B}wS49p zg!#T|=}fn(c-3K2`ki*0Q@*mZO&@<_g_t+KeOx%qAf^?wj8oliIc8u{ z-wJ?Uie3T`3~Zq7ww}85{wE%cXtCBwyCM(Kh}?>#*Rta%Fvc(6xc?roRz`!&GhWl^ zUxeOd~8yY=aw=*L5ed ztBmKP^|gWN)7P-^8C&UU0$#7RaPYzQBLScn9oLA2+EvVV{kn zwy_)R0%j5LeYgfKO6OI*%pNsp!{Kmf7ug?C?VA9i*|>!oED8%^x~A@uL@r<4~dibhWGr$AQ?SU*NG zpRm^?`IjqR6d)G9d|ADbjz2u#;c`VP2?K(xIAF zSM#aksG|xZi^=TDxZ;LMD+4fWGh4?|u7?Io7z@Fx5cTqtfANiJpEBgKY%QY}LH^39 zYautOm|52;Q9Hwqs$>5c_1CvNuUiJ)tbfN{_f2OnoH$ODu*dAZqdmIuz(5Z(>m|SO z3NsGf>QBqV{jCUjfGDnh@b*E{PHDT2D=JF#QbRI4!#}CKdKvwt8H5{BybT3jx`f>m zv5S7=WdK_SD)`#zZ-}Jc!j&}w6>JA$H8?{a+PeCFAvCk-48zt4G)ZU?779gy39E>h zrs%EY-Q97qJsY}aQG|d~xJMwO+iL74w&)R+-LaePS=aJKA?ez00HV}bza3A`UP$KN zt@qx_{MrL&qlx@+aOQA=nA7s}khNIYzU|^P?5xDjWZETqXV3w(;G0+8cO?n?4jAEh z!dLIR@MKdV{0jORqAIJ(Ez)a?cz)V<*!af<4!j{duby-=ES!#woNB#~cpPb7FU>kJ z(=Sjh>}|F9>U_J*CY|t%&hjW)o38W<-FMb|YHT@)xwhB#w6`$8uipNXZ+*iY#|5a2 zP1A1jzHGnPd;Yz5PQqawB!l_=-s-SOhx7Fbo7_D+dc~$5IOfW0zU~|L6m|3QdL-bQ)OTB)l+&Zfbhad7yT*Z2M7Rd z*j&Rv+~Kxw8_Q%5iJdbq-lXyP5Kz7630$RC>H|7;eVeV0%B(kVWzrA@GzqpJd+?ri znyZdEo~^lB0Qk`Abu$-WpcA;#=>TOwn!kS0iGs)hUrQLMO0sh2*h}3YHbvzZ%ib%O zu2nSfsQv@vnRIU8@A(w+}haN zXi(l4@J0Md<&yICvRlen7B!lT$c5{N z7EML>y{g;a?0R=x;e*h1ognfOTAy8SxgKFIfLhVjA#~N+zI1En1s^>FG|Q|C(6@Z=+%1#I zJu4Q7(lT95i()RSB=9-58%7Q(+a3Hm z#38QdWRur`R{oFIe;Xf@HRW5u^DI`Zr;YaPi1;l2QkNm1nd1OGO;VY7T2`eOrneXf zS!Pj$CN`ynMQhVyKV%hqbAfUef#JI8Xa-gx68p0KUE~qqUYO`E(7e%IoqW(*+f9Bv zUI)BInQeKFUQaioKNWykn;pT@bjd;)4QfrD;V8B-lwWs_iMF(d^{*Ni>PYxVy6h2K3~n>%);GHzFK*{qXpch zerTqH%n_Xze0v5_>H_lA;l#7>y*L$R#k>h8Zkm6 z?iOH)?_yi+?hGib>!(4w>QjwSFLdlc6(v5AC%2M%I6vt1cTFwSStetef!_~|_Sv9W z=g<=J0ML`Pd`avV?Lx9WJZVz73k_*nzhS9@Wt_mi-Ty;UPBpYXU;^xl%9icrY3?P% zI2|U_`=+8-!A)AK7+UaRwmt`lR_k_=`Vg|5$ct>9Rf zOTb&E03?xRN;m2FvHMe<9}fW%XL-MGHyJ7Pi}+=WjMVrPq)KWYHxYaP#6nI{ZIj&* zwxR;^01-w`9L6dDR!s-U&NI(SlE{D^xpE=OqrkO2$5JV$nqjHY?oH3x?#{bn0XJ{I za9d>EJ3&6lHXhv2%yy?BwA)S$o2uBt=fCTPbYv#E9ic z*(ueiRoMhWmbJ~j<(!D#$YN1S7(b1fG>(llLumvJag=5Kc4sw_g>EOZfu4(SW_g+K zw~MfuLLk`m7~n2MfgH}S&nAJ9<;k~rlVRCS zlS}no-**?USeRNYNnPjY(pkqD_Vd>2#34KiH9K(Y%=6sQ9aqoi@&o%v_pIOX!7Bkz zTBDJn7VXN=V*IoH^X;M&8X6cxyPY>^|4Zms@sBCblbUc+hC+*S!?JH+9W~5FVQTG~V? z4B(4fUCw*$Hq#BwFwARz#&fYNmK$}-m3i3YJbd)~geZ4NJ6_~dPj`Chnid6@y+xZ9 zEcK+*>clO9M*SzXKbshA)J;<_$>Ka!na>S3Wi+J8YCF)VZ&RwFnCd=T@dmoi^s?YA z@@&Fvv=UEZJBtI&8qVgSS9E7{7n`PTsyml2do-Y)XSyzThBxxXcv`#8$}v6bgd~2n>t&a&jXP{(Rj%N z-kz-5@;-Tqab^O0JD5Cc%!@w1{D$*Anr1k_t+TZ~8n=mB_i7a|`JV=zc84e2X(l+q zOVZFw0kO-ZN8m>6+9!WyV0hT#K@?%#iU8OBftSbm+C zJkQQ!kA*fDsf?mO?icFD%Malhkb2dw2+ci*nzmWi34#60HM3Qx82x7f@--I4MeLWh z#|?e3xxYEk&wu^C^!5a#K+MW_IMFqL%@`g?G)bx(-F481$wN)g(v8(kE}B4_ncGFR z?ncD0)nx1d5pno#wnkrUlNcu(4YoF!Y@N3uG(ljuu&27S`)9P<0)Xje&fa4?%ua1! zEh@2X18X9mgby$j8-vY$6W9Mz^p&Ll)$VTVAMftI^ba+6!{?kqUs67b zKl5LntT^-cCM)iH=41tyd6O8uN7-y_csW10WEwK}v?GwDq#?_Bn*C+#zyh6#uZ=kt zuFr1o+&t>edNtSEy^gLYv1m8)3i?JJi@7e5#5`{0*uq<*b z3tj!={kw0P4Yv0~Im-mX4s6TOH2OMWzq%&V@CUY?47Xd^+AuRh+jJdfi7H2gMee1e z=k4yI{{L?Lm@-o?!|F&goY}adMSCawynouGxoB(oFZ3r~9q9q!VZnsd0B4bfAQmD% zt9l13NjlyxtCf~j6v2yG1cp$h%nIw6b6X{v^FwGaJsVR`P#A;*^}>5@(tH$k)-T;w zmfNeDXJXan-j)NXhX%Rl&DQ{yR(3RM_zgwBi9V=Yls@)pX~U(iF9!;nyS^deD<@BF zq*-};5UHBu_%1a7=NLg2roh3l27aDut@VQ<-`?KJS?W7xr(3DLSnXp9h#vRMPi^uVol_SZ@Zfr6JD7>hhHM)lM zMa#tv%aO{})Y-(kz7&n4(ZM*p^OEH>s25fyX5hhzLp-`iC8}x3mJ2NcMPm@ylOMaV zX>e+3f_u23qgPh7alU`$A|Pwn5+tB4^#POg{*0?%34+ z*!G#gj7HonvcQcqX)g}?eb|j-fqC{NU2nR?CD&Teba5)d4UhmWV1z);`?1Xa!s+_cb}qp0Lp(|J(P6>qyR?T@)b*HS zC%-nhvfIU0JZiHdas+h=It5oTfI*#r1j42rL`=ei>)x%x>DvtO-_+0=WRLE^FIBF{ zeA*JXi!O}V=u77**Rz}zXtuGxs2`tf*y!h47k7H;`Yjv%!wdm;F*~fE-+U4L1-oc( z@2n6pMC#Rb?U_Et8t0-S#4O+O@|D%+yx_%q^V|1YaVe%#H>{|8{t9cAslgI>JrHAy zT7Y1%W>#ek4%iP|mnAZ*dF@l^U!fA%*UO}r-EErp^hFUMStNbY?s#!h#}cl|so90W zFPdCr7T8$8(C``753H(S2~q=n`?hRnQX;a80s~ijt-aej+vi(uDBLhH>7bkaFaQ)5=EQ-BhG}6OTIsl@f>Ze!!cG6+pubVO zs_Pd$?#59BWE!~_Zoc3;w$08wkgI;DiZ;=`)U${Iz{TdaZhFarQ-2mX^%ZGxr#*1; zoRJg$oamBvY%g<6`Xp{VJ* zU?y>3s6dBW{cA-i2hXfDatrqO7au>es7xl+-3lT@E8*GdK_{NZCg$vpMi znI~;)s{96iT*;p?%YQ-=RI;>Yw?Hq!~k;7TP1rTab1qc)> z0GFES?VH=tYRrPp*72DQv<57yH)2^Qljj^<`)%|pyrpc2`cir#EVQJqH#B-La>FuN z7oKFE<47bIf~;KJL_d)*#ve406reC}n`3QSsW4dTg_`|(S}L}tkImYb;#U(}esfGzx} z@}M}8MvVVA=ch^UdoUHU6 z1j^)(*G2} z^he=0k1y}EE*F!%D&E?h2VUH=Y20Z5?l-8BFb?gd3@v)UtGSe8HqOun{K>iWl=;dC?a&q_}dqfkT(?X80? z+i*m%6_{txNbA?p2hevY4=9QzQx8qI*J2N!(E_)SlLY=^*LNG+J?UIo;I^iQgQl(t z_`K=6jEo2Bwc4w6jD?%I4x5n*tN3wZ+geW z&jI?eYzy#FZ}Utxyu8~s!Q_}|hKYL9WOk;C=563iZJl{#U}zxkV!NE&HJRKx3;Ml& zsHNS88AT~Z&^P+IqGIniMj#Y zF9NlUO(&r7bckrtk0&!}LBV9JE?^>H)H%_^&<%A>lzZSIZDoB$W39}eUAUa_)qa*! zk9l_gd{3N%P}M0WX_=Am%)!c}um*#gX#Lf`O2QZbFjvF&3ip>t7!v{tYy)p0vI#;Q z-b9%=I3b3$PD`q>D#>7197nex49Z#8rnRgZ&60Z1WTyyGB_U^v4qNmTKC9gRj9d|H zi9B#@flikVD&m<%CGUpbjb$42M@U>&Hq8?jIV?>x#+imx&q)K7=2A!^xmS3ynakj& z$OLf{3|L3p^(|dhA@Bn00hV0*5o{lc2o1&|@A6`e31de(*t3CUI**wji;5u3!lJS_ z9$QSl{W?UzGp88rq?is^|KN zp@or$OlNZLYHM}=+}qH=sd5eg!WSbWb~Nr5x~lu&%wr3f3cMwA?cuN{d@UMocfDxk zy-oaA(RZSMCZ}i?vTZfvsLiQLH?;IWV<1bQNRcLRbmo{A^R!9}9aBxlhHS6Xip&gs zYO|&!7nCb)H)i>4rIWhoDoIt!4eDwaQP%C#13Oj0X3fcb)r|X^?b(*^F#~1B>V<>t z+OS4Pw_QEA$SUKHp(m9)7nak21<9>Wh7nFc=iUt^uf_2K`gn;&8bU7*)&USe%figo z`mu^l*U4Z@b#HfaHh?j)Y!yE8pVfz7qn#eOl27uEQgR2%G7{*LrmGB5cOJJC$ zu4+yg*Rkd3JmjLQwW?NO0EdpXyi8T(N3re}u9H(u z=4th;Zo4ix_^MZF!24TuE1)6wbSp|qpl8_W3_DbNcPUQcwEpgQ(NpLh;%v*XDeaGB zRd2D6GP`lZoc-x&+cGyJdlVO~Ng@J=i8^Ay_r2 z9rl9rcQ9apb(x20NRxIvX(J6hVPL5ugs&lDI~VVNbe_(~)wOkTPMR*xPjaRQ`!rcO zJLsPu?pf2#iD?APww`sg5^t~7{Q__l4}x(o0Uqy|#NlbHZ4uA+$aTduLffC*va){f zxxUVuc>=}6--3QZxp%SmbF_|nr&U_%-Q>w-9%?cO%_GmOh1AICE+TYqdiH#TsqtFA^Q58{->oPL1%4?l%dv<78YSC$%;N-b^?I+ySo<$eW&mZbv zINVBf2IkD*&Lg$ymd5QkSsjl?qY#|A=~(hXB*xFgusmFQ} zC%QB!LY!tPQ7lnn=wIYnYM;4i~%oQc=iic zs`WAv1#LGt+#Ls=Oiq_+TBQKeO$c$h4p9JL&$uvi%Pw@iGw6y_t(-{Y=Vs5DPcBZ= z5BDyg+fRXzgMtSAW!5W&G8nyi>djO(GtLok!)dHc3H*E zDOS6WCLnf0tGUY@*jg-Fk!5ZaLbG8aqr(F&KoNQtqOL>c&ztuuHp+ob_XcfM>#g)O ztZCFHUzV_J<=zR&)Rv1Ax{Sr2C-0LJgEu66Zy5O4Jvqc>xw-0MjDK-_m%cbm=HaJO%d(i*O&vrFbk%;BTH-W+VgPGEz%vb-iF7fDCkLiv^y)9$ z02hsv;Is@ex*(bu#-g!f@i>IL(>EHUCDOw3fJ?zW_xHBNdzw<@UUTYHQ=XV(^gKIv z(QP^hpe~wDR13n5*FM|wDpsXIXU+1~W<%2}c$%A9(d{!;b=bXNEYn9HeQ2~}6Q1P; z(1cjkd#eM(HX_@b-aYZ-wByKBbKRyIxORd8+YM$J(jSB<>y1Z77s?0J8R%>6B%z`lL_r#__I(WHp}b|C><+?NH@N(kB&& zlt${oz$zvy2WLV#1BcVPGBj%T&i8GAA2iSUt311WVdiHoCdry0ZQ`tA9cWzG1a5dp zvKLmM`~Ta`Wd-=S;9H>6@~|dtP$#odrAuZ8%54)2Y)y9@U~XAbF>%0KhnKOZ!Ud?9 z-E3OkUDL9~X_Ru#N-#p=Q+ve#c%iHSZD1zQHjR&54i0zD5u+5K02RZ6(`-{`e1g~*&ccnVkipg)*!F;CPg~j zC^{?cItG{auEZ|9E>a)Xer9dz_A8*_u#qDYFoG5Ya_ZiFmM;4mFt*6|6mq zE!?fJj`NnURXevId!=LHtaNZP-l_BTevE0B7;ft-@OFwVU7Xu!g4X{g5f!!Pi>Mvy zk~n}UMG_l{Q)SMhC7~1kXQUf?0)i4jVWclYgLqIXGN?3Zl66g~YC8q%7%x!TFRQwZ zRTJ=Ti80mSXWbn7Qy?DV97R~2N^RSxA{&O%!7QNxWtq!j6OdS#cp1h))phm3xJKA$ zSx(3xJh%AA+p(>4kM_`D`{8X`R}sP)kNUy(3%75MLubGyoR@hOIGnkn-Y?sc&K#~{ zaR@WOt4#Cu_Es^@J$`U7x3r`v?RXXaBmrJr=`k1wsfs|g9Fr&V?3TYlKTGDyRpq71 z6QFyi{Z>l{L2hV%SdRNICOsE~M4l$QFS-*JfgiM2b|!%=85)IBtcDJkg{Qx_=XG0| z?!ko8}s&bILzgwJ9@qtdzbU?^=b>dz9!)2Zf2x`AqkCXk}sDak>rR%wjWLUJV z_Kl6jM2|eyp*hQ@N!-Yzv`&WUCBKnr+Oz0s2SO}*ycd=Irs?B&F=;D93Ho)CP?ezB z!yBfjrMt12mwseAqH9{EUgEh?5IRrEz8|wJ5In(hcK*rprgNZ%?iXnux!ggH8}x$i zOIG0w2)7kE7*#14G@Bc@NZjxpVyi$QEfzy2UT#!rZu z^mKF%%bdVyf8KN(6G8iLI9x^~n-=(7c>jj}OD>xx%|R{55IdR52(dZtjeb}kZLX*| zG|2y3+nYewb)Dy-=bSsw^Nf3OaR*$?#5@la=82eRf`e>HwhUQL7{PX2mN8t%F&xEZ z498U&Ji*UZR9A6i)z(t|{1io%wG@_-8HHiA7?owYR8>(_Ri*W4btP$Z-}iq2DGp*5 zNz?Yi$D@7r+54aNzyCd6lcD=yd&Fq0tkJu?KJ!8I_R%(sTQEY@8Qu1v+v4<_f_d7 z9=E8$of~Ofa%YCe88mC0_ws54#? z6kTc-nOQOC|6YAsSD_q~^8-yr84>PW4cXL)mcKpu%kg-wYWueUbR6XDoZ*9)mI)IM zedNMf-p#FrtE4&W zlbKpqEaMMqa{fjqo01KB4I)m4GOgtaI24o1s( z@tc>VD7%vGh!lM{6^LIFuGOsjWe9iZ)`RiQTuZSJ@^{~H`CD&eK2`@y|3B)}+I!H^ zr{yH}owoHG26(@0v(H{11Jor4^;2fa3@!<+WEe7ePDkJ#MiOvSF^ zNZc1J=}g&79+S2Gv+dgAN6bLT%&%Gb16^u|$`7eix3^hbd9#jjXW`LzX|vDHnn=4t zbz80e%eU;n?CegnuFDgSl~lM3Y;KRq85_8K=T54#BvFd&U~mg<}z&H|^|>CUpAx$>q$?Y;gzLx)w_(btauouM0+kdV?>k z*SY^xbzAH@`8AxvbljkM0|A4pBoopZcF!)xoer}}ujl>YT!XZ?@>%M&>fulybb=w&T`9i+xkJqcb z#1lgxzcch7%pTPs-x}~%F6Q$XoaMC*phE~h1~ z2Fu2`Te?B3)Rn{6|6kAu?1lT5ws-#QY!<_Kv8Fa~<>ncB1dY2t*@R?(`t|;rPV7}0~vU{#O)lK8gf+ycej-V3e!$QBBZ7HgJ{??{m*eCy;`fqh@N;z7N?62Qh_}p2BxU{Ex`}cFUmol3Yx+{NUDz_tc zEg14)=r7A{#ZB~tYEF|MbhKEEv6$*`x%9?pLDZlX6vg#>+2%B5(l(?1CkD;q$Q2jr(Fp|tKC>ruuhSN`xSH-ccy}Ft z&BSUqYBq1c`l(<;w4tZDy)sadjp+2wcen@ zvQE1Q#+0gVft&)4uU{2w?+ukDoO(kfQy#2pYwm#%f}gSmyf!pct0@@t>gw)3cu$kd z61KHQnm)d7Z?#p1=9cnIux@{391=K9Lq zof4Ac);rgG?wBM?Z>Rq?=l?&*x}389!Y^ofH|-hkn7l`C%^e=RW3s;IR_B~8`HN`b zUdnl1x%U^8^bI4RJJ#I);`)&3?mH&El8=t6WcB2vwqN^+(ydI$ESS1|Rl4i4L5UzP zT_?7^iK&a71%`Axzjw7AV&$3|O*?yGigRi($Jt{J?t&q0zsu?M+HE#>e6X_X-r{Ig zp-ZpN#r5)QTPBM^b9({_o55#rWyXuOm`PutPc{d;8?3S|#S>|=j~ksSORlogof%51 zHPPV@{<2IjKd@8VJzDH9cWIA1+!j~B9*7p`ja@bA-odfTvZ<`xw4gVeOjesaSme@$ zO#WoK99-6`wure&Ck_WbXKJgmW0^Tuzgm4yL*(4Co*Eav^87yqlkHJ8``BG^SgS^E23I_1-bfU z<5XLTLwBv`}VGRtIywg$Y&lIYN<8BDQN`dZb8xAlYs+Yt`NT0YkXGvpsANg+g`@ z#>SoH{_X7s7F)z@W(C^oR_|Q(~<6q-j)WZEiN)+(#$GnpUzu$i9_m)#xMpCeaqavB z#@D-*ha{fe-c2YYiH6HZh(Fwc&oEWw(0FNUj8lWhxVf1mx6u{J)+QTgx++}Y&kR1f zRWe+W63zRAK}%6CU=^+F^pH?6iYQ+H;H~#{>R_OIXs9h)(LYya&&*{PC%mwRuvo+7 za3Lfl2eoT@2E-U3yKq^=8;)1CG*vs*irbn2l2!8)+TTKkdt^ubZA$URGd;H_Id$TC z=c@MKwrC1&I7a3EpE6}s+0UEKIElsOgiEJW8!xRIG!}0ULA9L)IaxvAEiwu58QT+L z*UpQ)q+zfU&t;5`q5`j`g;jn+U#|gyR&Aa zUb7l(7>{}!E;F8u_g&qPGJ(>7H5LsTELF|T9#=%uN*fzphOpcQDnG(r+S0mx^AH>_ z2DWx@K_uq!lsPkYUqG%P!?@lP)>MB%+*Wr`Yq@^b#gzZ4`X|~eN*8^oDd61sT{3^L zZF?}%a7i*%+V+ovZ~p}O&LD&b;kfMLOE+>6?b4`SSKu({@QLQq+jLH}dllp6NIDvu zne5P8(%tjr&O{<=MaQT!m@a41th)WG&fd=>oaBXz^TM<rdi|R3?N<7}uqD%P#?V%4&1WH1Is0;FP7u6U0 zV{Wt)i`~nXq3G2M+7$06`Pk)M!8_X&n|R&b_Sxnuwnj=52=T@yxRaWlDYHxay5)Cc zu3ky;rFO;rDQ~kXORhQ$;t>r@*rG1K%_zTFV)O@mMo&CdSybF#U)XDO_?$!XGuUQ{ z;Vh%v=&PHi+4)eH$PQ%2PFRKTN{gg z4bl!+eqm`pa*H!i`W;D!DCvF5${mvRKd~Bg2V|?-ua6jh`_7o_^bPm$P)_AawKA@J zT<&eSMox9NWs=wL<_TT9Y3DkD>2FzH*KgcezIJ!c9TMNe*X__rUAqluI}X);T|I`e z|9-BzZ=dq6z4V(wZC6|rE^*h+sm7)&51z{}#2IT$m+lF>`YN3de_Cwke7@D=^4GTR zE>d0k*ski@xW(i$StGfUmd+qgO3BaQ1`4yD;<+>)UBO))?T(h&oSX$6v_+i-6$y8* z5tbGxj=ANGoG%q~V>n^46qh7CX0y&83K(qhqXiA&WXfxT`0N3fMb+h^@ya6q_Ae=F zYS`>g_-$UR>hVNlb}d$EPzP=LSXq6ctsvsb)HQmoE{i^tE;-^b+uS}2M%cV0$HmiT ztLk5?U)w$hduz9IK}130hudCqS8k=T-Nv0=_OMM>J}z%}(Jt?!(W@nWb@5kj?J_T* z+kSa>i}~{28Hd{ttM1?4x38#wr0wTjSo>wBXy+Gm>zXbde%Kz$yVRY-4|1r11AJW? zOg9xbc4>{WUY0hc8k(-z-s12TwC8xhVSoo5f_{U|u4;0`!N1!R2pCT}5-MM{$;rFf!%$|;vd!n^wO|R2rLcnM=YI?s-E?vedBYtbE@e~eRANe{%rD540=jWd&T`T~!|?fB^^lWCmT+C$Do2^UNExDgkBK4@oH;EZQNYq`MO*aJG8y6qY2#^MGYkCLt7Et5$IDLAvO$CiQquu6p zT5jW{gj#Fc)wa92#AvWP{Z+xD!9r6w95CpOPVevB=7^<0`3Lpy!DX>he?vZRZ1xK` z;BDfhbk;8MqP4?oi$K+9-GtgmFn zU`*S$4_)!=@1_s0zcp>oJ94!`cU7dO{wz`7ms>Wab7@m?1vqgAi_7aXl@sl$-cWH( zB-d7z^;qRfH=Wt+t*WgJ6f~7bKXF}L_Gj6lmW-x1S`5*Nnm{@ccSo`jdqKlUjhq^F z$IGHNi@_9)M~qIFMNX5dpZdtTvHU-Rv+*lAbE!AY+0`-E?XmWit0Jru#e*$r^_KX0 z>?2Oq!8iO&`z*P7;8wX(Z_0(=9c-dVX-FjZ$i#yk%Rs zd6#iplDownQh!dNX|nKpvqF3DcFvpqOe?3n`s7zlZqYB?unWCC2@PG}!QQ%)*!7Y9 zuK0<+QZK46AR_3Ko6ker6BA9r?SuOyzBsqDEW6X?nzn!0LpI%E%=6(7TdVR@d^?vX zn~FUyrz7b1m`jQt_7%H}Ydr;ar_F1SWoVBl5Vh%DhQj_5If0*wSJ>6h7;FZE&0-9= zGW*ICv3)#;UmyC@GN;3hu-fKvTEflMmBUG=-R3ixO-8HT9gMs5ZnN7{P(M;#vM0U^ zIxtub#&}WE>IvDRF8h~68hZ2TGU+{`S@k7tSZR=7f0MKIm-Zf&?0T2X zcgYgGyl`sSs~o-E+%Z#H5g)p17xZND*bRQS!!0*Q#^f%gXtvZ7^O)Qvsi3Ah9AWqk9af7$Jc6gIWTHD_H9+CrhTrcErt}qZ#cb2{+FuHbG-LA?(r$pRr zb~scmm@09bz)op4DiDyK-*P(r@UxZqMr5KVodqd0V3Rmp2+We9)>s z4a@(8+&$vs#^8VIGCJ-TD878ZQ{eKv?9TP4au2`Ee_z_XzO%{T+Gc_npZC)l?cqQy z(^a37`{{TgwBBU5_)^|vdrih<*8K5U#AGoAib?~4h(oU-ZjL!!c1^o{OI`iI9B-+E zRZsV18p`x@+=gn6VudJw7S5#lKpq}wrV_}!3%T(!JG z^@mz9?B*f4Wy^PY1Jd>>2A+d0ZrncdOhftbS2MRanyA6;T}zj577twdDKFWS&esSh zZrGk2#)2FaKQ~ZsM?0zD)x(I;kpSq~|{zO{X@7EOAL?p)Wdl7TX})n_vQBkjUcR-Q`AwUJ(< zr@As3&Xjt+eppg8ovdmMlqBkNL5tPpGMXc?sHHL6mCoe6I$OFZWOuvuuuR?XM=wJu z>h_YmR3 zB)_P8f+bz~zsI!mid8*|toP#I-&5MPEybdJU$JT_{N0Br_l(l6ehu&B?|r31{R{ke z4gUVS(xxVmKafAJO(_=T_mIB~-_GG*EB-o>{~7$fjps)E`y~G2_--%q1o8a0_!j?a zt@!)CVo^^hR-FycOZfXOynh#e&*8avyKd!ok>_|Av2G-7Zi2L;U-jcpuCEM12(hU4{St5@`QxrBzGd`Rn+59rgV4 zo%(0-_hbAw=urL(o>%dW7tar%jNiw9pV;A5X#5ubeieVGwt1Gi)$bsm)cFmjS+q1| zXjN6n0r|A=<^Qv$ApKp%tNt~3N-7TZzba<+Pm$-!zvKA(Pk8?{zUfnp>K`M|6@SVf zpzT3tY6)mHAkV*2%vuxv`}=tR?~x||%HLC{>ytaQoxbAlb-eotdbq#G^R<8f2jzVU z|Nb}X(|qOMwe_lhgTFt-^FQF~ij8SZT?wceg17=Bfn~5 zy)lyfn&@wP6{WOXEOf^a4P=;;54b4;oI5# z%fPw(OTc;J0%=%ejZ67Y0r%!l0+;#KO8#NsDk(fnUe@!E1CQq40dC}v1COzmO_sKm z{|;gtWBxoxYUd>O#aDX82TAG`Ke*E?;r#2s2)NKgZfAh0{QJN(XwXAG?*Qwd7roNJ zJS{A(mFaEy_kf+?MGpx`nIq7G9(>9366n!`aw%;;sM0G3SmsLpIpA9U0&txv8^{Ao z178NkhVl*2_%lE!^kM*=XMth9jq+^)pA(?Upd|Tin$Pw5w}74b6Tq(g6TlJ3-=K`5 z76YgfT!JMSK+kdD3TQB*-t$1QF(Yae^rIXjt;?tciBYB(K!!%t`vx${JXuJfa=T%@9HJU)}%fK3NZGvXc z0_#~5YIR%i31-wgof+ZyRRS~~RvHT35i$T8y9ze<|2elTZ3e;NQ2hIU&nO@J@ z8;MOUt(kST@VSj8cd?vqme9izdiiZ1iX{IEsa<9M!+g6=YL7B~ zgU`n(;Z5e*f(EV73;JW|;;j5yC(5zHW4tH7B7m=~ki1|4YO%tuF34~2fFmm;BRM-+ z!XV1Dg5Pfgm!KCbJ%APTyr9@%2`>Tl`FntddsUU@17YDP_=_4g5;Z3YJ{Oa&{4`;Z74~drKVpZs zkvw8QcC@J{fW6SZ9dZyF`t#2NN6^pO(P~}+jZD|xl#G*-aY8a@fFctoW#XhvoRo$W(s&&x(r{85PD;Z`X*ekjCnew{ z?@sW$0Gxuxo#fXEzNB8^%SpbR;7jT~%(~XVwNqLD;3=T+^hxFMehfzzyICjTYiET8A{Uj@#S&V~H102fKyQob6v7hcp2 zNxla>K(1HvUj(k_>lF{wc?XzdId!Pr0~?SMTKKk=&uvT>?R&tlJP*SjJmC5maFnGB@PouQKlE=ybj!l{61L1^FRZ5_rV5!1hnNJ0@@)lA1vYP zKo6|lM-S`+zmhWms(kRk=YV0@l@GpGa>gJZAFSfrzyz$t2RVEPSOh!tfzFe_4D{s# zwJ!p5h<1FilheRbep?3H_QBI$1lGV0`(QbzfOXKOkFk~yd_4#hAM1k^NnOn>xfLzN z2T7g*cEARFu&XZuyCFRve5|DR!UOowzRm+wePvKwP0;SLxCeKa;7)K4?hxGFLU7kb z6I>RzMG_L+g3BVo-5r8E1b6Pf_q*SZTh&!P-7|A)tIq74?q_2lG&7i@})*`$_DT zHb5M22(a!(<~4;Qt5lQ$d zpaCNEJXTWV03&om4@5ah2v|tL4V^=T-rR+1Hsk^BgD5g3$o2cCr+;!oQMdqA z6F`qiO~9=;4%0tZz&yi**Cq!56-5klQviUPi}XPz2X0VGYdNz%9PC-UPT5IeJ``Tz z_SGf2up3}ad$`S}ZP^a^EVn++6O^zq-iriGO4F!IWG>&?MNu}ADMy7;asZkn)!(H& z@JwQ@U`g{}!@nejyyNjBC1#YH+6p5lLZHdA15M+GCynAk`K*Z}_;$+4cgQ2i>Az!r zASuB_paHqS-$V|KZhcH+P8Nt z=%6CIz#sG2=5!dWK}{8JpEa~&=L znl8P=ija_xIIQp<0h?{NI_XvCfCC|+vnm2-Hy`du%82;(8DTP_$wL3e07CFP0(Rj} z^8Hma&3CTPPY4?Ri(Ewpiitak04oSRh8h*(@TeTIZV*-`kO4N~7>e5`ZSj%l5*GLn zB~*%oR7w=8T2Y?Lyq2UzynfyW72i9F-p8nq#_aW%Kqr?nBZ(RaAQc?1X3Vrp2~_PS zi=OJuM;NbJH&CF%P$pcq{y>Lueh0sayA{LLzTpJ5Nv|(BWPNxFE#JB3>VLAhuE&N? zOj*Vp-Y2dQz{ttqX`(Jb@&6kuS(}dXod|S24)+I%wqX&)R}_mJr2aLuYyqS^8H{j~ zk5ol%hriqcn57HBUlzh_fb1|Si6eUQtf^i@o|zghfHeSTF0=<_B{V`}8yA9ICLXk` zF64?x(PGG7A#;HSlE~a$XR4Veiy=*gdt{jL^Z^Z3`BAWf77eukL9ORpmd0X82o^#r z-E-+pXe>`-@hd3*5Peb>e>Dh^=|veIH@)??H>G&qyX006Ic(18 zv;EMgV<;D!D3aQ)!PXqHuOFTu(CM370&UbKCqVDs8(m+r10ND`7b?EPDJircit~dg zv>K?Ol5aDrAF9hdvD+sc%&;8>{3w+&jT(%;s7)mKC1qNjJfZ?k^4m_X`7pj4>LnZC zTyUv`@6S4+6~D_;_alCl&ZQj(x96CbB3h)tsbNj)_(i$cDZY^}2c#5d((l~< zXYm;K42q#jxZ*dfoZa%i0G=grQ;Y#IU8+4~qDaOA2mC_@5c(ZvFXy^Zb`8@$`+Ah= z03u?*m~0KLAID~W++FNqdaSw7IsEqxHlWX?C{TTz_iq(9)k#CKJ+A!sdek;6+A6B~w6D7Dufr8kiiJ(VT{P-1`Sag!%oL zI}e2S4>5Hl@uq<}roA%vuxf3WLiczV#^*51QuF=G)$UvqHnXi({QH!q-aecyrV;XJ zuvXlGRvenv8)L;|Btdc-#ka=}*eW9M5 z@cec#z4?d?WnyE;WH&}o`j~-qZU)b2QQ+Xp{!pLfo&C=_TQey8`A7GmK&UE&9aBvL z^(6FnN%x@?q|ep;+TA! zD;S=S;u^L-yqmRT_R)!Bp#wG$DpNjqN-99qgARTrfA3FzcuH(Iyd=e_?E#DdP7-@v z$K-#?QQH|9f~~`!j9jER(`Fn z+q~n_pernn@bJxH;lUcKq-TYP1(4Kq6f!o&)S04ctKfE{tM3SBxX&dX%^k-AKCPCi?69qLqp(CLvKL96s|KKewmjlIc{c2scI z5&2U#`D3;V>^mfiJoFj3%|_FW8_DC^j&Qd> zHG!aRqKQ2Qo(hhv+3sY< z4%>U(`UXSsh441_aqTpZ#(MHcT+(Hzo>1{GcY9T)L)%wVORCxeLCHs(@4v}KgAoP$ zF9!_95w29EiFPNmMb+`_GI`LmGCcANbFVO9nsyWVG35jGkwSiEzpTTjtPn(9J+;a- z8K-^FabN(r-R0te*e%tsk-8U6;Yn~3psFLed=AHcF+p%aJOMoYTE{|tDi5NZ)hhIr z3PF7SD+?*uK$^5=-NaUh@3ogFxS-dPjuYChA^g~P!Tz6Qg>$ULtBxdG7WzIJY&p+i z^@esJd&CmS#{%X_H}1B}!uuJT0JEyZOM%(K@L+=_w1Z_N9LE6XG?K@kHt}q85`!9Kj@HwhlYHEL0$MUq;1DmaIZ@mS(pix!Ox`dLZuMH z1plnS752wr(llW3^dx8M&}S&FQyTBlktTvIy^c@PL@8bQhtr9A(&#DmB$vN-R6a4# zbMpOXxBj@}36X$3L`eBGoXt72U17p>Xs|LR*@&UTn8Esq!!`Y3|K6K2yUhAocj&$n z_c9Qj$wM~{mT03QxlDCYl3@q7O^x-@;rPhgFf*}8iZE?7hwDMKF6XyK}(h8tO+9J?h4Lg2!XFCcCHP( za^U(vE>B9?*1a21`v#dL$>Dhz%&JP*p+e^9M)KzFS^5)%GDmKu>k(%VAAE|hQIz3$ zaYM+}a}5mC!Bl5DbQo;UwixzH$eIGeS~C=q?fW>TGAf+o_*3l@z%4o5-LauEG)OQeuZml7t^ z1CEBRt)rl2C1`9=FWgU|pkWTe(1}UDzk=EjM!Gm;1asQkkWSASHgVayqMTy+OS+J* zsSvC713+YxzL=sr^-%VmYS|HgY$i=NcEfo@27X}&wO0YeprpU)k3FYVi?SIWe+lEXVX?XvmK{AC?|AJ z=XttsESP|2vq%z({@T0qY2Lt*#^b>ocv-#6R7aSSAzJ_JnBcPi&<^Fv7@RWw0jpsV zooScGEYB3ruN44x5zyab)D$(Pumc`L(4|B!XKP>Pxp99MKOZ-v|HPVxA#R&1!e_KU zw-rhfMC6VZ)sCBmH3q~ayyAWz2`+pZ5K0nur57BzX4qRA@xSA?NpnfO^h3YZp5XQs zvkySBmk;=b?92)L^WjKp1=T#$rMRZSKOyHxswg(p11Q##nFq|(8(2oU3krxr8>sDxbh3&HNlsD+{_Znh4V6QvYCimj?rBo{0L&VW zp`{Vr$E$(RaAHn@&=gL@+Q7%s;>b5+%?+<#9o4Wl_NF$s|F<2j;da)KyR+)&I%lM658bcvy0_1!UyDB z?>^LoGS|6OCf8ch`7H7G$alcuyDXt3ltd&y(@A~{AQO5&KS<%J`g50WQVCY+6K^;K zj~E2bZYC>3&A)IqC!L>*Fx+W@`_1Q8*@F686#FFVL(b#}hQ!h84{m+4eJ#z5{(FqG zPqeO)4+~j!QeeUMEV@I{hk8)B@Qmje)hT_TvD?N>qJrr*2tLV$Xl~lv*DMG_Zj*{mO?o)6> z4GyXtC1`C9q3o%oZPLlt;DwCdt zAfuWM?lxspJe0ZJ>McO5^mdcHWD=b8=acM{w(y6`?X zM%WC)wEa?-&g=y?fy=`t9+kP=Uu@o1h8LR&>QY*fEC?!Va;xD6GVRD$f4e6dv+mGM zXpc&$qQSn8BmVpMqS%U!?$*m_-zX5zc2{f~c6FCMSWjEhigR=u?3w-YTm-%j=)W>5 zr%u_Eom{y=D7;ttr!2|nuQ)XPBR=S_37I2XPa_5R$~i>mssk~T6h(>;yl**Anf}^9 zQeDJUl5fVm!HkC%Kja^bp-pbVIp#_!`XBMjzeG3e8Wat9-=3e6gBoR)&w&iVU!ob5 z{qa18DRaCRYf2hwpZ~+$LpV#O#+RPF$G`oq-*=4uqZItDV1-1Yi8uI5X=S4aL2=$w z)(TBXp<_N%)nL(%NDt6P9P6Fj#-Z^FaOLOp2^$tRCt65pg+x{ZVFsB%voDf; z=-ok7WhX*I$OWawNqx@k(iq9|m+=lC8KMnf{}s%%e-MJiUA7j+?uS}tt<{VYfne;q zX>IcuSQ91W)U7P=;w*4y=qckA4N{#n5vXh+Yb8Te;+w1VOrorv{$l7LP;o7)(e4E6 z$qD{V#^VPk7<0QaMnSZ8LDmzw=qT{{#(9(NFry=EtwyJtA-yqimt1mmQnl?gYE9|& z_cIZQNAB#$+AUOfAe2XMqqpUeQt216mM|vRw<4MqUo39GpSrvrig3LMZy<*CpYoqR z_I530LP!8{;*AEQSke&enB;m6-XRcUG1&|-96Uw2c*Uc!RZCg5cE?3|Y#}<|3!61% zi+xYvPyau1+E>bpo0{nniqMYSxs%9SGsI;HL3Hqx6Q`gd(lBu&5xE!;ziSpf;S7!u zQf%tjMYJ4(n7OA%Qe@wiu{_}W_4n8QfR?>!^iES?<6dbf1(h)Z8fQoD`4OVL);3qW z8R!1BfA`ceRI#Dcv?}sudgabt-jmbr*`GxAPCC3NqeAIgI$XN4q7laSLAY0Upkogh zIvAE4wCb{foF|U%*%R|<{&o&v03L?(nF3=n&SVfS3Ar%7-EadBtqK;AvlNC<_rL^M z;#G1twX)Z4{AGzx&X3foRPf5?CPBoJ9mo|H`G&3w$jpjDxY5^Ax*KpGQc@TfO{okA z$e_CO>;3y!?o+Z#{+ZJw&p|aE;)B}x$O;eC8(6jJ7U_(~20=-uikpHPYFuyh1*Hmw zeOEzAw|*@-d7d0eW=mp=1OJq%=sC?QQ!eSiiK7K~+@y!$6F95ZS;?~NuQwLS-pQnlN!IoT51u-20s=ov>=!)IaQ{-?(|@F?^?7+1r&ze# zQ24kiWMUI+D10tl%o~-trx^6WKU9PY$)ffg5EOV@yoM>Ae=uj?6yC5Rr2zA4=hcyE zhN|Ib4mOa5^tezC#gM@UVN#3xh>(+B@(9u0$`dI04#%C;_&BC?%07s;S8B0jhe(|t zMfiI^r7O1r75^Zy@4J*hL?&GUn1Ip}gxH+ncU#*aQxTMQUA-%TEgItz?Hgl_l77Xg zF>e+%>CPH@E2<ohIH&IHOUJVLBN;N4ibAgxe#h z=ai{wplKYS8HdMq(+&CR?D|ziIoe!PYg|-2T_LBTnMQxs2ULe9gb<7CKR=m@RlA1S zUA0rr?#hS3+yU2smv`??e3@+b?IM~ct29(o!93I1nfMY1oT}R^`j1a#Lwxj>A0w+B zsRE9nHpFu_jeC}9!9Y%^Sa4Wur8sFKBb29D5REwqnQ7e|zhiL(c04a` z9=3}g7OSanvLZ>Mnn){`hM&B`v~!D~A=(dPTr~*de)uq0OTWLB#XPHcnB#&UO);2A zA6+qFIy%ms!UO+O6ag&$1z#%&e{qz@NMD(iHc7LA?x74`lgZL~er~KuY^N#%c7K^i z-p|k)9MB@av=J|jetF6zI?B{QjZ3!Ov~7P=y!wrA_;JR9Rh~d#I*uK-A%ufCnU)`1QkzCDQ+U!bPn;@Ao*ektcac9^f#~g#kJ)PK-vUA zw}Ap0feXYz3&eW*{g7WiAj=7>xQ+ox@jhr8JHbsXD6Z4#KMF|ihh18QwJ`jXdH$p( zPKC$Us*@K}ky$ke$w_=bVpqs#oL?XHH@d=ue)!=7p_1A`H;9+&(R!tBrnLIVEr38$5D@^kHn1^CoEPZs%4Lm#UN5jdG2X z6uQZwZzm1ufmGRA_$A;^LKFHAXZmSC+LBpql%)b>cJy51UafB9nu*#A+t;7BH`VeP zI4JD8B-GwMfI44kHJUReb6!|9)cndMDGwqlWJw?BN#@Ib#CHdDTrClW@L-FEL%p7>?pCS^-I5a}&V7!0YOsSoZA-%5fkk=2-_Bx^Gm&h#(nO%m#uUaK#h5FMsf&%) zoKCnBEn(;l*fyWrN3{*w5^s#dbQ)&7n|H@hM*TsIfFhDxDPHpMiOGIjbF25Ey(J&_ zChY93cvs!{dMV_2FOX8qyvfHVr)`_J?W3HAd50~;N3dE+?jwBC49-ll5YIP|NFl!r z#yQ7&kPvn;mf0R3!zD!?&kPi{#UW(4nUM_bKz!D`?+l~Ux^@<*rJ7o{IK*VT*&TMds_Q&Z7opkKos`c^$igQ4SfNj zYbAw=I7CdJ(ETktWp*26eY6BP}kyQ+%s{I4? zJ>Md`gjeeX!~AWmXCcEIQF)FlW18$}$_*sL2ezlw{X!AHThO@QdH@$TY(JOF2 zEOdzK^zN5vME@z-abC6}#5|y(#w)FSY%Ju$Nir+itOVO&=cfhEEDWp*f`#5|HV(G5 z$&O!ey6f5{*Ur-h4bt8PvAdf%BnJ=?b^q~z3a8HiIyl`IwrD5lIl^LLhvt_$lC?i& z^}%2^%|2SYR>GkvTJHuXL5JO+O3mmItFRVJsGk?+??v5*lKDJ{9bv!4KOi>5#bHF#cT?U08c#Hkj z!j~OTwRE~C>P1)EauZAP@s;dFS4>WU8Qd?a5tLP+9k)ytY)8qXdk7IH!Wy6cj!L9)WyRjAHR1^_| zOAN(?jg{s{be8<>3R^utyHz_Q|FGjZ&jI)nkFDih&?Jx5n$5wPra9W9Nfgre2n^-% zA{%zrKhGZq43(hUJPpi;HY&{TUkIMdQowpr=Oe^psKdUymutd?KeC9EaXozM3vD_<_Ws^RsZPjHJXz{&J# z$)zW^(3b_c!3PWt?{vz|Z)NatI#{lyV{rMW!l679@Ot-i!ppO8XV{_u4h|+(BT7V&!j2e%}1ZS#-f5)N!J>%jmn_zKH21>biZlkt@*W4r2 zM6j50!86*rGkS@(z^B)2*wBM>{9nubJtts)Gg7x%t)XXX6>Xr5HTS#0U*RdV1pz&C z_?{`o5itLq%xZ7oSANQ^*H#%O7?z)lqiP}gtX zE6sjOcn!Y4xb)*N=iJh4R;XrLOft6R(O+jtJNX>`P_)PWuOwlRyV*GG_a<}omM z1m;JVnuOb>x)2#`Yf&aMiLUTMZS1Y%S^qfYdKrXYccOw#Je)2*U(N})uadgZ>xWYb z!in~i3NXjB-_LpVHykHjAwqJI4ffYty!t;Ki%!*J9S7ks)ej$kzB$fSG%a1Ln)$Ne z&~z+1REHIt=ANC|MZj0>QPMu{>yX#!MByEP#Pn}kc;9qhD7t+-E8T0ns=~v27gk9k z2vX5Pwfl3Q$xbxE{p^KlK_g*WJkec#2FZ@=!z7Ct+_L5+lKczV=QJ{=eIaxF$7OTA zHn;>+_!#7s&82coS5GV^t9{I>U1zTBHGo;lx)OeMC!BJU`%cLNk_*xbKujGd|DZdb z>EbG98P0u*bT3>^z8yHlt#nT;?>!)RB-H%`i@q(bkD+%m#% ztxJ>>>r}1foz6+s$8yy(uGKJAQv|f%Mvz+^$VX2YlZBkDEJ<76P-@JFH!3_3`dohg zM?X%eKKKQ6xeaC0d@N@FDDMJ4Lfyo^{@U=z!_H_^b~qVN-$?XV!=INJql2_{WHfoB z)u9^M&cdm+|Fb=CNHL~pUVB6mxx|5B`n{C`zlHz~dOEcq{$?;?+c=>PjR{K(=ocjtq7 z)~fLmz<;;UIM=Ct_vyuj|DG&(wYl0sZ>D80dyn(?PxdFnSfjV9(~;B0+qcEqWrwrp zm#VO;>hr4gmzOr-v&Zc-&{?Wj*V4*zK;3y^u>6|~_C3<;&F11}2*ogFB}N`u75Qsw zvUUu6RpVJTbS-^lUU&yR-GG zf`wtYCC^UPt*k%KE-yv%ztP`6ImAKQ;C0nm>(P8xR%hh5f4{O4hedtP3(eZzc(ECs%8tk${GXhA2QJi- ze@D>RNG=txGQ2NLb9=sv8|*0?Yfbt7E_fI3ndjTIc!H=8T}E!<7Y%X7(wa188-$QM+69*BbGZcN z--%)AU%spTN~egp525np1^H(_}wP5=>5+fG2K4L6n3IjeM=ww#)OhH@yeC zT?yup7~L!G!L6U}iI;Xs%Wk_7m;1vb!|G|N!y7Dj%pt$pi=HDdgA`7E()7}1hRviV z-eevMhD)i32ox^i2Cr9=E~|TJKW>#zzS+^tHBGs9LY`YMC%_>IgO_i*!SI@!L^wI^ z#qH(K`g8bW8aJCq@Yv698p`kpXaE2J1)vvHA#92jStS|)02t2z0PHaB7aLDb4;L?Y zD;rzbCT7F=#lqFe;mc7y+KvX68>F)hHOB0&i+rdGt%W7=<(uI)S2>8tPRd*lPzZeo^n<6DL}7@~;Cnn9 zJyUXWUB5fGqj9ipm|hPUZ`l`}5ZX5dAOHrXNTA(ARqGno13?SI0N)^h*y%}?OTiU% z?S#WKgtb*YuA0>3Y1GLj2nkv(2Y6ROxzRo)ep_nu1_Vq%3RZ}!P3n#+4z^7WI`P+> z(kn!*xUagys3yf8Uqn_iI1GQ^%tcNlz+Lo}0|sw7^N3BZpGC-Si@M&#@9r{+kVkE{ zG623ZiDzrddd{oDU3+ajfU}Ln*Z#sZr+)eF)eLNSSM0lddENLgCg}29eCqUi&%x*>EpNG6GLWt#T&BQ$m|E&*d5ew)rid= zdhfnMTUYs!tj%4{NRcs`*?m+Y3&z=Pj3A=+ zK!8E?Qp`2snC5hufSjp)N6#j5gsFuzbG%lghz@j)8d)CA-Gdn4$N@L+x$IoMqXMfSI4N%jIs>`9o z`r+$NwB&5{)rR3w;;qa1Ous#5q~C_v9|VBZ@KT3+ za!+f`rBnQ^pUw@1r{85hMocCt4=TFiuOcUewn5X(G0Fe9P?3|7%hbK+QL5Fa$3;T~ zk`Hiwy+-2nMN!L}X>R!2@U|w8s|wi>&z3ejr$M>ip^T9>o7z~8$FOcP7nsJx+_OE= zpdLiw&Zee@C;$f(!hn3TQW#sgk^IhB3^x!)3ME#?mN#=Iv8+9Dsb-8ujv!)^IEdHb z!CF>6$ld1Bf;v;!K%BG8lSvHgyOjVIqmR`f7D8LsT1U=${Cd#&th{U3G#o)q*lir@ z@@JB^KM^DJl2R#3DYMCh{O|rIjdr+UVyH$j5~OyUze5ObxuXYFUWhrb21t{5`lWGu z@!-TCFjdNx+PaobkR-ZcH;^v=%B}(D#O8j8mt&ibv9w+`E8@NBebW>wHQ#b(!dm)1 za+m9c^VBb!nh|4IBs?T30R7R~vk|VYg|@Tu86sR9<{i)vhY_JB1t0$|x^2Y)ppfq}Xe zyS}F38gGsEqZ9WTFTNJl;661A=KJJi!M7S6JB`50eu!0Lb#SQ~1HUI{440O}fmE6h zV<3dB)g$tJ`}m

      rGd>6@>$mgQ}sQ5B}rw)Cvn$Y*XOx(p+9h4X9<5HiWEUYEGZlH+E|F#C0$+rvMr`XT=DMMy57I=2+?94_wvaO47&f0`E5v>M^b91%jCd_Ha zH>O(x&gQPYUk>_$;XOja9~w=JK72;0+c)tqx$7U1Yxot~?mv-%obCVi{=O~wO8~=P zQI9nPSh#_K-dn!xh;8>Vc79=Sk(Q4CNV{I_kv_!TuEOS!zkqC_$8wXggt`_nI$ByYb?HZ*Qu&gsTn;gXJq1<+S+`?_ zoH-8X{oi5Wt-r;LrP^nTV4sR-IxU&)PpEfot4i-*>uxk}E1f94f9eVKQTll4YatLh zcOkq-DK;z<*lPG~va46;^ST?Ls(2jay7_O-!fU55cO)b6d&cV*2Y%T|eO|eofOz^J zWf+$7B?&(jzfJHE2RaPnRMm>ik9}bM?LoxB+`R+q+ZGpKU|$#sn}QQ7#3t32`xVLv zR%u8<<+@+pIIW)$E;TSg5jDno@-u5dv&V2 zdOHVSncija`^!Ua@F@C4&0bkl@P|b00}E6-67;CS<~sv+JT{}vhD@?w)uU$sW$F^* z{9FVH6Mc!;LY4#xY%B?K_6*~iO&)*;zmF@q7FwLPKH z;d{M}7S+VQSjeQtb*T1{C&)B^E(dngi>(qialLUD8lt0{bui z+fEc0g4ha6QqEh}JQjh3tnxr%yVRlq4aRrOG3Qi+Tq>F!P6k$z!tOOD>D*`t-T4%< z`otoRx_l2K@p-@1BBiYondzHmVHx{7L()E_6E@^K`|fW^Z4fYv{asL8m8~!SlE}#j%rJt>M_A}3EGeRy z%SAW>;qS8cqsrXNr5Uz*?40SC<|5q;fD>5lD9Ao9Nb(im1zU$%3BwP*wnoe?{ez+8dwr@Y(?Q$7$ zjU9ae;eEmWuKqdOBAC?J8DFV@5 zR9R%*TjUOIrOVqF8L7*ehT0=so3ye_t!SA+8je^|4t{)nvuS@KrV(`gJ1HHK{^)M? zHsiQ8k?u&%9>ql^y<;&1*n^}23=cGy73Q`{xDXEV5@F@Yy06{)-n+!vSm*Q~9}!W# zUjzQ8m~}On6IBuLqPD14^zDG^XepxBL(tsvo}kW>7%3z|U}^rDVItR$V^%h6cvJ8`Jop;qv7$YDR@d{XUmAN+~YH8 z8-xh)xKOB6Dyu6e>nh0!a_s(2#I2N5y?xY1I(}FVUSw0dJRf);aAqgrtGg+JbXxOD z4Gvyq{6P2V-|pa15%5Pj!|eWfiHPjr$bjg3x=gnbteS@Wb^INt z5%*mM=UrZW@-%e&y?DfnOMIe9i!a{OqfBwf-yh)_5=QyWR&VjUt#f2=_bbX;3fQhk z&KGAF_A=8s;2wxK7&de>2`mB`}LIuFVo-uDEN{9jkZFR zb30JXqv<_LWpXj=e3T~G2}7fetlvTP8HM!f}`{TD%eDb zC~DWDaMDz{?sdbP`F@vzi^RNIDeT>n zb;}{zv5T1oD7#`KRU{{w!1rKu+pdQ1$2;(4d$>X^rp$P_jRqfbkJfzOBn&A#LVmuu z_Dd!yF07!_G;S70kKDPm-m`jVzVy+67e6&3`Ui6IiOpzIzrs>c>uRCy5(ciE53ak3up zDNIK3&!0O+j0Vi|NE*tT#$^n@t4Ts1!wM3MeY_O)3#Ex~CB5xw<0WB9K|hk|PRv8Y;lZQYiT z_S%FOqLht0?Sf==ZEp?qFB1(tt*t6SKU#|h3$^WrV?>eaetv}Ll>a{bB>Nix57_1u z{7Fam5ltFGZ;$u)3MU<)nM^HBLrWsXG^4SJOpsbQ^t?dA*B6v~Mw%b??Z>vVN#Td1 zI;@0x4a|W*LX{WBxwIa%6Rjfb=VlG$BVQjb*m@<+)0^}-vhx+HU!C8Gw~|eBI>Yd_ z1nLqKys-`uA`~Dx^wSNxv*=>wA_|e^gL)rheog+6IKNn_wWD{8Hr}Yc8Q~rNzV&#+ zNny|Ty(s9kJcY>RfcdtW&Sruw4z=8?Cq|@ZE2Su?Z7DHfep)3t0bg%{#_!GI2>nt^ zDN69hz8^U!n`aD@xs8cHnzg{bW?DxHjaPGyu#80sQ7Kj^)@zSF-Okd$;WdyzL`u6b zDZ7qQc~A92kJ~Ew*zV_95F3%jAe-`@Zaw>c!nfRk-Jj_Rn-=mLoQq?u`9i@}V`+{) zZN2Kz=O*5+ng&;PCznejrbf%Gy_LiM{v9BbVh^&vSoZLG2Et&K%`9HIy- zYNof<0%Aov3=AOi(&##Z%5OewWg*y+M_W6aVr0YBHOkaT$MJC#h=DTE-VeF{3R_3e z8NIazl%pKrWJJKY34p{Y> zEp&C|2j#rj1{nGEz;S>3tE98=hcG1DUM(1F0^Q$He`rmtgc&bu>)<WdK(EaZ|*&$a;ax`u(rq1p?(V zJU2dGp-}@l9#Eq3uOpm{7>b*5{v6?imtuR->%D(z^2~F0li_0bn9r93(ch6GyQUAF zQk8O2kOZKmo$yJYf5Z(k(m@bqnTb9-kBz$b!4qoYFk_}hv1m=I2s=9T$TeoAdU1o6Cpz!w%YXzN98a@lt(y;^Lfk8jOKw|T{<7(qjuQ6jnsJ4jh?i!`VV$D|@(qk(&Q;AfIT4Xlx90PyKk0#0+qLe8TB8ib42=t^x z0rR~}_rLAa9HpG);7J&Z@mO{de&M(?(6~|Bdb}&BhF6`)0I2*8B%yQ_s?QD2xgFh2 zlne1ybgN5L^4O^9`nq|Ne7V&8waKf6D#7-WYP0%Z<(gFd9=Or2 zBm}(@AAMIwp8N|qxAly?9BJf6l3dc2O&Ypo$lehxXdz|QCMBrr;Y^Djv(o?V?8&;n z&w5Ay=L)j~-3O4;UJ4bGSI1qlAKH~T0mr6xNGRj)jIVi z1f+)?0cMcSD6^S475V|8MUjc$1cKP6M;2KE&Umgdhykpf_WMRaKd4EalfqMaf99PA;$!n2RclgEAZz&$w(@2%)Dv zb}^_b9DLO&oDaEUzCxPC$-Yz2Gl%S^^Y=I-hq*O_KWaLo?6LDLq(|r$`eib=#Anox z1*L=4=U-7lHzXRm=iNU#k7?0e@a2IAe-K|B4aGw7R&rM;ws?Q?jiY; z?flX5#*6z(F%W~RC$_9S z_fn@Pkh*ggp}Ba+nQB6Q<6jKKysmZsWdDBM@yDtLkk`jY`p&ug_PZ{D_!Y+~_vFoy z(olm^HRMrxYf_~g0{mj?-{hYV0yF>@sLyDj+nw>~?PfXcvg?%^u025cQ>0T+if|Xo z*UhJ^GmM@CUwLbt8Mv zz9o$J5^gS^Pkl@7LUU;VbHTby820yP2I}3y6x~S{i%GxJVI%!*WJx0#)e!Y&!f&Lz zr4-SO7(IuQ{DmkfG=q~AlW9H|S!h{)&|f(7{=DC#o!Qzb!&g^0=<4%&ydGp7HmK3@ z)lsjK$ANqnCZD3oxqS{%#j=Qs(dJE&tY9BuYwv%jagL|R`N+RMx*d~A4VrfKlP~nZ#jh{$ z8s;>LNr`B2k$F)wML*S{G{xJ~l`oJu)q>v*B|A1i{80aB(6ztVF|VpPRHxJ!_2#m9 zZTrUX<8!Js=Gers01mWmN6WZ5*4ml zn3LoTT?iM7GMw+Cpa};DJ{4-<$jWn?=+oQ^blIoZC5n*bk6uX=yNC_5`!;w#ggW@p znS0HKB6nw*RE|qU&JCIEbC0yDG<(+`*N7Y!|@{~1tTbMCdh>^vctDOP^|Iz z^p&F0*auNh40{zbAAQ}sQa<}b_Sv|_t*%tig5N#*Bs|8xH|8gW)~kOBjc`LP6zC{M zSe~*@zI^>}w!?UOWS@HA`-Y2OXMbRQb~vRL6HRp5nW`4D$jV; zD3#BT(VG0@Z2gkzKJiz!>8sm&Vi#4CLTc`rkHYQ0Ikcj=pT6>I_Tx?O-(ja`^={oo zetynk+HO>~9UZ^(={9Waf{XXu4hL?(H+6+0<5HBqmOk_SOCxaYOWISLdtDP{U~oVlxk3lVWjh^Qo*{}% zhxp)EJ5hA2!!*V&YW_N=q<^ZtUmnv#PyurT9= z?d_Qkkajz(?Ie~U03ua#s;rDsHBpt7bb}ce7V@cFTM?Y;PYBL%s`f$&v}Yk1=MMQY zEw>yTPHw(#U)D8b9fH@zg&Km-{qi1RI#pQMseoQfU9F-GjH<>d(;j92mHbokf^qii zd;On4IlN78u<4{SQOsgv7yaHb@Fr}#=bP4xR>+_D_SgqXIW61%WHVGPN^cO6Sb4*c zbDwj0Q%E@KtEr%6-V<|ILM^nyHl5CC)-ePWk{j4fORINgt}2r`liR$GQms=4xe|rdUdheCHt8kx9Uzq0BI-PX~(_sbqG2nMy9AfR%JrlL-%LswLwsWG_SZ z&T1ojO@yxtch~_e%fs4ivrjtTuT_ABrt6taN6iZ-~5z*WF3;1g>+B=q(FDZ!dHH= zkWYemo)VLh1`lbl;9A7ErnA?4hniyYr?mmYX{x%OEKbVR;IlTFMN(W#pe|>E8eNtv z$8xn34pWf~sX(p_yW*{#|9SFip#)zVwixVE&B72NAeE0?V}Ryg9mGhfdUDPei(Z%u zZ6EIy=@ga#?Vd=jou{@2yhpuOi$n7T6u}@|clb_~%;D@fI#PRfk!C=4(@M9{9oJjg z)fWuT_idcd=6&6u{o)+-rim1HH zQ*b#`?iSD0>~swN5_C5^T5h01A4|NaM)}P?z_w3 zaB<%~E|h+rQ4s2whW z%;k~D@4md}mUCC$vF?vw&Ld*1nEl`ZmgUwfP*528C&cK-G9DO-WTJFgkx6cGc?5E) zRIX7g30oY7QM^^(|MS{^LEK=9 z8EZ?)r|DQD-=KRUwMQK{x>4P=b)#X zYY^kkrjzI_Hg-Gm+*?KR2-!`Yv4UN>;(K=6BU|IzU~&|3>Ef?p{jDQ?FZlhzx$HOW zOV2(scUG^i8=4kx9y>A*+TmgL=CJe^s~>FH{Lo#m&HwS9;rE_=^I&Z7oIN`Zwf=QY z^wTUNpi?DvtCS>8kRq{;3|c6^pIhkeQ=xHs zQkO3DbngGc21sQDDHO40H8)eG+fxm*ERsWkxzd3n$ApLvlaqH_*;V2)eTN;xobpT@ z{vJllIz;{K9lI}^x2$>P)vneb;N0K8bKZip@Xy#c?-8zNhcSp};N6Jy)GJhS4eL1j zI>VW9J#(^>@tdj!9Nt9HtMgOywx6Ztb2U%U_mKYpKF|XOGETnl9P4ToHP$$>1j!T= zwiGQZqfI7U29SQ4Y4@)9FA$G8O)t17+c@mbuKIkx6*p6N)XrHvmSxCzjuIjA$E!UT z(~{FKk4`sS(FgpIk~a2lH^kJX2j71&68po}J*|#IJKz;xU{^m^dT6t^XTs9>KSa7_ z;h#R40uLY9aOOKN5rX7Rhr8@2x;zTC$g^y`Z1?;{i~2@aFVmG+R?acWG&PGUL*LMo z^Ok<{*-Ia>o9C{-iM?yR#pIB?uyb_g)hpJQE?(Sz{T+v1oixL$M6tWiU(#&13J80n zqrXPoxM~MtlAlg}ME#Nyg9w-fwq(Mvtu50Y4wQubQc+{G!0#{edeIjFMG#b!wATLR>kNylYCJwm=Lyp6HI!dgvA*^!sbG=qj@>S;wfyb!pivWmttZZg z2mW!vvd)T$MUa#u>fc=BRZ&wC2eqSeFwfmNQ z8S(TM9*1z1v1V0s+$l*_k|kz}Frv{%IY%TZsQdDUnm(mfT5_6#m?vLQ@Oh?b1s{+i zd1-Lg>7Mph$X}tD#q|~Pjf5N=$u3*+y2X7n`kpR*U;MJVsn!$tpD6S5dD-)<6N7#1JVhpcv! zm<%*af`rf$+AJ1~?I?R{;r4AZYM{T_t5lZHOO@2yhY{rN9+Up|oKb6ML+#uw0{$y? zC55Av-I&oqzduuiIo(RkNJuQSSHsmf-7}OeOIE>*^YRyp$A3!pnQ-L-l{2@L#W0(9 zM%=;eaZ?B7YO!8=4g2&-iYaD<^%AYdp;ag?&Z^#>Kb~8bfNx{RV2r{|Mzd4xR;#^@ zvoC#@9e#JWQ*-ABHzO$aYoW|6uV2{})Mn@Lcj{?Mgx1q=#sQd!c0pv9BxsZG9!NBoNmb|K(ugr(Hu&dMkQQXlmnlfdX)-J`yO8Ve6cCX8wCeV zsHZENYU|^+zI%_4-MEikGN+}rnwe!j(7$RDrZ%sY$jl01JyRmK_`S{wfvxt2UAw$1 zCyE=P>~Dx}$6;Ez_BQtKlQ*QjZ*(mxYiJxfxw<=*B1QHK*$3GdZeYJgbN}bmm*ft_ zV_aYa&7RBN0;5I&%tkBUQNrj25}8mab8`J{ic?YB&pT%eCGhjqE~LaT+xEt3bf(`G z1*%*h9HQAfT9-UJ(qlJ7YNB`kuzZ8WSEJmpx9Zx}XBKVTm08^(ln2RYZf0Mde2x9< z?IQ0SXoJ_>^@7XbR+<(2-e19f`qa8{bqt!AlTFE)bnG6G3&jop?pHN`^>H0<~8l$u61#aI%c8(Cw&CmpMafZWJ zI)txMFcHnS!Dxgpmel#aQEiA z74v+~W!r`>yGbRXE?&FB7Vstr`H|}<-)}aqA3UyrX7;ud%nxqTj$a5LXVg|3BR|0Y zo2~fhG3>1~VBiOr`LFDETc5%%{`#Z0!Ye&oFEv732asec5QEic>)Ae;AQ5$#^jHXY zVNAh(u9||@pXohWr!QaAlrA5EseGrEkBhNJw3i-qm#l!4A_MJ$W+iW`Z zZ$J|}C=%h#&Wt&mdv++TN+2XijhgcLC?>=iy|pm!l+OFHnfAQXfleGvs-W8`NtJLO zERRZZC?g*LqY+}qu2~_wjqxvnxX7%R>0E&&YB|0B{JHzK7?h26#f>{!S2eX{G{db8 zGUTkkMT))hWA*{|QL&B06AxX}zHR4XYMfK3JXwJh{B2~TuC_`+0e=m^uT(yT6pZv0+f9=rv=T;0>CGkM-wGcaN z?>)P1$Ji(D3hh0<^8{Qt`%79`_Ojbl$}|enZ+vzO^4@hz)6TRV`KY3Rz*S+X`}0%m zS#SK=D6Y-J$x#q*jvtv9sxvL{|LzU`6pw;n_~a zA6`As_LsIz4yT~YW4B5bq$k4uaO>npHKbg&9nM*SADEs^s6O|?Q`Acpg>%Y9&^_eU&da>cCf4-41zlC>v*lko|&f1P$ zw-lQydN!zkvy&L2gci4~retuFLE%j}ecjS?=OL!^?bKKJErbQF+yt17&^Xsk?Ji^F zu~N5DPOB-apAuX7eeU$MZG}$pS9w{{r|F_5Pu;et^Jcpn3M%?sl?0z|QRBTe3hM^n zMJa<8e{$?dc;3PiY`?oC-F3vGW2CR#@Jerq$?SYFv!wH(_3m!Jr{&X*Qi)8qGqF*r z+;mx+NDOajQAZXytX7Tcj)zA6{I{_a@Rzou;piNl7$Zt`rQ2G#J`e5G(?p8s1(l#3 zp)xP*=*VvPGwq`#XLfg$ z+`8+Ah0kL20-41qz4Ehb*NrO6YMd)tez|F5`{Y$uZGs|#lEr2FFNnYPa@Bxad3{9*BURdqUbfJU#08HJ!im8Sr)7=X+!;1jOWeAl)beiZO`lNWy1)gcx;K2 z9I{i**hoIKmq6$AZV0X=?_#r3Z9Kj;$sH9mG#Ys(`$E2I#&1w#s(HMB}bDvzvA zrFvhe+#8!?zDrqTv3oJUpbP5Tx^IQOTt(o!l4@OwWV z!@J1UC=i!|-i(d!elytc5`$8XV+8OJ;v$+>V>BoX4fz^t`qW@9K20keav$;hhEPQ6 zxh^I?MyRx!nVlcGDryXG?vD($zo@)!sOwM1A!&zlcgBw;owpH&^0Fg0M$EeTRgpLM z(MsPQr^s}{HZ-^Mmy@rbREJfQ|HIz%{wDb2a7s90o!`;5xvpgIrD%SCM%e6Zf(Ath zw{!F3a65>3inSm@3QdI2P7$S)R0>IAX4g%+X8NdsQ|2c;ZApNp9NF1<@@nJ?F9ey- z3S~D2XmkbrIl0wAoCS}(&Azhq;p>~=oVy;_HrC{WB!-LGEo_*mb?iMdu_@9545t9qg75UZF@p%v8eGKDh9WDiuxTCvN?n{Z;LVS;P<$|riVWmNvGg-9~DC5Sf- z3P0N$cNGP69^VS38jG)6R_(RvCcnS;1F6VSht|MPO&XtZi9$#2E<}*9Iiy%&tYQ_{ai}fq+_h08{@44H4$8)fu z$)=*rmF!y5S5fBGG87oXAGRc@v zZ6#Kue2NJ~suesdUyFizXttp$lfi6n9fz+9y_2(yXh{C2iPQZrpq;{rpn zpz{WQqM=DDpe@gAzOY`{Bvv_>s+1HhP=+?qG65x)iZ0WWGBJJL726j_+)h`uak(*O zT7N}auvS{)PEJ7XwQV;@d z8AG-TP;4apdYuUK5#^kz}e;Uelr%V55)8M&AYIW9u2VoV=x0LY_Ua8;# zze=fq?`Ul8LFCoD8p0ae@b&(Zpj)ZanwxYY(p>74_spu%S=Nx7HIa&HJMUaT%0MfdsPY{Z8vBX zGLu>0b~@dDl7xUn7K}@r-0@H7_sAJ?kezS(rw5Ll;=f2xTsZq;ZuYu3H+h9R+q|k( z;0YA6DOv_;?og0ypNEHs>JJTNEGaW7=%PKA-@r|whNZKfNY`Kd{r+)pPn3P;-5Vi9 zBMcScB6yXkEX=;fewnzVt*G8-o)vP}t*>sCxB@=yWy>8qRYTmIHB*m(x5y5lLhMY> z?|D^n0l7BqQ})%-TqPifg_POqv&(CO(+Qt~ zOT<;$^o?3dPKxZ&bI+MAT-P?PX!LtB!P4qh1t#1>N@Tl`->!`s+7nT^`pWf#;T5Be z2M<2Dq`T1#17*?YqsO{-?3S^&)<97O^#5V`{QDy8l z_Jzcuvod==zVEePb2*WzDN;cIgb_L4$YaDJE8}ySHJF~;Y;KfMrKJ#o3-c*OxS#hM znEwk>oZj=Frw{x-I6hoPawnmnht-e|oeU|W`fHf->bm5}-8#iDH;#$Dm6aAkxIot{ zB;^8CsUjK?n=9t~2}(*bh=dX$j>3mgf8vSx@WDydyvYURq{E>-~&PSo?*1ulU-*ep1)i8A5U7t2qFyTj}ZT4sF z@4`~{$xvUw+}e-L^n_&AQR#%9Gc2XR6Ni;6lQ{Vczeil(+@qdL8ib zwHdDBz))s|fU=V^FNw^XFjAc3oX%5+rb}F>xO>IviVxYXvkd1nX$;4*JC$?{zpa+1 zJK1fvxKwJ`_pkcdM42t3tg3cuW%r*C<@-ZI>aRC!^36tol-X6fW!NdAF{Z`>_ZY4A}Rt;AZ#Z)HUSIM3{?Rpg-f_(Tue+ zMnp=jdM_cVCbY%0z)35C5*9Xrg#KHZRB{>^LprnmFAraG#nBl)#}`I(us*-rWx68D zDVbcegniMXxYM(GBYXRX(DL~(a4-DqGUwRr4Vo^Cja`5A7WSzVb31$Yb-yBB)Zmad zcGua58XCGP8~w%OH^@buQr|a=7T^#H=Jf4i#Wzu87B@;nzHAF#G`~;ZGhOiZB$B#_BWBl^V|G}%!=eOFKIJ~Rbtkg?Y)gE)H7H|1_HvSnM9c}SdpYQ*Cv(Bx=W*L{p z*1ngH)x^Et<7#*eUf~-yUalJ}J_=1c->O_`gAtU+v}PnTmu_MI?e6 zQX#jJ#ROUGB#XUJEJ7la=fOidpPtU1zcV8TIVdlbLpiVd=@JZAeXuL@>9?##lJ3hLBKk$G?R;`g+2YE8f&sq&_g6}$uh zVL%bs1yUI$Uw3pe3a88pse;@LJT)nEnvx=h=NPFEk4+~Sb<-yy@l7t8p}Q&;CB?f} z%^kmw?Cl&p(=xVUFhvd~D`-9A^yAMW^m_B!UzfJ*9KQ+r1r9-*uqYtU5%+*=?cr+1NhaHHK@#sgmI?c7TRqKlM51_YLe@7+PYI>6 zgv>_T{b5a6eKJJMuB=+_GFFubT2`y9wL4RqBF*_Ll(r2^wa_uLE_~ps#8LxZoA7-B z;heqE1TIjePkxrVaGv1g!DdPwJ$701x|n$O=Aq8fr$@^Tud}aRU%#y>gQRmlcRV4| zX_~Jn^1IV~E`=mw(_l%`5ad*AE2y*lbUTpkG+WY6?cL1DCNaGqbNa}n>^T=RXC!6Y zeZElig=IaXnghdi9Rm`Z&aMgRsvGewni~vWJQ8bvN4aqB;aSZDt@jB{hW=aTyQ~WX zmuxy)Al5`IvZ6-W@@D^@#YHNyvv19Ip)k=aTW(+sZoGu7zE_Z(cX_)3GNh`j9nW>s0n?onU!O8+l@duldmi%N}di>Cye&iH`j7ud@P-OjvEoU@5Ty)mOOv?uDIMVVbNXvdO3vt(?qD(RHIaN-xMnVG_WkhbFUx&)R#N1Um_9F% zukmpEZn5cYh;(-20`ZCNSCfbDO=%M?mkq{hdh13$tPScexvpjY=SLLX#y!L4Rr?^k zc!3)Rdz>W~NsjM=!s~Wxr8Z@i-J)VdD|c=7K61`7ebC57-pMcVeUu!ufHB0B_+FpJ zy5{mk#OcsTg_UW(yjD$8MI?hE3`b2DKYqGX<)`&g>U7)TbFix>-}=Dm&z)`b;ggLP zNNFj8=J$H#Pa;8voK<;tV*=kWfNy-~LiXHM-g6g=huVbt!K-JB*}G-V;hO#LDa7+& zHT##U!37F+lc_H^S;|L_wvu~mDr3vnZ~a#vQ;jB*zFnY zjCbxLMkN#;K0DMj+`$M5k*r0e9NS3GGW#pHg?BAm6)8I`Yb)Z;=$iZrmQfgD6GB{oS_v+{XL?Wifax#U2wX|c1~8aZRN zN3S2%7n@Y-tH|-g&V>T|{cYbL6R>ONc3wrc*8ErlZ;W7^yjB z=j~g!>u_9zGh}Z}=cB8X#tq)yt)rpLReFI;Z7{4dsN8X7D7d-by}6^Y9Ab>TPA_{# zM)vnBE}WYR5j3vMNM-UqniPZ^x1G)PePdqyS^Q1l1+B=_b34I-M=6(z)WAmL0@`4} z^E=sQj`}JLf$G!k`<6kzJIp1B?3WZY;nAy ztGuk8uB!GYwMm1l3HxmJrkXPv;SwB=x=ZF*JgIG>j$%cC>uH+$Z1PL+3gHA&VCQ=R zxVp8(DpM0?f|O`UGoS@J0i5Rkq0$i;WSuVAQpyVxBKIudwo&*xYLM{af zggsVfig@e+YLoFm5s?ge9VV#+1VV!PhT7VODnb#aFg+&vKf2Xsu=ETs{y8q;)4J1L zJlVqwvwFyzaQ4JqIlr%&!gGLoW={|wnF-6uA6mB=!U_v6V`fJd@A}0BZ|&CV0+u3y z)#x;5I#ikpyC+fKy0dfWuB&K?iZu=`9e3cK;)E>F?1W4IsELLZdZF)x|IyWt>|dL_ zf3z}URjVS^Jpsk6L8DA8FL8JhhWpra+&d}wmT+WfSRgBJ=%ifRAD@rp_s^*>h(9Aw zKM0l~`IYh~hv^G_jTMR-lJ~XQ#fw>8FA7PqDQ95d&jq;Y^vV#4X*|hji4x~D@ zGfaKD<8gD{v0hg$MV=KQG7-*S@J{5XWQ5U8=Z~gKPaJpSbx^Q-=Ae#R9cw8P2_>#G7KiClmp$BOu%$af8F`076{am_6;m1X z<0twu5<{_}vYCmv1oZHM2Pbcy+w75%Y1%cP*$9&+tIe@MFS2&3w2p(BWN}U1v2!aT z3N2Zh5>lkn^y;nM+lyt@-d3%lmTD2Y6(yJK9@1-7!UZ-FMF{QjH{*jHVOp<}Lu;)} z9Pi-rQv~>guo0i2bvOqsLcY7NFEdxx-dyi>S~KZHnVC_^1f&L#m2O%@(z9llir`Fn zD|C9-T~OlcE7V3`9%XRK$f6~fkFQLD%nR*3--hd*ITn}C0_b=><<*6o7GEJCT37sg zN5Be+x;{nMMqRMVV_qEEQPkE}GuRY5v(YLPnl&nD+Z`@3N>sHgN33pJqHEBzY`b-C zZD3BBT5B>0u#b9;D!8Wgt-&DMl1v7!UY%L9a(sbKO|KlD+uhYx zn~2+VTD5FoP&hg=G8!R@{XU$mr019@S5ti>RVAX@6mzJK<#-Ul;es`g=J%XrMXyW$ z?`MMN6fq1|7b;@)%mHE3>_)>a5Ka@38A8f^SkUre@~YqtRfxy3v4M*W+=h)B$i$tr zH+TB&bRR#T@Xu2MErm}ydM@oQCcNrabrX&W=j-O_XmKR9%Mc0)1c4it1}KQB1yQd` zDua!-oi>fc@0Uo8Ro&gL#H5XguGvsl-gC*{q-9GxuN|4)UbQOOVb%vA`DpK%ADppF zB}fzr9dx-bsG_7IJ)@Dh1SDlj4^qPAOTO3}qsK z6j{vVsEF+ABTGHRXa`X)<4#f4&!W<4Tn}LBX-`JrcktwE^?73{1>=Q-AD`~BnmKAC zS8mQese-XwZHqrOBDZ2^$YI`^rc1XokZT5jX*KW*?{cw1(2gi;eJd$yE-SrKxTL%F z&b=_<^G62O*;M1tZ4N5Jff|KVuO&8xm+Tm@$&`A(Uz-$)Bb{?gc8zI;v(@b|ZKzA& zM2%;O8;d8~+It3IO~s_P!fseh)1oG)J~2_VyRFmYpVikD(OAoBgGsew%c@{T88TZv zL8VZDw?~E=ofDm_EViy{StThhZL@aO&QT$M*+M0;z0@cC|7U_bQ;e%{Vj>db>J?Uo z%C~NY(xFp#Mj20cUQmA9MovuRPwufZgf_8OV{a9hJyq--QiqsPqZ@~#nz}>6B&742{$F+P0oYb`_Klyr_m!@;WZ9BsS@Pa{%8u>Wj$})5_ zP8_mGAS5J&BqWfMKmvq4QlQY3RYuumx0Fp<;4Q0s(3a8Cm*!=Iul~=u8kQ5&x9#`+ z|Nr+p$+e~9tE=_2kQ|V5qWc(zQdgUzn^kmbj`y z4a@s#1Gyk~iuf<8nAK1@#`=%=VxzyN44H2$DGs_&9c@nIa;vypI+se_`#2f;=N}F8 zY^P${U{kBCh!4gqVpG>RpN)K!*jjmfk=4iyri#mpOIWdfAhUc^_{fwzVe+=6zqYqm z`?mV>(g<3(DN;7Mc8=Goc^-85*9M-7RCGBkSxp_}+M=9na<1yXc6MJNV_!+wAFl4s zv{6EynwwT-&uLoSd1?Qlsb{SI1IaPzm$hZ3Q|Xyr2A^s|lH?b3HquZwnjCQ&(Y?qP z%uIKwGK)wr0V9Sn;DD5IZ!(zw)X-kSmK8_NGO}-2rvu}%#3y@Byz)i=)wOA2 z=zi7NT)dhtJzd}Jb}XH4&P?hGA-78~c`L^V3u4On7%fmumc@Z^uT>M!YUJstEMd*+S#EhUxty@dK1 z;l1I5BR_t;clgUm7WqK;v-e#*vTxg&{vrLNBAK}7!G|CCl0f>6;o{7Y{&HUjQPi65 zcH|QUM^AI|8|;HuuM&4`9LaL?SN4uj_Al<;cg6jI0Vptdn*Ho-AUAhy5z6?Z2yAJw651JMHKHP&{NmxlZz)74g+ zmje?%Qx4~Jdbj|Bo{+7sXD2tZlbhJdli5fF6_G^Sc=+H1oJB)&6*6Vs7ALc9g6u}Z zScV92R099c7<#4zekHb*@au|L=&VDdGs}#SSe$WeB=|8Hh~{vA|9$;aZoejz@k@El zvP!mW4(t!;f4x?z?cd!r_+07KPM2V@PqXt>0dYEUyiot>;9>n|Pp#H#^>?im?CNyN z#7Io0{t`n{86|;z0jEfdWUb;Tt5qnDePL34ndBf&*P{i6<=_93;^?5;m76Q&7_qP) z5${q@Go#RR;5dhhiby342J*cEGSi_#mVyDMjSX-CDs`=+cpMIOa=oJ>l}#1#fWhog zEaSr%YL7*M;0|Lf$OA8!C5HOc(>+V{*B`&R%wFiqnS0wnxx33|DQ|RkOv=diT~gna z-@LOnyF55;Tl1QXEg7x14wD2Wu-WE@bxVJ_U`I~Hj3RE5r?0AV#fGAQYvrUlLnA$# z?=9qgnZ`~k@keSajF4N6sA(heCC^b`;Nndx-QuUKtz0S1iXzJf*;0}%rIG{F;^ZL# z69vc?Oc47*U|4j#LRE&*rsId#;JoWokfw1OPzuWQSoAbC_gVc|R+gg9zhW|BJCB^! zy20-|ZAzQJ-}$2@)uCYRr0y*@1yy!>`Rzx;waaGC5A(%s5>?S-Yas7>j$+Q_(vHzI zTU1jIy<%pUmoLqVSc@|4nH7^Ia$s4&Zz?PuOtY0W&vW@*S&r7>2Z6(X|m2~RNYyc2PvnZ(#8RdUIK+)(}LG$^*{9ytKRs_uMUq@@gqY zNT1oe+SW5O3)}d&(ZA5?ERSjo8?QEOysV{ma&vuIC_6(!wX}t$t1D?$rK<(HB8|4E z({>wTovOkW6;Vzc&zzkS&)i^6#w;by8=GJ`K6?Ti&rY~8YgJ`DSg9f{k+0ND#CnlN zB4t@7j+;Rw&}@=RT(n)Dl3OS%&~HmxSEq|2O|{v67scHkE} z1x?VqD25a+*?4|X_|0iHzj(%t7ak`rIlheyeWR~s^kMxkGI!d2B`Z&ux%5E6q}{oK z?eO;5wGF~0_bs_ff9I-^=gFDD%D~Y`#Zb1bse5gjYg@e^K+-2FClN4>S=ObgC(ArGR5nD3xl$NRmS7O}v{-bAxBKYn8+ z6<$+IZJm}lZHFV{&B5|`D8DAVxH!{NWuthSd{Us90Fn2|EBA|>-8O%T{>`~q>%JoX zKp$pZFivXsF(c*nSra{?1`>;#^PgDqo*5K5qx#ubGdTe&lj zWp>l&SXV7MaQ$Oytt!2+V)~A{wLg9B_8k`ucs4BB^WD)Q6Z7-zw%ZOInb}2uFuDHf zA743r9&^psyFR|Gt!-uJ^f%6EthjaYIe9+)#3Z$|=is)5*(sx6Tk7bS_NBY+W?4Ya z0HG0McsUb{e%%v|e%aW0M#i`iiypHY4}dF;_@{6zB$oW5U})}QyC#q~i3@W=BeRC} z4H<9sQya_ZRV8_Lr+Pp6&dl;M(05){&-LVPtH=x$4K9?A?Jp0UUS2$Xp)E~`AS(Jr zG|GO+2B3fHM03!!kq%<++{nDLsU<}@K5?L{u_BbFWo8MABq>EDJV5}>L>ZIC(gaAG z@X^*Rx+t42m`(RNIn(6nR6WL!=u0|?)QINd*vL5na&Yp>)%d|@ADWxWnYjjM7%edq z8aqEA70MomK2zbU_+eSbChUYKeGn%rG5d;sU6#dBN()EkwAMHFDT0ktitB0CRNHxX zjzs%{fuKmA@i*_NI^h{1-@lP+1;k$_>5C<)V%9U&F4gSs%wO_OMlfjig(}ZW=S(3+ zA@&>y2iJeSB-fQA*4EO}ga?d#f5Sw!L`A=ke$2klvT=!xL<$Xwp{X8(#T6e~fIO0; zi|N#45K92VQ;i8GkzIPq`t3j9fA+sI-1sN?|Ng%?C>fO}mcyS?^c=FCMwJ6GjD(Ka6n9p~2N2X}41$lvvP%ERgFMMZ`DKq?zTxcjMpusHvt&z|c?Gk2I&y?VqX}P5% z_1$LAl3CRfqb;+9dboaUl{!MqalQ|wp)icWa88Gju~w4p(}c2|Y_A>Fxp11c{p8+w z+)jyoqD-~;9$^v@nPZ_Bj$tAbVKN>wR#i=n#r7ow&za+n7KLrj?G8`ZPw4Niywz$> zD`YyYl~2D+yiJ6!T&|yAH+@R!`P(Cl^16=fonR1ORz|j+{fEs{YUgFvE-2_OWHivl zdx+z_#0Zy?VgejP_WNMjLNh;~KFiA9Sd!$Wi1 zo6|kgP~YUbl5B@L-N%Qsv%~N!HyqBLHQRtY8DQxmDl271(2I|=SNk)w#CM{LIy9=&K$udhn; zW@x$7a;;3!PLZhN758;sWpio1y{>-sqJu=nf@4J1kt@om*_S?7bIEck9CCzehtdx$ z4Mwzv6{R~C&m&nn-CwhC{~tNQ?X-W@=&$y?Nz7ey*Y$Nn4-BGc zf;CYZ~iJXRUL_;|Uj!onJgbxK_$gL!AK9G&`UW^ba8mGqka=77DagXa z1UAY2{H|A3dyp{QDe!!OBB7<`L}8 z=gQfc_7(SU|BtVRDB|q9?mPMhap!-$)BWv>6Bz5^7!Yyi`uBFXO$O_2h@gy8o{n!K?WM2D0 za8=?rr~0-zh$0U0JAvXNpcyz6^`pg5Peh+5M)`81{siWb{!H{6sNWv_J#jz#ccb3m zP_z<$l2JYS8S@2eLRp~oIFl8lW(Nu?i@Z*g+{B0tj2L19EfJ0`-s}^`#!h5n@D=D~O{> zP8tsUZh8zx!xp!OHZd#Nu-<-TL5qV&(TUCs5ir{^Yt}be?hl zT^N6I&MQy<`A6k*&%0pz{>d@?$)PDR{7KF|ft?%3oBUGXWkt-+sXEk=tnW+KKSkbv z?1_5rlVttV~PY|wZ+vw-`gGS z?ISxQTL&$cbc<=;7mb$(N0zosYoi_1?7?Z*49uSHSkm9*>guZw7c~&@^|{z_dVQG>7CZJjQ5xvLWZ@)zjz?W zzR4b3GWW>YzbE=;FD?(M_8PCHWX2`})w&nNID{|<;CS9VIz80TOe z%!W3TxyXxHREJ0L$@&m}Z;bk18ms4&Wc>(fL%4@EFxt59puQ>Qn+RX@9q2JX0W%7M z1qDzI*iWu;_ARRP+KNi}bgws^r_E*Mj3t{v5^XNX=X?%IRmQRsFiKEEV)HpQ&m5(A zmI;o;O&)dcup6n*Bt>dfF_AdqOTY21)7VhpaCixLnIIKBbLP)qFXXMs7Pew^R<+VZ-)`Mi>9RdrA6@y-HGa{dCykU-y=`csz7TUH5lv-e89LcGOnk`b2gw9l zmy!3KS?0_j;AT8~kEeCu@Zbk>|4_KU@2C0GUcT{3Yi0&L^Y-QET2|_>^evIqfZsJ~ zDj)C`IjcS)TJ|07Tk%|PWcuZ2-<+lu9=qNE5f8oh{IM+UP`^{@&d)Mi-Ce6*t*99^Ry4n&ZeTA$xuAQ! zXby}S`uZZ%(4=aQrM?v&D`mBKW#7Z6XV1(Db^dkQXmkRrfA{8ADQ%!~lV(2s(r(9XQ*7mq$^P^-i`JiA zao^&%|5U%D%kR6Uta7#sqg1(=rKgS}Vpv`5wV)&&F-t{H>*plvmnG|;LS8*TUVl4l zPu4#jeOa$f+|SHR){mg`^wr7wZmD$)Lfhq8Vrr%or<(;o->Qj=|ox z+;popv$w-n&nR}LbS|xQ(xo$5R$zy^*}|b_mUOaNSp=DKOoK57OdiC1GIUN-xC$Ch z74C2foL*{h1di|qA(o`T)j5ns%yA*ETp%`+#7o*`$@80x2|r;DC)d2H=;yw;zptfa zj(?Z`mD%2g?H_qO)$0qFE~II%c)=BAg^l6tw)EP{j=>#7+RTPCuL-7EO9qO&FJ4_W zTYq==VB3&?ws6~73&_M=G4qfbCb;(8GXD|QxVBA zWfZrsSGeho1trbe!g6Q5JvW1^ttGqW7frgi$Wa~{eUB(yq%`&PclBBEYED$&XJBrH zP-lELzYKm-(NXZ+#?dVwKjD0iDLs z%uYpK5KvpH6xtG~jIqtQ1gz6|K&O+zoF=j>`sgisbi%SrZibULiqH_&=agc3~@coHu1b0Bb>(O-LlWlG8)flR)(f& zEu69_nSdrSpM?H%>a4r^Bs`qh*6;+({JXO&D;GoK%|=e;%`DR~Ao?i~}z;N^JB z!$*`ksqr8pj&eVJ0;bce?_X8p3)yL^On?8OH6L8_Y(e{9pC|YnxBlnS{3`}B#FC-v z^qK1#93HR5UpT$z_b&}Sv!t77V%Ei`(pLSe17{w3AdvY?L->lP{e1sX|7+(2WY2ooIoOeSa9mXi){NCH*Futxk7j)uMSbgTZ- zeedqRXz{1S@GFGx{2Gd|0h2ICCzw$ixGO9kFwKmwoU!`V$@=q?^-mEG>b>!L zH}g%h{%N9KPfy&>tWVaD5RdD7f#?58uyi4PH&T%w{OX)Yz=&wDxYI0QmMKz5PIPcS zC+ExOvTU4B%p%fGK8iJdHgAdm(k2RVNTgcCLj4#F^~m8}wM+w96z{r?yMbJ1&Tv*% zmw7V^>xe5TA~bmIe_g8|Yc41DeScj4dhCzX_a@U|Rhp^3u<&cSSgN&1np9U`S~7Y( zS&vt9$mn0F?`aNcs2L5QKG3bf!N{zp-ZnEov!ki1Jm}Am$zsBra#qI46XGOJ#9%6Q zgX04@VhaR`thM+^)=;$g)VGO90v6dFiTr_Z%yyFraq$3|>#2pFVw2tDvU|H`G%IA^ zz@EV??rpRwK~piitV61QuxjPhZEj1s&!RMFwchR;Z|Rl+{e)r<6@^W0wGL+>XMUl{ zPp%cj#!dbjxg;;Wy1rF^?W|Hi!^&YtV?nQG9td`vmS483$Ke-NPpR^mE!6h3vY@3n zyQE}Zo$r8K$gFI3&Fd*~7H3*QMQJ$OibROs12Y3W%3T}@$40qc8w-QnFak@}0!(p` zDHd6I>LencP%t=9;_S|bBraDRdt!WFtW7xF9h=i804T~;QcYpYK0=tDPM2HK9ahPAe)IBoZ7RDiFIe8eOq;;Q z4g3z)2evskKHfEY<9K~*vi>QwL+2CqOcu2{u0HH?yC&1JI7XtU@f#t@5>`>(~LCmo-7>Oxue zn6@V);VQy$VK~P!u@ZZ&M&2PzX0rpErr!EkJ7x72`AlZPDu|wHm&s`_Y`!FP+N2*p zKwec?ykMUwUP^GUY-%gaFZG`NHBHaG`@mhq>341UQB$A0;?isCl#G^Z_hk57^39$0 z*+mZ&brretll)+IB>6Fd?E0lRvt;y9c?s)MzW&Pd&+hFk z@$%#)8`mtJSrPO*%rqLD&97RqV%0KcZarPl%;j9P3vEI}V*#IIp+OU7u%+a7js=1K zER};li=EhtNA^Svfx=;BvtpiMeEOiFy?8_l_t{d=G!s_PocMfVV>^3X>QdY&EXK|g z4qi_g5hS2O@Kjn##4h5Ph9~>PVYq_8xxt`2Jh$ZHtsj%WrP! zeD#tC=SnqKGv1nvzFEc35W{=#WMtvR3p<93{cFyCvBpGDZY{fg>PG9p5}UmxCsY5@ z^Vpr~=G9Zu+1Zx{9^HE#X=c6>7L>Mx>YFlI-d;Y%+Yy-=6w|cqrn+!>tIg{!B^$dI zZQE6#T3puFwmNrvTW2$;*xL1nS9Z-JI(OC0+3-_&AMx{PJ<~SW2UlqUuiy@OGn!|8 zW-d@TOV6K)c4EVYd)$HPYMS!Io@EEN56!5Z67FJ6XAhKm7hi0dP6-Qorabtf?fmUW zYs-s^WRaX}?_T9Pf06#$jY0ddSIw42rYmpu{4h6lqp$b8(DA)%-?&7N>Oc2+WYa$I zcgsE`a;hKv`9+T1^;caYiI?c_Esx;SIdxUMi&a7Xd(k!MZuE=DOyZteLN^lOP<2YmK1Gg!2NTJWEKa+{ z=%5(FhDZUBi|2)cRfu;j==({a_6(60B(=1|T52M_=0H}lpB9+#vT~ot-`myy-88rU zU&5R`ZRBnJi2e*$>Ygz*!_{G%oU8e@)ziF@vzeF+_CxG=A@{o9?s(iVE^tmTdN z>Y)-Tt$uLjJDbU#pYK_}(qjqcE_uI};^p&+?nnO?Bt~9s4Fuiwj^K2g&muBZq*G_q z;` zpLRzeb2Yo<@~ox7l6emhd4%?yTlukmTz}?&T}N!Js_{35u52vGb7_&Hs$-LjzhCJq zs+@bKbn#E>I?s-TSY8uQV(rw}k8O&N9+$ynj);Ca`WG0to`Cr{&LzY1@umikqqV8T zYcrz&T}85WG+QU7Q57b#7*cY<_rsdrhFUY28g>QTz>&ZDUz;?&|hoy3KCY$VICy`~00# z7VR^W4Dt7XK#`<%^Yb6fx%8)ejUzy~zq{&A$?jt^0-2WTVBaux-+eI z%7D~dAD$ErP-=6hGsG9n=1!CL50h-Uvmw80fkw#gZ40-T7qo;(eu}G{=TwV?Ggdwu z{hswxuc1!V9dQ|$JY-dgTShHSVX~dIunn0+cq|)kbZn72K~s35lefz3tUaCs9N*-M zr3;UT+=_WMOB_-vaZF936UKD2X0yNlsV)!gvsW}#rL{KC>d5m7X~CWa#m<)U20>;y zi)gbqQ8oLj=UwDeG{x7kr&HNJW2wj7>2y1@`bWj-jvmJ(^M>ARdw=fo9!YAeu~tpC zY(3id$9t9tBu52Hikcs?ZX?C5zZsgj`zMuKd-C=;|MR-$&f(HumHuqKB07!yaB?M+ zPPM|kyDQ?3oz$R`EQ>6xC~{`R@@76UEG#Zgb}3_v6Y38g*1%>N`AhMjf13WNGC!1; zy;#3f?|Zi0H2Jv~i3iEQQ`tFQHyzYelPgk^!x<+neL()2&!EmjF5|2Qw>#oNoSC6X zWM>75wF#`##>!4Pu~#;(RjFYMX5>z7nLDPGPJ9*thflV^J_YZD6%xU6KcC?vh~VjZ z#^@8HFZ?>_%gO(MP{=|;`H)Db);aQIN-A(>2V_z<`F;6nx^W`T3F=++2=gW~896X! zb3_C8DA0*hB*x{yaLAn68gn8G0msN2sb8Qdk2KfYU1n>ETr6uQKkYYp+>U$Sn8#Nx zeH%xjQC|~4Jj~T`<^#r>A>Fb@lUy2=jLsjQ`7qH*D1-sjnMg=W0-%i{e-SLzRjr98 zlT8SQhzwJnk7pWLc}|r;|4Gvt)}=8lFDTxkQqELf>}V~i5R@vi;6fK};V85a;TGbv zP{vxA#*Jm3{=eBk{U0|F?`l!+5>K;cBlEo}Vlgt`k(+j!Ib;*4j5Od%$Fl z%$Ju0?4+AErO|2z8!W=hwtBlx^@trqfvX*h$@K zCmKp+&Cn^Vf!{{#u`Ri!Wlx5T1;*y8#vWMgybvShF2=y-WP)7^|EkCMm(Ge-%d(Op zN)h^I+9+BOx#kR$Vy7w9UX~eJDOT7D9nRg0CA)Oy$DAy)_l5?V$MN>@G2V8a{i1%H zR#_{T!37zCAVj;>nK{LsSHKbWk)}ZtEmfsw(PZhsLBe#f+Y!o=Nr9wIr}7>tFhx4S zu;2)B590Ae((w6E>{yRGuBY{+a?q1ZWM@;igX6O)nmKXHHvPgYPCGcG<=j~X!S(e^ zJNFOn{QWP9%c;(L?>e_NEzLf);=DE6-ds`<^!RP%ry1*{pE4`a4Tg6tHpT-+hFgHi zi-Ch=s6`>1e4m$G&4VdrT0aantjAoz}=wftEq?$N%D029s{oB?oUDQKgbpGz`o7OHLs>sQ(s0`cB zba!wKMcm@W?Cb;F$}_lggOmq}#MmKz&0`B><8qHC*yhbZhf+CmXe>K!Y;`7aC=g?u zs15Zf21h{I#*Zqq6Ve?UZN_@VGP^AfWfMqbmSae6!q1Fl*oNXK>BYZxY>JG*AT>VQ z)!r$Ydm9UK=(il5k);poBbPp=&(g2Icr{@shh8Ka?!ECy{?Uv7^vlw$?v|PcffD`^?U#IXj$KdT_qVqt1o_K6}2;8<~vJl?re{mo^h~g%Hcb% z-Sv61Gelhf)7S4jlc;KO9NewH|KT%tEge36=<&Q8PfWdHQ$V7dw!AB_7LAXT*SIB_ z>~iTN8`|sAG)Fkc-$^iqx$e=wO%ZNey|wweO&fyNEL&$Nch#=bw!OLW9IM5%86!$V z5B3M@HTpf!{@REscJ4=pLuS3|*xY9vV1{F&VL?h{y)!P4SQK0=AfI|_{e@F+y>jyG zwe|bYt<`cwp1aPQ>ctp0)pvx=5+3)YVuUNJDswz;p} zRqn<9`fcIpn_p`8w<;QX&fb^WSUrNp}5Ui{GE)i>$S+`m@dY!aEhZxeL?o#dMfM&7Nr7iVTI zsjcZ+I%CeUB~zypv(7nEbvkb2hon>ZjCG+oXi+3Pmf1I@GC$L0RT?Wxv(nQfo5rPt?xW8VrNkkkzptZsQoprmV7P2f@7(mp9A~kMtm0+Kl+zWuEOcF&W0vQll{wCf z^z%Yj>hDvu!{ZZMXTMf+aDy{z)m2Zt9_Fcc9^G@)?etd7w1)iQ6&?GJ`9t$o6iy5K znwMOle{>OOYZ^I-UM6)Up{j^V$Z|vxX-4Fe=hGNt?Sux z#01;;C{}h%d=W)(9fxtuH3%_3Mu_W0i2np30X`>ujgWW+Lh=@bl&cU@>)?6_Arlyr z=_Z8CaA{Cy=|sqSK0-FQ-;slmvkk7d5pr7)@_68a=ccVi$ZLb^1VZUY5X!g?A%7lR zUm_G(iBMKQLP2;|_G*MeixCRLvvUJ*J%CW&MuhUA4F&M*Lb$gG-WShBsH7XAQfPPC zw+K}P;rc5=mC*L8=Mbv?BSJNB)xLmG9bEMnBh&z&Z+IV}#x-z3TbuSG)C@d`Jc3Zm z4G6XFL}=252(|qLq4uW{>bMu7$wLTrLc6+vPhD_d_j?FU`4vJvmm)M3+R=L$p+0!t zwD|~4hj#bFHN%0>%qoNi;B$k(tHD1bG#h@;z73(dez@L6Xdbj@{woL#Ek|hKlL!s( zLTEAYYYFgXX$?Zl4kEPtR)kgnKUQWSvtf3 z{w0JqK)W{re>MTnH-o&+1YVz2g3wmr(^hEL)~#?sd$%5g3!Zm2)SV4=J7~C|eLE`P z>Ott75L``g4Z;O-+X=kc3350W_`3`4-39mVf_rzty}N-wdvt{MM&N?>>|GBR=)zw3 z%s$YS^Wii5%iw}G?1%5$58t;R+OQwma3QqqLeQN9XTt^jJOKPT0DM0PJUDmO?^_N=J~JtBC%cXha0_a`acs&gjc* zbM#v_FZu?fMjxVn5q*@|82yHR5vfEcx_~%_1bPl4*<0cMhoi62CN!OMA&y-c{fxCo z|Hd9hEL#J=FF-uwL^M~1X!dAyGcg~0sJovuDh~VIU)*Ag!adGq;&IumI8vT-Mi+)GBqTkX7kwV@NblZ@`Ek+a-0XnLp zU(rX9oq9hSr9O}Toqi_z2YNyDb!J8M&vbkATQVH|j(i!3G)S7b0NFSO+EN<*4m_8K zx-a?-^FZ`_dNN{Y@WAx8=u-MhB-1mZFLG`~P=AkJNRiP`=$E2T()dh=$D*V3f#?Z( z2+>4u^sn?i(NShW^gro~5lvqb{Tu!}<%@pLcA-x0HN;TQKpTGq&%HMKEk6S>VxMkiRu$x$D-e{ zYY@xd6^-(DAwF>tTccBmYol|Bi=qVacyv3v2kw0`s`IZQ5iV=$#ZE$>v7biQaqEHi zi{V-yyXevAm()YiPnh253F`Ie_i%l6^2OW(Jbx=1Wzv8TY0*C6g{Ui{uTn2YKV|nL zg@Nxd%>dd!kC`WO<4ebkq;?w3%oC4We0SHjEJ-^ zMF-K3z$N|^-Gug|-RKf@0{s^{fX+wnqQ9f-&@uD{`W$_UevEEMzd^r7cc8^+3CsbP zqUX^v^elP~y^LN!FQS*w$7nhFEqVpLitdD2;%Dd(dL8`^y@pnzzo1Xi1!y%|g+|b6 zXboBmv*dMX16q$ZqSMi4v zi5F#w7v=Pl(u&fUro=P^)FXB_H^|;NUXR62`+eiI?!U(WGFFJhrxJSjgN2BH$N#O` zhxO@w;VKWCFs>^(5y9}TWdkDU?2q721B(KR} z!$-j?ZUnoz8MN{ibSv1a(n*w$}|5Tf8YO<@+<3!{o2Xx2Z?`X1~qv@n`r0{*b@KUzZsOxT8_{lppRs3U}W{ zEE;#W)$j6q{eI)_+T`8;Y$2dEAHhEz>BKd}b>sfsK-@&!O5A4ryMwp`p8J1y&+@?! z_6zG%`h;hoPk8-*T%Uk_>J#7>p925)3~(D;XUsC6kB_kuR{2|FWR{xGH!URoJW zA%Ub+Iwd?la*x?7o$=VRVbJapdA-c!csN(HAW|HvmnIu z8XGW3m9<;ISV21Y!`P5PByLX7PNq{$OVDZNR1sW-B2mD8g@o^x1mF`%f$TWhc(|a* zB-U105mi|d70ChwgHACDiv<-}x4g_@IzbTlR5*%}R1lDfR(XR?fmIZ9 z%o-(GGC{#@l4ShKB*}(UIU(+)46DR{7ezy_d2B}#aMx)AwF5br;&gJ7n8u5iadg65 z&6Lg~!^CL|Z^Cq{m`>1d37%&dB+x1Gij4UyDl#QVyb0(uDYB?aRv?%a7*=Jmz_7)F zAD|Rb;y`zSHiZL?pg<`=>jjDh@qtP)CXj$YgBh!;g_q;S31xpng5TjEv zlkKq5^aZW<{0Esv?9}5Fvl11c)8iDOpHn2wa6$~c zlzoD1r%s|%%M=i17{%BGO$Iv63Z~OU$)Gsc-9V?I%7RH%;GbktDNzUQ zlLQvVa%K*kltCxM3KS?EFXM&?ChVzcQJ}y8MX(7CZn7|%ATT0LNxa!?6V!OY#9=yB z)ryN^!U6_27o$@)^cxFIj_I|C%@m}{rMV>V@2YHx(aD2IG6mTIPGKCKmOz3|yJ*35 zYAOxQGE<7Is@U;RH0Y>cR#lT~lFTMbR78u(EL%XJn(8!5W=yBXVZ{Vh7s20AW?A7C z5i{H@fM975gd}4+K}~tl%34H$k!VWhHO(%@s5GfID3}hD3BR(bW-MR{^9vWn@IJWB zVABQ%us>EoiPGKRmIafHKaA-VOiDmhTqo0M4T>>3S%+v9AH&WDPnk7Kdm^2S-vs!EG{`@hiK@j0Fr0h|#GUy=p3**k6EDd0!g14=^P=g`F*Q z$7VGss&1f@NfsI*TS!EP%Vu4YO$9owCK{S$p)g_4T$!RJO%*L>tVfDPqa;pQh;}TSZ;T91zA503o3((1fnu6)DHc4b9N zHfv@F6ikO%!>=4>&1$h)fzDXJqZ-}^OH5T`ehSlR1|{-)!TEwH9C12DvneF09tsZ) zQ|PqkNO3ydk{#$2ZDvfT71L=p91qZGlB^mu1xt~Z!TV@d)o#&DR&$zFu|ns;TLr9` z3ed@7I#rWs!VH(J(0@w|D8H=AFvK(4q0@D6c1gl?s)E(#mb7?rLc#sKX2GwVW{b^g zvq1x5bedvxLYqw{!%t!Np@8-ZfeZ!uF)*P7otimEGI>v?(~&13tQa)wksT%&ecCk| znq{NRCJp3hf@gy*N;ZoI|5TfWR?M=)Vlz2Facx?zP@-l4&I?cdv zMYc(pPDQ2_lcF$!<^X0mIfpE93PY=+&F+yc@#2Dl=>!?$qFD_q#r(p>YTc=!aJ*otwR!ABb$!2PQQ1}oWqOsCZh zAI4)~5mc{0)-ve$P~Rv(r>iJIr&n=dI-M2<*zce173-17VWU+|aoHSZ zm))v4EIzx*0iC4a5EW2Npi^Oag|VA8NrUcIRqQgRQw2J~VKai&3CwVFE}&CoX|v>T zcojoBR-4rW1>G6JGN32<`*uS9HWzEz(*S#05@r}!Z0lyFsY(!GkaomN}zg0 zism0jCu1y&G!Yjg29eBFOgTbCcI-EG16od6{?YQp@W`+q=KubHo5hRY5q>AN6eZTV z5%D?R$y<9D>mxUJ4xhGo&8oF4{PBV@FPhuV_(zD?b){$82MbLNUm(OA&$;89 zO9P4DQDXE_^*Fy1-bxs0D!xjB_?_QhgCeFGQ9}PlJ$}j>{U42*Kf?T-MJo^upX8z4 zBEr$1PvhtOKTt~p1PTBE00;nAeXKhBX^DjfHvj-|Hvj-M0001PWppodZ*_8GWoB=3 zXJs#LVQ_0{Zfs#@FLGsbZ*_8GWpgiLY;|RDa%paKEn;UbYH(+zw^dLaTobK5I0OqG z+}+(R=%9hY-JRg>65L$|2sSVSArM@Hy95~AJvaml5;*Vo*SYzx&+5zW{Zy^$s@=8T zmfyAk?^P6miU0%z007~?0=&Hfi1~PU1jKkm#CU{h`1r+m1;qG8Y2MZVa{o>Jzv+LF z|5paWTQ2|)9Z(ObM?#h3X6a=4|Xyqq#kC>>lU->N6`L);VG9^4KEsVgXZ&l#d!J@8-z z;LO0qsniowT-EMk>FmHgAw^gn!a|+NqoPJaJshBJ3$YXx2l1eh)51Il&zU-T9bhv; z*!X8z*R8_DjK1*UrqoKmq6IfXtqIovT<~q^lEFDD+2tMC;MbW`_#ZoQdDzqht9g>F zO0v&8$XEQrQTcZs&OBIhBRdSm<~Y$X!V?6e=*)2cOtPswakDiNKnpnxI-UNG^}wBT z5<8yDbaWlbep)lWx>&Yq7YWb~$Z@{=z@_?USk7V+vN*~oJ)}S`Gm_)B#X`rdj$R;tK zT9Ao`rJj^whQM{+w3{ug=&7^7Fn%g$wk_jn(&{@!BZO3|!}eIIE6v3a>j|WtmswG_PbHV?PS<<2eE(FcC+umu1aC^zj6mY<%welioWfIcS6X6nG6ljG%if z0v*dq3Ov1v%Tr?(s$hsa42zGYn}7&Jg(x@206udJt!CT|YtIV{)Hi@j=mqM=JEv?x zfsHC?Td@`Mee=Bj1X*NV4FL@U^)+@#F)Jbt!Jai3fQ}L2&t9>s#7Z?6K zWmnm%=&@>IRr~!j!4QhkQnL?1Z#HONi{Jo6QjGp0yJ^xrnUjQ}86)NxPzBn*>a|NA z^mSY|Cz;a+i7tq(;8lrfX0OHZC^NMEGY05>WKr= z&$4`V5&2pyn47Z*mX!~%pHxH{B+hoK?xh8bHe~LECZ+ZJ1%cX?2bBlt?T%|6+?IDC*SpPvAg#XT!Q95Cln4JDk^Ux?icUw( z!}tj2ruPQCGzi$7$ua^5Z-5DyPIY1fV{(HVyNO7h#4R>~&JyGI?~+7@iabs%imYbe zdJ4^mK27{ev4()=Zlqb#ZmJRDf4Z3e&DK)aNwBHR zK;6BeA&w<~;8L|D%DF?(ewqUKUDydxR-w*iwG8__ub&xaJZv^kt8 z0iOb4k9Cqmu z<6rX&=K{9tjuRfqtKJblIv2(rogI%eYW^sUXIZ zvnzxALBxcSM+d@ zS`KhAXczLwiFk-yDJ5a9hu~UQ)M*ei9ZtBR$Rj z@W)5Us9;X{IOFE{W>OA=n#5D+3~dKJcgD2nwY{*zLYw#;@D!Tm4XV))#+w$dH#{`=GK)rJdu z%7*zTIed1NpKf1>YYK0Qk!l>Pa-|f4Mdnfk*Cih!XDpuwrlxab55l>gzUD}F$Ug-R zHGC6PNk5RgQo8u1e%>WBK#Heaq>DhyBqc*dCM=n})|jzJmE^lSxrEj#U_SGFGiMa& z`3nwz%CrhZ-_ELJ!?7OHCH;QWe$1vlDnCJ9pJ)9XHcYCH5Bc#m!15Ah+79oo>q7B> zu?qtf!W}yD`UcSAPMYV0=&8YuI}sXV&Mwa9++iwhd;4fEc zv(9^dW!lucnDH3(_uKOLA~2l~603RxRQ99|B}(J_u2BivOaCy&|3)B6&8maL*?B#B znCem6n=ima4U4ZrAg^qC+sf!dKW&-K=5|J}Yc-(m40 z!@A<5K;r>2NwjfR{UM1U^w-MGAKr%rpqxTFqqJKBJr?Ems>9)k^4xS7T%R5IZmsC2 zTFDJ>+6F5$biN88uSBdr$@V&JIujgReeJ{Z;Eq+KkYlQ@q zYlddsweeyq<~CoV3_wNP4%)ojx+y&Q?z|qtiJ8PG$tp++|Jd7MtcjL*G~^>#4INKl zp{D!f&$t{SDSa;eKKWyZz>Spl*1#o0V{1(;&$%;^Kme+i=UEF(d$Kpu;DhiBhhech z;qh=!sUWY0kK80G^PHU2voV&Uu}PU=%o5f3(U3Kz*7@DDYl${!0sL!q+MnH3N9J(N zZMUvNjm6RPeI;|kjE@RKOimj1mTy=clDc79U9S10-qUoivn$T z#GmIqfiY%P&@LefUjhAKkY>3-=j0l0zj+m>2>!oDu>EN92I=DYQE9abe{oX-nL%T= z1(G{nntMPU=5fUv009JC9#nep!wR`BA%H2xR7A&2Tg|@@5_Va)9E4ZCz+rXs3oX0M z_VsI2W;Jx}ctAEu){OmUe8t0QvrBr!tav>n+`}^o@b#<79rX!T-}w{r{#O3HVWr_2}5v7!ZgLd#}=f-`}L{zBh z6|#mcdyzs)K{B7Rg{B3=)9V5Hsmr2|?@L36l$UaDv9y#};@U&w{1W^En^R_P-sYo+ zbz91o+NbQDuB+`In{5>F_FB9}A9XAc6#O5qt-!GaERS9j`lJyd}ZxoXGUaE0#;;46_x#ifKgm4xjhF=qWq zF;i|M&qM@wDn`r~$OBTzDb+T=)W)8Q1zL<0OFvqWIYK|h&CY&Gb1@ze*z#p8(4=X! zqnzG5pL9?y+xTApy!1sa2>G9ko?IjIqVVg529WY>7LDgSH$3xm07dg&MV}woFjSt>-eiD^0<;Zi;+!6&_j${kTs}C zOrpdWWswiihCSd$8%G`^q7JtvCdyx+GZ;$Vp%CGwKBv~~h#C8R>`+?~Z8a`$u!pT} z*&?jL_LN>_mXXNUm;EY>{o6&8h9`p@qpZav6R46szoGTuIyGR2<~mV`#QEjK+36jW z7f>&QBTmx&2H0){lkb$%$-3N0F%ns;b`tQRIc!uG8>fpL^MP5A$iW$_?F3U^x;~c+ z10Rh{YwvsnZYx_^4=&^p%n+ML9!(VK&fhqzGFI0nNjffEdM zTj~j9Y-ZZc>0zVGpWNZ|tc!^(X+~#yQ}+0aD_d4)eLG!`V`_kul-%h%UqDosH1~N- znSLRQ8WVr2n?zV{aq&~2kz9o%JE=}lU;C{GMOSharoN^z*#>_Nf*|xpOj((xKG)Ml zb!x&d_m!axdJHNr1ewFoJ+J2EMg3_93^XV{*=UMMa#wFdLjFbMN`EC!f>xC%`w%we z+vws*aLUD`UE^(aKMiw!PC4zk^DuVZqgptkIw$`~*~E+=h!w93%to{zz)Bptnb}cL zAY#pegM_|vmeot!2W1TW_XV;Zu^uQWXfa3#Zw&1!-F9MMU8v>j(v=G9eZ_CraarmT z&y}3)zD_#P&dBj>U~35RW1)d#a5267ui9pa z2FyANEiP8G$A+Y2*bYMjQ}I7P#_yg{mj5a!m$EfD^h7&$&U*#(V>wj~{vaGnoA!I2 z$o&wLqXl&CS$WN|}@6sfu0G zZBL%5;<-ce0gAtwT$CH7NJ@yXA5a*N3&?-6?dPT>a<2kjfpc5eGlJ1>d1f6hV~I4q zGiZ4@7%zX%v{^cDn~{jJ`bWcssJQ3IB)fM5PeDxNGJf6<=A(Vg_`Mu9{nUkIiXBioNh)x3-)p-!P+ zn2m*hd34n&<^Q%F_6BVtU6><6sW?pq@!nOnA;&e??b7xI_*s6T$Lo6b@9d(clJIT; z=jyA^+gFxy>p?2+FxCfc=}@OSvu?+=-4SDz{SQ7C8;vw9-!!Evx;a$mX-RjX2!h;4 zp7?X!l|uG+`5YZ#IZocG^5IA=h;sZ415{rLK0I zr9<<3M7=1Ege1o5nla^_j#xbP+-f)+hIBMd*_bOs=$AN5wM~fW4R>0Im zXqvy{v?u-hj2sx@E|@edILO2JJjm>*C#&=GnnF%FhLb_-hu*kij_ewy{`RA~{Pz_( za|;>kjGa?(E^X7cgB9D(if!ArZQHhO+qQYfc2@GlwrziTH~+oArh2BTw`Qh#rmn85 zkMpd;!gy#`1O{;JJi6+-5GUb&!^xlMftU+p-seT?$ykE`IY2U>C%$`yKr zQ=O?Z4)@6Du>8)zNM_pcGT&94@*!*q`)|*vmaw(%dC^Y0e{U-3OtXA+Te+#aWb_=) zi*AGJ)&2o-AAd<-decMKpP!&mC14OHp|G~O`zfT+g1yPR^1IbsxooJfY)XnDAd}t&cP_w>YciAHXw!2+T@*@cpt|2T;)jIa)1@h*` zr4=iy4hKT;VLkV|-i-Tae~FG&KvNeHT-CS7T_)FmN{yt;6)aL8?8&VGTvS}I+Hu!zdA=EF##;)6&--_Sl+dMgeDM=Zo_97cB2)UYQZrs4aA?kH zOhdzti%&T~bp?14M!H;3P7B}U0KDmsA?l6fvRMy)Vu0tn_TO&g+By7054AOZe7>JQ z4&)JqR1yV~iNAIF;ih}pwM)0h;pj=d^`BYV>IyObOx~T(5Dx9B14xTq(i{ttH$1T? zFwmq9PqFQ6T8)L?&qilaCbm*B+VoI)9f_lAhTRvvqJm2p#oX z7_by-7suvp)h>tuPmO6@yG)^N6!GX>(q(VHJr8iZ_j35jn_ywG&=C6uZ|EwRd*Z=n zrqE6_m~5CpS#@HFG*r@xa-7LI&Mz-BeYl%k3Eo-s4P~^E}Zwopm`|iHz_)9@J;D_|d7q z^$I?--&Uo-Ih&jAQpAcSS0jO-H2xM*P!8)C7RE{x{!7K3(o*bvfI521!ETAYjc&R| zerRO=-=|cQ!osYYu%RytGpGv}trZoyMJ$f8UVNskfjt{maq{YrsxRoUswut$VpRfD zFL9^_R*K zROqN+;54)ZMbeHgCu3C1eZUsaj;({`Lo5v9PlW0?Dp@B`QMTlEdA%#m4yK~Ldk=9@ zUtz3eC_K1pa_mOD;l(?P<{My%uYZcFhLJC_+CfFS#E>X}*3rbCI9TFSNviZHT2pM0v?CG_Q+XTuk;x@@LfAq3El-s+?;$7xW#RWlEBHRywSDu2tTV zx(xNAoU0Jo|9IoqiPqCc)0^saPk1>DrqBEihSnTV;14L=8+F)X3i`#dLfn;jW_6Up zY^%#ok8o8LaJgT_<~S`W_kUh4R4U-A*tEup>NoE=`R_O1) zJYDjh8NYHDJ)(20r!@}bHIq`tcTE*Y*UVk3f)+5wHr>)YlnhPwvC-M(*5wW6T6VVg z72!qUKZPLrjLvA2=wHeYv7js2s^{R3w^YC%t96ChS}q&^lk8QXDf4l^Pr*63btJDN$A_T3%S9`gBPRS{w>JP@I{R--@cT6|Qp=Ml( zwIvS9TK`pyrFpA*2OL{jknQCuB8VXT4%bt6NK5$S^ucppLUe#QbQXbK^9!VuG z4Q4!KPxvsp8W&zrFdv+~*eNZimQe8v>Dk<+7T*us)aEfpqT>mK$+c2?k`t>~T?fUF zQ}@?p05Ln$-XfuQ)$aem}45ZZi*i4S;#1kZYlX z{-dL~anyjW4neKTAl~?C`{#kAb)FY&yXkaP&a&svXCiH&riviMTL!4|zSTT^GxbEE zhLNEEmR>)_#~U0&;6gogCeO{|e;1G~c$o^DFq$Hg1GwjG!4^#;<}f8Q82WIrdjL1I z4_dXROr{ggF0k^of3-}C~ z`PZ{9ZFj0qs(2$)r#S8dy;ax~6V0X2b=~vpA$z^gDV$1s*yq5v<^;=1Me7# zVR=p8Zn$%;FPhen_PbVeW>;AfTw_0gl_nWw@@xGLx-4~ z!j}H^Xa(VZ7rcahK|L!>Lz?owO?{h3Papp$hXEe&52wHxbIwla>_4%GDzD^ki_VeE2%)b6)GIDU;U2vz`SdYfz(pH3FL6m*mSaPMJr!EjuA zx!#7`H0wz9?4*aL%i-bO1 z)X6T$1Q`ul&v$4p;^Bcuf2t}1buQ#9#tLKZ^#!%2y)?UsuC+m}&eEKlY9-y~f>j|H3^OL$d$ko(=osL14%@CKFN>es>`X5xIAdnac?}?f2h`WXnBKqilFUrMx$11=>i|&K*yE8paE&XzMb%N(v3Vu-l;;lG_L5b9WQh$$tn^ zYP;>mqBs#P%(>`N+*k3i8z6f??qy-qQTx(T;F*}4K0=_N7{vZT8!-%V;?`~m#7%6*7_kC_ML_~lI=WSqROSu;Q3L>ZF4+0; zQzu-FA8|-^QU~* zs2&Cu_y!5IIzxEG^jgd*J+O3>Q!FxUqXAQNyl^54%GBP>18yg#{pl4SY_a%f3buh3 zLkZ5Yl!Ev&ULCQB;;f>c9_wKaS-n`GkLhab{Mj2y-He_|;zFnt05mXZzG8lwm#j{; zvkJn~L(NcZ^|TOY)Q(OU@RvnA1A4#6T(~99pqmM!P>b_9ktbZ50Pv_974nC(@>SAHH64?ESJQK51bKR2?+4`H+v{~ioI}<$A zZBi2_VPLfk`0a7S98^8b^Id+2wNSX}(K&n)-VcK)k=ALc!9%Z!mpW_T>fOPq{(%Bf zI8cj~*f;}7vLg}336|3_1`>k=rL16PuX7;B3o^T99s3`*mMaM}UF{w!p_Qr}CywkI z<1j27l10%Lb*-6j2%412HI+oW4DrO_15gm{gjM+KX!4O=%b_=(Lm4RqtM)102^E5- z-%YUyv=M}7k@E46a%;zuWB=bN0+N%a%Qq#Xe9w(J)knqdXo}E7tuMHSKmXZe#X`9w zQ_muiyGoGjUm#*jFB2b9yO**A3;c^&qL`@&qJ#2SMm-mYTOEyz;KUyde7>Z3w2H zYgp9QLUnLjzm!?BS9K_s-xXC$46GpNZueh+=&@Dy%3RzrK+)K8HyeC<5A*mS$*iX< zUd~r;M`5R4K(O^pr(sK&)GLHIt&gvGKd*_Wu)csc?VAtj_Mo^SP;p5H*h`3INPLNC zqdpQKxIe5twyKy=KRVh4#osQJs`sg;k|V=vkNJrCqJ7ZmHunX;4S@B_<4_w6;>Cw7^|Cxe`J#_ zuV{G?2tp_s;0#zqI<AVhsNdOgq@)Fma24a7Ng)h>Yom1Ud+i%LdySNz8h zGvA0LJZdgCp;RikBX>*yL-XIH`Kmj}u6o>sA@|u1{*p@6d(zzithmczu*k#v*P^^= z(}e@;#$P5gY4q3enT!oFU}Ee`^=f^{HL9PYu04oKHZfN5gYyFjvq`)*{CZFMxVEUY66}o^18fa<3 zLLDUOn;ma89yre@xqz*QGk+DkmW=$j@wJI2rmiLa8hv=unsFGf$(79eB7?&H)iKSz zQd_3lmUTX9^-%g2P~Bbf@pd*PWMaTwb|n3SyMx)D>LzKy~Z=H1tpFJReQ;QD$&>W zLU>XAnsaB^K(46DC{|q9K7g{lw5{MBeCeD#uTE^cxD~vr61@l}Oeiw;ZJsq*HYJz| zSaP~fw4;AE7bKUe&8M3hG)?L)FdeuoL$w!Z^V2a^nn26M`dVi69G@nay7VC!iAb86 z(5Y3znvfhn?qZjk=vVEW+G4_|x%)^#VmHPEiA8g_Scl*TUTn}RJkG|!e08Ij?;-UL zlAofHR{s3ftK`vDkxP`4^`{8=z(pXGzr2WO9w)}71%KX=w86+UTKU|Q6PgfC(B9(7 z0w(e?>}9a=h-xVSmM7swc*-`D+IL@9(dg~KFy`9Yv}(8!*Cb3_TJ3s?wMe_nZiX{r zHo{Ju|Lxy$g`RYUuL<2eiGDuns@E~edQV(mxNlvh30q#> zaR1H7^d5ecEdYwYq7Hh`+A)wyE>BrOQAPrS`6xE^)@orWg;qtd^OFOdu*~>nTXP@d(GCDq1fdfkAMT?ULU z`82q`qhPb|bI`s&pU)}ob!~azY<2f}ZiUHhwW0g1lRo|!^*?${joccUk&Xghb7dQWQp ziz7}co*?%J%(+Hm@siQMP85VabEYQ>@x}>IgM0F)mj;Lx;(LXY-j$iXq#gP3mnfZ9 z#>3?o;p?5{FjBzf%SUw!ANnwHe<}t~LN~VB2_4Qdun8BvKmrrnIJiS=GIXr2CtcN? zTh+p3+rOBx%(b_~guhE0vxMO+G@TboNJf6U_7JhRrcB6Q2)lc^MZa~aS);9+cm`SZr^KNXGpqmCIl6g znLi^@DdCuel$0ZWuKlg<=;rc1+=s&*0v$Ij4NvlZNr%%8EPU!E{ge;7ZF_j3SXv3u zvJufxf#;Ha>gOQF)y@hON+p~lqdR`~kILn7{nu$VR9xWJYHY|CA2)lM%Tht+l=$qK zTyZq4aT$?QZ;HnIojr0(^Vz<-*!dx&HIUq46?NItm!~Lf@_!wOJ_yUrbQ_ocssd^@ z$3-nkXX%muk|tX4GBS*i)E%NJEg#l`*K)^c_I_VcaPw2$<$hm()K5ltRfXM8DB>h$ z^rFqm=^&(0J!Rm0xYP*$tGNe(LW^>pEd@YgVy?93(}9Xv2+h}O00$+ZL{z;tJG-&* zzKRsNOFVvzr>vt6qgqOkMEo89@&c9Ih0fn+P9a9~rhL(5`|j+P0RUrP29gc&S}*#E zn89Ru{bd2P^|IppG4fN)Nl-Mjz$b*S2%2cRYqdTDX`RM$@`+yTtmIY}Q#c+$)?Cs< z=9U#w=#BRgs8GwFHD|{v#nX_-=NcAGkq>&kHrDdJJ;e9e z#EZ9k_X%zw-E9zcT`4PkA2+w}nt&?sY6CdmlM+$>WOV4FV+MTkRe6@b808M{4Mz%m zELBVf2xAQjnsy;4l2HQ|1q9U9x#D@|Oa_4-PjtY;rgmRnX5v-bgI6(cS(!}4=P9*0eF4dzM94OoT;K~&OIw8oM%OlXHt!wimWI16f zcB8}|XPz+cys;AnBWoIA7c|q{deV<8!bIx->D~O`hTpK^&+vqX5$5um-v;@<;_xGo zYE}7KZ8@RY?)sg4nLt8l1vSM%>8l9;*2{(>+&SlvtLu5yeJ@jDxf^TU z=n4AxMl;Ptyw?(Qd^;p#?*Y{$aKgWV0WDU?Kykd!;VSGfZ$!N&n3i2o;$4>X#(&>3 zNO)O%9@4}8C|RXu@?)$~2On2w>$c~zk*1VpVnE1^!28UQ+JzdDh!VB7i11;`!~dI>B!kr&?Xm-RgfikNYiuKbW1S{O z!ahPZIIo>*OTB=PzMKq!=$%|276QRr$Qo@~bw8>OH{OIb$f?(hzSw!!br6R)4;{$~ zZ4;n_3Lmfs+{xXi=>7WgCeI~DtRc$tCVxNJ6Y9*lJ6WQb+BbYu z^Yjd*iH*~i9!7cR@!42V>f zeLT4CBR8$_kmyLG-um2ZRf&3Bv1O=k`wpAnAnE_hIk^sE_+l2IXbnu2sqf(h;9DH3 zgyWw_j^V?4YeLCq6TdnocP-@CZg9NfAjw!g_yLEc)rhd8s{Q=Nmt%a3R6ob0`W z*~N?v(e(sZ6P|J@u#^O;A6|;70z46WG2~U`M#O$fBC^jv(L8_IE@$E0wP8XSA=SRJ zVzyd2kK8xiv`~P5p{kVb7;@tMT=nu;e%x|}i@aJC9bcBM5$$EE?BjRsQ&yrT zpyK`8Fcga?PwmIDU6z)UbNeKn`BWuWRZIaLVylF2Cot{+ZZ`&k${U|CN)@rfX9q7l zVzVJHICw)NBX?(dot~ITqHRV1>x0zHHgOsT>cS(hP6^D*3PYjf>y*3mUz=W&nt+=| zj>-9}W;Lo~XP$r9KC4Qt=Tl2?(_8*zcpi<=r@o!g;WbfyoWbos9X9c4diuTS=W&4B zG`xx}p@VFlPik@YfHZ^%QgnLmzz9`>3b+F7`#qY4JR>5?N^S`SBnVU1xtzZ>aeO19 ze91Eo4`1gWbyiaPqCx_hdRfJtl4Cl$K@1qpkBS;fE!X}oO$de}u4zhH;;|~1-ZSPx zQ)bin#03)3RS*W8#WVK!zs=ni@a#^nh4YB7am?xmbG}vI%T(q!TY{x{c~#-qI^hYRFf4__@G+K1T24j97Wz%=OY^2NAIl? zAG^0|N^n=`06#{csNV(hoAx){*dAY8jimZ3q;R4z%NeR*cJVHIEx_&@(s)84=|=*a zj;b5*FY|s~a-I{7E%?Kw{3mhKKnS!Njp|Z#IdAHb_qujJyk%hFpGwM9M z>~*5m(3qcVMnh&mMND2+oE&U_c^EB$%~L|FJKT)s*~2Njw2}-t(CRqKwv!Jj(Im$iZ?nVQE|otzsT`CJ#0p$dtsHjJuT+9?%x7HRXB z`|SNx?4@I5(Fs1nC^63Piss}J>F)2@ss&><6Oiwl1#B4odstczcXG&*67)WmUxp_C zv%UNz=&%Yshl!WNISS)?jVDiN> zPy<9``P>}$8Uv&Bbn4P{7QVgJBsS;klFGoO%dIXu?4S-jVF`FTYSy=e!8emuo=oyN=!e9wMRYmNMKQl-u{#w7g_3(n;tJoq@uO}bxh21C z!$g?O72DJ<{mJ*0FQF!uJ?Ul0w$lIp6FTO)V`26zLz>)9R(VrvBLE-qv&YI8=j&nb zmLui1dmStxIa*T3u~kI-@Rt_CYq<@hUSrX2ELT4s3|aL@cKM-I-mP%XIK8TX`AH zY?aEe!bMVFQ=9#?n^;7Dsi^t)YAolmR66SpZqoi0Klx+0*uDn4V2s#=IwWD_Wi4r9 z2Yv}%N)QE`dDQ9^2AbUdmYvgng~`138GVG->FDo-s5XRZOp{m-j!5Vba|%qJ*g!Yz z*X0Xq=I*>Br%sW{#nuBcR$qCrv3-LMtl1F4LiCjzJ`|FTbk&UjPfkwe7u7G3iD}0k zS?qTKF@ekoOA$ih(Z4g;^7Z6NP-e!?U=YWuLJ+G&dCoTrjb*%MYWK%Eu#S$#JiHEt z45uISF4M(qmiGNmmZ<&=Bz+8vuB&FG-)yt<>CAGt2krl>o-0hz5K7dkZP<90e;yz@&7EJSEeh-!n_8_}Znq19L zi~PY+mW%xRpJvTIz$>HbYF5G?2(`hr)<|tA2soI`AC3weHMj zrK@OIG%W|4-7XvRPE)sT!&K9ZLd}o&qdMsE)tJ`WuDO7GyyUM|#P(9>@wFrqdW!#7 z8ujF}bI$SQ0O!}R1Jj$9t9eeRR;gVwky&T5f2+Pzi72xgc`6~Td*6e(EL|t$U(+0C zM?S+H5bFJ1%ClcxdbXW8A-6IoF^$V-YtmdO-omUxrHaanS$ME@%HQWcI?Z+w=>p$G ziR0!?OqDr5zo)-2x9ZV#>hxJm@>cP`u4i1EH$Nblm7PMuUGyFxO3kZ7%OtB%s-Gy|gM=f50?tDVE0-f_YcUJdh7R|oBQ*JfP-bvN2yRu$TQDk9n_W21LM zS^tq$vEl0HJ+)I`ljXR9# z5xgI=&I;(m`md#=)G!`%@_-W$?T619ehxPrjaoL<+j-Uq>a8M*asI3GK__^+_c-^< zr_l>T7`kZrC6>Aod@od~O_)rbdCfps!ogi^=}#*aX*&5Ep!W0c|I5`)V4%F>vH<~M z{09C1Cs$|cWa#YbWJ>2?XAX?Pb~+KMASVt7jr~7Z4^C1-MCtds{~HF7;J;@ei@IM{ z4hY;x`WH+4`QK5{Q=a^rfpU=0bOr)~LHS<*17+o4{w5(@BxOY*{(}GqgW}ZU3H$j? z;kk%vxCqywe=z=O6xBoD|CJGkIkQX`US@E zk1tCde4X(h&kv*l5Lei4K;I3zJ6~?`{;PZsD;vCVb>{S?+K}UKqdY2~E(*Z-1qii?$xSb>H>H z&QiB)b(c>;UjLqF=-dwxYkQd8YPXx}F7PiIXYMrI`gw1;nU5C8vL*)fJwskKZ5Qwt5Ri5?7xQKplsSe!+yM z3S?Jrql4}0#_qJs`s1Zd_r-94mB(J}s~hMWX6vDS<7aCBtBJQ5M~aD#-jdl` z?29(7u#5@jamlzD4ioh*n;-m%0G_#&9Gp~(@&w};lShPgBb@aRz~y#ji!&uxHz)_`$Py@+QE);^wG3!Zp!#-jMb^*vu*nqtAY==d{{a3c8|U} z%R>L^T;a0VW)A%AbswcMgLJ!yrHCZE4bG5U&bV_M0*Lo5 zfo(nR*k;!>Jeb+A!kTqE-^xt~H`v6Tdi~{{21dK_3q7o{hFNxqJ*b>;1FZV(GYDeX zFr=otxeqfH2q5{affy_I6vXIQp8^F-CBl~8G|-;!0$vo)+wSM>bRfMJXC&iI#n&Il zjmtC-1M2AuPvN-;UgN`-(}L>(k+HUgux&@zE?}?TU?+<0ciFIV>GRFd$#5r&9eU$oR^Q^kl7$o{{eufPFw>&#tt_)6b;Y@M{BHNqd$FemsL z(VX0zhI1EpToht_qj{o(3q~Q|4ue`8iRz93BKx+bJCAqfq6R>P_b_;7(J2EryRP?0 zAnbk+vfA9#8J;kC<=So6rRT~Fu^v^tNhq`XR%Enu@sm3IEWfMUX0R8KT1IaXt}gi( zy_SWW!z^p7!V5oJu@~&_Z=K0}@U^}mv>=VM^4RQMn!@DfxBhHY&X7T0Bz1|q&&*Ue zHZ~#2xgfNrSIWHy5Qxaeu`l#*Ac{C>Ze`opNGx%z7>UT3pD=;LXnPM=>2#U~j4%ke zButmMkxhuR)B0<2W8`p!9Tv7P-7Q!Oc4WbkH2m4iKIEb{PDVbASCn{8qW@2kp{HmEQ8%dA#!0Vr1pVi4-5Uj>^<6-gN)*XFB5G!CDpB{Xv^{Ic=?>-fqT~sE@ z-a~orF+4C@y>VHQ|IZbCX2;Hc#2=Ei^>^vzw8 z`6XbBn(!Qu_$;nHTPAcx*M9KrFS~4Doq5*rl`>u8zwQJHVidW7u$>9Out2?_yXLfW zA2t7Yu=@2OZpp8j^V$FpS!|)?Aqx74uEV=QWemg8q6T8nLT*zDH9Faqu(|#ZzV~@s zy8YcIB@!c^{;Jj!AmmT3CZ;hHkW+?75o)~|XoD>w-OaF#TzSmYry5R~Q*Fum3qo}R za9T+fLxO8j&C=fgiNQO`K4X5g_19Yl1BaI3bd^sh_t@mc5(f=M)k43GeCQ^+x1j5gA&LrFaHxojkg7n?Hw?D#2T-HbrZ@FN_PA!jwg9m4 zS#T~$T!|`#UTAOqE!C_TcyEOa2eLa|&RIHp3yz@)oY3Bn zOBNPq!afZ`_E_D@%on28yr71Pcp<5|Rivy(+PHKvQqFR4pDDvHXQgJD9Pnj!o@4eO zsOlQP!_sn|9xUK0-tfV~>MHE@Bf}$&dM**j#S1O|w`Q_?2>#irL)fI0-&_<6rUy7D-NEingMy=;0;~v4F+^- zx>hOQY%=I86+CTjcJk+F9ke+ zc5JG$e1b*{5j@o6=%EWMzqldL)C{UUN-@3@$Ah0jCcx;HCq4V-$E2_|QXl8^L8Wb4a`V*bhODdlpEu zJc2MPEC&;SGnc(WFxJRJT3j%l?nsKHo_1=z#bKyIs&GUYumg0N-K&E)Az}VrH>d3j;%mu-*MzF^=>=8{4jicaKnA2=G9;eAmf9vAo>LcwGD_Xx= zF619IhIAPD{*z{q5YV3pTev)Tru!LSzf#SXN(&GzJphdK0zJlMhVc>@N57haqF{tYDw$ukIYb}TSm-s9s|8>}x-u)Qy94Ywr;U`mb;&zYKeIA@|9NENQ zzbw}`ZF^f!l_>D7rr;Xw5WW}*s{6xVvV^E^NgEo>A1^^{?Ct$foeCnznOTXPeTiMC z*uk5akRCifjY}`DvkjDXA;dFVQIVTukySEuCftlgh%rV?PYtg?FvjN3tvT>#5!P}n z2$u<{$1?15Eqbrt>h?z+6%8gO&33Z+qf@?{C=;l>3bByAOi9(`A3q9C^6^*$&FQ96*WQUVHNgv(T#5h{8qBNKB#G%c;P4e z%D2yglhi>^*=8$v-4h>aWEdy&nZZdu@F7Wh%3Ev~D+qv?YXSEAwe5M>LcP&1c`@4x z;}CI)VW!s8PHcEJ^c~mH8LqS*_n#^wg2?>oK@d~w{SUJhNp2Dm!6X8uus`Plew1^Y z%@{KlU^Wa0*j%6XNW{&0Nrv04^6U~87VRUbcixJ*OMcE12l|$0-sbhRp?2q{&?3e0 zsRRo+HL|4c+GS|r8XXU_Kr`^Jm6wiEWcpmUm_tNBUD8=#7XL#B5A;1DB*ecpAdrp@ zasf62BY!Td4#Q&zouGmFwk#T6Bp6VjRfxQj=5*38(tQx{0Al>?1+kCYygykr`PVsN zMcC0k)ng<)cGZ71Mk&s5@%pI_m`$I}_)GC23WI|+h@71KT2$s#M41)xA_KZ=)b~H$ z#-7nDLXJMYW{{j0j8;ZTk|r%=Jg>)42o;~)qKi@kS=Lh+X+L6D$Y*@Yd^86IygX_5 zP4k0+G$7broUCx4 zKF@)Cmf}yKe)?>|s7*1|Zl0au;KqMLz6RQgLu>j5R-mdPQ;^_vGbmn=5 zdIDe5km+SEX&L>;gmO~CB)dL1^AVqiub(pZWc|I5pjtYNk20_4K z+UvkSfvA;pF9@z>R^Mmg>26Yw_HK_Rrb+NHY6cM#iM@PW{q{P_@Nu8_*`qk z{4LcotM?GQ3sQn}u2$HvZ=Zj(N91j>>XU|}M2pS#1$C%X8J}J;qdl*RgL=IZT4G>( zPD$RE<~8c;r(>p;(*Tf+7;dwHafHVGQIos2s{28jI{!l}-6k~BlF%Pd<=KQ}SDkbAT{>5d;B_oP1)`QOYIQ zz+D^T=vSW*(_7>Vv1uUuo~%(3;RXExor<$uds;M&Dzsh59hc$~K)Nf2c=p?mQN>X? z7{l=QS&hDwJN(z$X}A62_|Tuuu|kavS&3%6x!4$mw0!4F6SvZQT7I|-qjs$aYmbQ* zAQItOe-=0wS!x29|Eyv3kQ~?Gc6>~N{v_2`J8&EpesWTa&R7c5;Lg(`|LSrI8(P+e z27Te6*Sr9h&IF(?(oSbP$_?)^{Ut{^VxU44J=v3YunEp`xHSE&!g^+3mmb`urwG?Y z(kO|1mGqo7!7LV~_b8-dxZ!_%V9vya{hWZbXA!c_%F7XfqF8vamaP6p8v z!)DJhnv$DBN=OG%nW9v~Xb*A|R8V|S)UysSxwPRWuE8S^x#0r+q;jwKtEXe}l3f6K zXkxy~{YCeh2(Op+jcI4~N)u(|b!<8rpj>R-0 zatDgtWwdc{Bl+{b9^JrF#K%G-nS+b8HX|&uv@)X)tyIQ^?x#dG8&N1mrH^D zd`pk8SdSR0L?=3#UzqTj7o7 zhr`0ZDC5zuP4TkYHkLe{(t&GmOLFAoa#ZK4DWiK&n}^^!=>5^<2K%E2S<=10szI0y zLMnSz86JHT=-CV-b@GIEbp#B*Dx_X@3m_i84_(y~pFAznN+eJQmGE?74qCK9Ktv+ip%rz9RScME7PnskYm(HiV^Wv?!H3?!iI!*(bPIc zoJLhd@N!3Xre>dqnUG~7M6qvDCzvs?Va1~_oUl`DGyh{od33hg0Ygef?o5vg-bfO( z7y;!(pw##7zKdzaI&t?5Y6B8 zXBb=%Xc{R&3MtE}i{-RL)&QC~fa1DuJqKh*jqYL?&t+q>*dbPF<=h!Z#}B*)C-Ms6 zInp^&60F6ev!lB?G(wxzU{5=JGK z7NAe0p1Ux=F29Ts#qMz-sx6%ucq+k^wQ~yTP~}1%p9+pwSVesGu)e_OY!L58fGv3t zYJ?ecS2TR8FxD~9+9D0F$EoYk_Os9|?Fxg1g_ZgQMS*s}ZjI6Mq62w`B*(}UHJ$mnj3dJDFFKbw^d|`Xq5{jhnyD&I*hJA^S@KA94lmd zBb`n$1?2VR)%f76wu1WM!8$}EyQ=3NZ^n#>TTu^9?NBH0^_&8Mym{5&d5SCfR*J_m zo;ePh>5mWi56DbYr}Wsdgp?EQ4wtJQl6&c=>o(bh-yqJcoGpm%!4GVupvO@zS#5jU z!h1sO8Pt=S%@CT6*(=oSX)h+MG*^mqh_se5Frvz5K1?_+x=Uder1?1zaP9;W#n6y* z#JzH*a)(&nL(*P(Y*;{`DU5QX*H*MCEkHfNC}rn~o;k*iH4&((($m2BunJRr86i|W65tN+06$)ZX;rS^T%xVRS zCA5aJ=Rj7udH`u;Uhv7m*&1`VsfKa4q6LRLNiaGIBQNN+->_FutqB*<_TSO$NEG#Z zXX`5A_w$~l`9Bd4y#PVl5JpH_p49q^$zqCn0x59OK(->d>ZL*2emfg3e|9-3oy^8II658=>pa$<~k zXL{+inXB9>*QjD>j14ZfBp~{v-9@D)!NoR!f1!|m$cE0s`Bto27Th!_Ebm*2naRF6 zbv8l2ZAJU=s|@_p#({5Cey+LU5UYNCQT`80T5PL#cG~D&T zUj%i$$x9d(;8R9|Nf^P!q}Ll9_s4$5ev8vERkslK1RSqO<`*y!w+o~g4t``T>=efH z9EVuv!b3D#RNiTG$*mf7Ez%cf7WC1uai=rx!|Uh)0n|bRU%qzLsW+!7j1?0|r<(Gs zp1Ev7KhW}tk;u~oI3LCR%YdK-!aM-8pI zlIVl2XRPjLf9q-1h?;NV9?HpI)en%BKiIVmGN01bpk%A96_h|4Nx`A0rn|uhB#$Rk z4h1_93Sz`J|6&`8+&LA%Ch{Z>e{Ebj=P=O=LeAi@i^LkE0%v6fCAO*sL*8Ml!&q=q z2BDo>10&fwO0{a2_vZ;ji*hs`oVlSFT@9N{YtI$QFVLOzlG;%$SZpgV`{Bt~Xj_r3ZmqKtnAT3lg7l$ubNzM(xi^gU z*p$$E@u*9*#yUtGiK==&{XW=<4l%)Ans3ss9EOM>+({S-p9<(FSqU4#AWY9zLv$QB za*aU4fl4KEICioIqQftNK={cGm?iJZ7wvPY)LU;ZY{r0p zo3vIu{kMe|8as$$$54ON@;YTCaK+`m(GvQ?CWpq>ZsI|-c$XkFhzCqILU11VaL-Ij zsR_!W_2Al*Ctw?bo~s@UNI=?z0kHw{7HUl8_uKx}?;lpAIYn^H>C1~K_%8bTNAHj% zHQ$BDy*4Ai(51oKbkegSgSf*KN$bk zKa5!FR75#mqDvkC7V|350|s%>OH1P(1zUxlPt&kt9Bj-Zi6~8N3asVoEuGIegSG$T z?bv(4pz7j=Z^)NpCT}py&GE!f7F7UV3`vqTnF^VCyoR^rF-p064@eQQml`Rkel(-Y zdoyOL5ej1mvl(#DuKg0TQ+T-9Rl(}B7JDlqJ=F1>lWkGDb3izGfFVA-ll4<2*4YK) z7*L0%hX2nN3Sq!Q0`ya<8de`fZ;IYa_pB!r8LK#gx!EK*fK+>$l&1+4{b;w_uNJaD z(Mvj$=gCvsm^*k8)CbEuem&8+Hn@S0bB>6r>eec`M^az)s5YO=@QhACmmlahAIRrd z87iLfrio7>=?fHS#~R_bFv#}CaQk%~MxJ)|Mix@x%n6Vy)LP(_Xrbtxr{EkG3_LGV z5ZJ3m)=f+~Krz=an=Q<-P2j5R%oK(CI4|c{*HutJ#UynX9*ocA9ej0mPuK($q7cN+@HE*4}X)p8FRMN!l1%|V|nBOwfk`; zW`8DT>rh3Bs<8&`>ZM1sHE{71fL%-7<&55S6lirafEw=878OUE%4RL|6w<3Febs*p zDF6(k+d@Ws;rs%~d)im4VO3-$K5pj9OJYpxPxb^AOg^aX;o-(+IA7oLQ_rp z%jd@SPU)eB)&IM6I6x9#d-9J^rr(I8!YFxrz}vUSH{M<*j(igg<&}nIAiU;_Xd!T| z=pWL5+=QAT^ty-Ev#YR{d41va6ONy*h3#IxbW8l%-b!rJ%ajj?QcK8J%L-mgmx3r$U}D1d6>OV zuBypo5as_E`^wn5Vs6Q@`;l*8Xq|>)yd4=dc;^JMIeo>eL*8R)QylQWOrUO_z~9~ey|9*@ zy;y~w#dv|49GZZA#&nwI%g7BbU=6#6!QrkPI$#96|P}YXJ9pS&f zRepbq1e1H&LezD`G+?n?l8Sh;ay|G&0eme7ej=5b?p*Jc>vgDhb@m!F=hvVV%T&y){)%p05hd2Qenf}?(W2n<1!E;Y1IGxBQ{j-@H`ymhxGU$0$9Q_kpoqJ zzio-qqrdB^$=K(#LG5olNqL9egBQt#X81w*V`b5VJVC$z?XHCLS)ol*ftHm_Xav8k z@HRa??1Sz{l>+-h>K7ihX})(Ono8ZVf%^m3=SNHryGWNo{Y@DMW9jrF#W1mrYeW;* zZxyV-AXwh=`2f}yc3JL*!RfiXrhq|CGUuNvaXXqBYaS+=SFxUz8n|mQD%MZL9RzLQusyryBwIPBNRniz3T%yh4!*;@9T}8c2um?Y$m6Xp} z%TQDo`wRcbc16?y#~Mthj(lro&0u*2>)zCD}K zjt427h%8&?#3GzaWC5qmO*p1RYNj+U^ad91P!fH!JtVl8C9!O9z0cw?4jf8^hLzOX zrAi(TJ#_?ys*Nqf=F>ZFHkN6*(X5V1uupzKAJT3(&&;p4K)*#bBD+12y}Z8&1ZT{- ztg_dPg3M*^u3e_ydR46Ha!FV0)O7T7tvvPip&}u75+Qr3#`ZMxth43sGn29%PHeDy z*|2$J<1Ow&S;%D8`OU^57UEHbInKcb*67%t($eVJRf0z%R{1Bk7$EvLf|W;9(AH2$u2fjqiRb{_EfYgA z^D36<&pTHCZ^)av4Z=Q!NUNp!JS11GYqEd5TCq8Et#znT>mwSRoD1~Yv=e4U=6%8D zrHMX9F(C-9-GtS=ov4`!kny~RmD>`bDmz8y(rto=3E$v&1swmxs9yokFY3K|4QFK& zrTB$OJ1^vh8Y{PcfA@C0TxKuxRxm8^h?DMu7Dtz5R4RR+mFGbRjzZXs=sTo{7U@i- z$>wDHiD#5yjUV~}@J2u8F})jcqSM`^mLKwPYX?C2q!@uRTla zwHh*$JYY_Z=M5dxWz%Nx0pz3Y#l0#g_IGF~8FIGc{(`*EAS9QG=R;eve2t^P(;GQ8 zKr8r1Cf39)r^uGewaq9E?P0TkE!W@_U0>^9ImxXNuJ2$uJ*WhQ5xA80iOo}w=jcjz1?{K^P>-6>kEQ=&@;Ga zSMqU;B!p^x0_1TMvsH}+Wq~&LWvuX^?4)u3%N&ZG*9zQ;$ZZ3izu-uPoWER9(?EBO zV+HQYP0Nuep3dfhKclDmd{Z+`D!Q40gIVhBV^n_wnDT9)QN4U5GkyxVbK9VuQ=$8J zB$xbmWu^KvE@;1i@NOR_6)c(D2vNeivT4L2O5N-%=V<+|9+g=H`-n*8(P)?z|CNNL z{e+)8`{f9-7?gfhVVx|_wrv=zEJ$0`tkYV50Q z_x&pik%q-cS4`}~5Yi-}8ujfE`+cpbFHFA}(5u&Y@JWK_i>i)oemjgkw;TLY(=E48 z=ph<`q>^&|$fLN=8$2e_(TAvq0S~hEFsB-(cF=S@uQ1Wu#!p5k@FSTy>w9=G@wM*I zD&eHNF0dkIw)q?hw!2k+I3!!i69^VQ;IT=_EZHG*4zi-p81Qk1UDyzlp=H8u4KIN9>_GTN z9rSpwr^+1FaGVArz}4A$E7ldvNy|cuc%=N{#e>V4Oth=q_#94u5admpOC`lm)}Kvi zM;M*Ba`bniduOwR5%*1=0(%aD$h5>7?#!z3w43FJ8G3~hyDNxH)soA88R+8)F;FDL zyRe`=O~~BE(Xp1Kp0Mz+JgYzHC+I#Q3sHv^AyU#itV373e_RIBnuT*bMs{v++(uy0 zcRL4t%z)TEr&j7%q&nd80z|IXJ~;w&v)L#6S9VqJj9v+h9m=AK>|v@D9Z&EB!|~3H zJgaU5X#@uZZZ%num-a=S6`cwr=UGa`LeqBEk5~%=w&c80UBxmR+0yu7?sY{B=SR)! z@NQfpO~s9{#38o;K0Fyu^&C@;=mthw%0>Rkr@~`s#ntwiCn<*+$^NWJfmBZSoo4PH z>*f&7G~YoU%_2Llahr;ApDpH_thps&ax9P4!6oDi_7)jhjc5V|`jvEM0Jc5QcnYs* zN5oyAlv+(20xsyE5v8?kpak8)S9~2osNV+VF(7<6m~|QAM3r`!MHIm#?01^|e!1)I zezBb;LzDFQYA0U!?I2n`lo$mK^PqCST~5?jnG0O&t49qKF%38E#6hKuD+b7Q z|DBjN$>hC^OP=gn{6UxusKY+RLN0iR|O5GEz&MlprUKCeB^nXFD`l_o` zAcGa4hKLeT(vFh(Q#p8UG9VUfjZii0WFu%5-+%q>+D4oxrrx~*{cj=4PIDBvvrp0s zZ$EFlsHoB)pa#*3)piS&W2Ec) zIe?>O$W6Di&P&uyFt26b|1&~*Li-2$e7)}X6yg#i$eC1vA18*`uI?q00e-HY7_q$& zc6bUYh}{DXI@;sUZ#)%TbxV?@#@qspho&?lQkH+{g(vpG{D@ko-rbE z=5yz9Q=nf9>kUcLAeiSNZM}=|uxDGLrXRkC63i)(oVsd-$b-Mv#kvgN6*SubxmPB^ z00uXxW0W{2{+v$bdM}Jj#WI(BA|z^PYj#I2Mjf8fP}mmNEChuw<@o!M?Amy|MB!%1 zki^k*GhB)g;z}EGP_bj47qn5uvvK4)>^{k2o=svhk7R0iCe_^ijnZj)CN^iGB@C(3 z%g{HzuK59V7S&crf+3G+YSCoZ$Y*~X%mtNlAo4+r$abAgWeDJt+pUMJ^!Vi@cqt+G z%^=*^3R!Vy7P&LvuyAlfBWR|@#YooI?48AbjCjPB<(ZD~$7wIK8N**l2NTYXzGTkL3 zj80v+xd>1g6}D<4y&H%r_WCFlo!9Z3?YZuJl(#GUNjPCAX|ibC6BW#(OO!ZuKU`*y z@1ifP*w258qE&_AJS^K#jNi$CxADHFBZeVI3FYu=|k#&T$oz;YJ3y za=Ve}KVD`?+@RV1WUXP$GsBk|3g9^BllFqn{#BO=*-CwNUz4iKklA@E_t-L&neMcqw0aICa(s4drwE7qiUEb(rM1lWNrzc=sF!BD2 zCIpcg<~u80$dT`Y9lH>3El&l*29Mw)6fqy_jP4|v68T`0D;m?%)SWlW1e&Bsnok<~ zi7FW8@m-(*Wya@E7@<_p?`*#9FhNGU zk5O_LZ6RFfG4zd8{fh5=15G?3d2=54_pnm*rYeUDSBGPLcIzk294uvT5)P-U~^)ox!m3#$Cr{&8jXW)&c}A`vv?$|8`b9_0(uT^lqV6I zOl31K8Sg(?Nd-q%dbLbUg6rfaWiRtRi6^9aXFyr;Px?T zSfH!!c+UWo`0sHl5@lpE0E)G zZOuE4=!T7}L`%AVi+Nzy3f1bOCh--1(Z>lTj95-0qGmk3BaeoxfY=G3UPJFyW&{G? zsPX?6C+qzxqb(uh+~4Dnz2~kk!>|g`zm~P^C-?3_)3_SLo@sIPjj;B_(dYUe@y}nu zdxw&Dr?j7$uxaoZ{IC1oD!5hmyvOOG&HRG}$qTd1Tx?Xv3YHFX)V?B+5j7$P`zZD^_&yWB~y6b{iCRSfLrC1~;-Z5@^7ipf;;4XRaZG}$;yz=U}$39}Kb~prgJ*gx88q80E&8VFjejj2jSIn|5n;b!g5)6cA zLCr!PZC{21_B$Uq2tiEKbfP$8nFMLNgW+6x>UDpvt0Id`gPmtv%rfNI{@Cp>s895S z7Fv>6EzQvg%t~0O3j?QnJ8QDkm zSW0%;ad4@shn;ESt*%B1XrjsjHW(&d!L9m8s?e$~UpeOss3gy)cK^gVQaFT1$!G(M zZI&V3?S^F^VlGIY?d#Vsxy1Ne?mS!Nvjmh>FYC81%8{x)A=%&1wBtcIFLkcS56d!K z;P6-6T@z(Oaoqpwx@>6JA(41_ehk`Rqso!P9E^~su<$*`Vj?D>3om-3uQ8O`fn&PX z$t^dVU8BLqLCWwV8d`JU^e$o`ZtrF1F7k_6^pB}_E!TsHc@Pl#uKxE9JMb%W z3|Xf@l1;$IQzSXqyZO8D8uBZ0*ZSHY21U11=)(nt5#KUPw&F^Ph+ywPDJspJ`tH@6 zbAkeki1~y~jKf4e*KDM$@H($TT*xrNcsof>&8I0cP`RB5;tYf1vnAEh3hK-V%|WUB z8PxM$B-|~Bn3|Wn&;>NWt$?oTsG@(>R6!~*ad#Ht!Ml6oU+pgR2&AGXePKBaL|MF7 z3C=pm^&I;+t1;6$zlIOisoqYBd$fpmfsk|56zwMY4m1KECI^OLLFvki2Npv+%RX@Z zK0$2!!){|nOf9;|6vHi6Eq=w^Tg0Fjh7q%B*|b6R;e#ZO7;o0O(hPcrzc@4JH_z7Q z?(mtfr8EkeQyt-eT}1;-jO}vm50Z;-if&?2$!@w&s&gkl$UD#$eO1}SZ}^A6YP9Nj zxp_sFvL7Nk0miC%l`x}gh))dm1#AW-=HzV~qB_~BlIh;Nh6Kc+vhjH&blrQr7#&R_ zYR+nnK;IhYr7<6Q5S|a5sPk&2b$=)LjyI>0wKcpJ^jaz(L4BjZEcHzEN)0<-z?X!= zHNN8XVp3V(Z;EKsiz~YvUy&-zPaksIr81v%V3F5t=xcZLzBt!un)Tw%gWcL93JSIw zavfc3f-&k)4GO?UQ!G}IEBNZqfq`}S%X_=+@QQDu?l#nlc4NpSVw-z6!>=-Umwo$N zfFX8N+(A_Xn7}~{6iBeB+0!r+t9iudpkgd{LNK|Yan@N~_6t4^0U;es2T3 zTZ&!cc+fphk7#!50L*W?&ub4c8hz%xQLYM}hu0>l?ASBE8y^PtOaouTB0@8>d?zJY zT%0<3Qv~*7zcL#=0R9PXp(SqM9^8=bI=g(qq$Gxo&|1gczD}ggeXw|A-2q+Tp>S{k zyaG3jE;vT9FqK}AJG`jJDzl8qWIejC0G!0zn3oEWOj0l&^XVx6dw*A-+M|A z?bl9#LRgJbm60sIB??8;f~avvoKE_&PTV*ArJS%0+Z0m4EfWbw^}|RU?3R#+QD53M z-K4bY;FP%!IBDW+K_I`~WKDaDEkF>HVxy-Dm}LuvgD9l*Ti-!s15VOKgf0x|+DpW! z?C9pZ-o2?tG}42@qY>o4Cbsf>)Fo~la)UEWFU7A_D}r@5p094^vG-eLAs>_w1CpW? zAG$21E+M>}>BX|tPjs&yuoLLVqQofgqc~{Aqxm&piC`EbK6eXH*m7!eTv5l*f!!`iJHMfjArIP&}K z#UThii%&dzY-YxM+xk|XFuW^DAVJdAwYIHr?mn>pH}dFUBoc!vx*Uqr$)l3yFmf{- zi2!R|sflAMx+xTiP6`&Yi~90g==XBsc}1mv1sB(8+<|@M3%JdRC}#rQE>?09KMk$Q z6+G^^3#vI4z7PCV+Al#Hxqa3YE-NW4t9vxg-(8mtvPG-uspOIzEApYtWZCqxqw!S= zgaEOz8&K$$t)gHMAVajokfOwbhk&iVtBVQ{H8FFJM%{0$G94d4Nc8hg&Z{Bve>qG+ z2JHx)d^-xw#JNdl3in6Yodti^$iV`44~w*l5kxSn(27~QrJvDD)*iNDN1JT~V|x@+ zqXYFrs)Gel`K!3^MBEb`1@~Giee_veNMIeZ&YJ$?Yk|p1DoWIf83+F-(d>tIH7D38 z7+AF=I2iB0S^qxzqs!k3jj!a@s_U6p)?v@ulJ^&&u4;Fu?%eP)n4KJ;0 z!R^Jxrg$k10w#_H>*lpa^Qj~)*&Q!JLKeUXhJ8O2TsE*?oE6nH7=8dR3=J-FT`U0; z1LFH=!qYf}fKU>eW>ueCRi~d6=sMu*a8~Osw^zf!W{O`B+*Ncwu&SX-?>s$%AKJ1xzV#D>I!_LJv1HjEnAILASW54vEjfCNM z8)3ma!`}NV!&Nt>D9To3WqLp9*_mElhmGskr52_7r;_!-Fc8#)LMpc~AOAVsZm@^9&ryrC4?s0kDz{^YVyq#0$!Bt(Xs}tb< zC#A&KEMcwh&UEUuhjo<)!-Lb7_Z0S+(Q&{h*5EYmfZ&(U;%%2x33Vm(W7pox;qd{t z!DGkrd_4J90KC}7cum_@p!D?|cdfMd)R2hd-pYxA$GI6?OF$i<NgmjB_x6}J~|}_X%sG?={r(X zxn6>T$zj2lNYk_THK986t3T3J58hF^z?>fv?=xn(_y^L}Hi)MD&rV%Mau4kdiwgdi z!ZrLEa3`Lw>dD~Uspnb+HZi6SB2dKdwxh>rf77ooA5o_Na;L5wbG)p3r|lbJYB_(w zEZXZA!q(HsPLPU_ZT|IBU~unz7x9F zGi5}HIVX_xGJy2-5QvJ1Fi0w);m^M?{|0DvOB9{xG1?;?Y7&|Yq`nDYo2!pGTbcs& z!S@fse4=d2;*$FRrS9%Y~ zKiLF4>WQL|io$&2zU;I1J(my_0JP|W^4X-JXzvj@TZ}h3zNBq*@r;jCyvdM7n;(g7}2S7 zJYSsogH_K|x#Bf{e^pr9&=ahmaG4=;qfg2lDC_jTCuk(xFG$G=+9wd&hb)}tGw?b+ z1xn!5m{jR+Z+!1!7qa_qe8H#77Ubs%a0VA*TMJwh@8Jkn#0ehyR0;e56#yLs>+Mfz z{2D$ErZ;~}VC+ZI{AQ&bB(!xeMFs5rR}Z!O+LjpQB+ljmEpQK6Tu7Qv@o=dsE%KK| z3hyCw%n9~G8~WpgY%7RJ)*GMIhi%Ro^5za%LTwipE?ynI;hD0BV|d8e^;e>>+B0`t zfK{&G2`IHm>HIwXyFlyQSL53j&UYc=Pbsaw^_Q=c#7E_4;ce9~2V9PSd*-Euu0EoW z4ipxI_0NQJ_Eof&m2)g9WN%ll9o1G~%JqOi{=Z;m}It6C$B7zcR+~#1n;;0fO=P+(0d5Z9vp^d%GyYEBe9#BAJ{cI4t z7Vr?Een3F-9ZU>H7C@b*CwVRx0&?5py{yfmdno-w(b^i}>ewgG#2egEp&~@BUjfic zhw~g}Cy+253E?i|9S-vig=Y`GUu?s5gL(BNciJ1)_Eg=mI0)1~QS!_#lhz*FE$${^ ze%_6lSX@0AA|Q>4uqR7?BniM=2$8`YgyV6a%h^h&g2uYoq92fN^&=0m-N4su~_A|>2pt|cbC^JHXxJp?z)`O0a8j)%!o4*=sJ zWF)k)d?-?hRS#pltTRO*rqMmarD>8<@LXY$9nf}09$W@dOw=gE(Ajr*b$8j1DCk_i zU564FhfZyfZ7*=n3w&>Zj@x2P$Rdl#U%=R!L=;1Srb~f>TFmK3fY2{4fag8P#VKH; z*Z3!Jk#2r5G!Mk6(YbKW43$I(8Zw-t!l-B7c_ybg~C94Pjkz+caO6QD}^3RSO!vXB~2 zfldI=ITX4UpsgxIdYUSvV_+{YLf9CAW2c22!GMfCrLV)-!M2W}%cMfz(GZoND1ncL zvdZF7pgA&ts*u|yr>0;ul>)Gkf#k&{<}f0@9~e*st@zOPN*iM*0+`3ecQnLuM2eNx zmH=L4cv!(VwP)Qlx8T3MUYrNi0?6l)_{0`zO>YEJ{B3tI|Qfn*7OaS z8${PaKCiWMs!qK-cJqQVmPQ&U1Z2BKGNi4>Al@2A74R=ZKh73>Fbw5<%U0C*3K{R%JP$wlqWxo@P8El~ZLAO98S`V+>1SunPr>4PiE< z5bT;}4%HVNb{FPw97zQ#0v!w-nyT~%qcS;okU$+oZxmx;zZ#l1p|MifR8DcC@ZHTW zm?r+~s=9)Pdn%^7j+)2B0;fTu$1dC!$oig-Q~LQtJB&-@NZlCm3aVQIhN|?;Sy%>p zgY1J2KNgBHp{N>QjwGqBzQ{>E->iXo^<90L75TL$8qF{cIV3n>T`pLZuFGX+D6IAM|bKwu7F$hyYp`}!haYwE5T%I6vR zKLng^Naz3+<2N}q=LGGvi>$<(o=l6ai~uCGx$$z8sA7v;fVsXno5Ji9*T|Gko&!G# zFLaoyYisEpsI0U0va`@)Jxm!<6#Kb<#bG9idUF{{F-}BJp2K0)l?V+R7NK?BiFgT!Fp0TOIBF^#n%!M?IRq(~{NhO8x#Pk^lG)Bd~xOP_hC z+K5-17+G#4#A5+o;NDOAoA&^(vW!Jn{A&pCVq^t~z2~L9}LhI1m>q>D>3IJ5fu+FhXGJ#6aT~0umyQ0^r17Y_N&! zuS}HC=O{96Y~6{NH_;}siO9HppiX^5**_*y1B%9yR2C!4)3RUyc(1#I!s*s~YmR&R zQ6Xqgesns8k!4cBQLM%Za4$Jb(^ZK$pzu9V4Pcuk)WY)Z>WK7NIA@*scCbc3ups&4 zzJgy;7j+&0G$0e>ip~@-2zt|5uox+g{@$BpL#JSKu)FPti=?u#$o?PC8Vw@ zwh7jT3WhS$8d^(&t}%s0IfW*2L^~2##bvbq$)h}kBmxQaWQoz|*!5tV#QsO=;avHf zSQ%w|2+GUnSF!1c4?yGX>j-&gX*1pGuehv<(4f-QKCQxX(HsUQ0Nc zM2l@O2Uq{qA1OHd-AC{Sct-aVGE0o~^)?_q=In;rIv6q68l-hIt)D%!wv%quFE?pM3D3c`Q$f*X}|MiEDO`bI^D2fMB8v zOeIO?c9-v6FkVaO7`1o*36QcyC5=B(N}?P#q7s@feOFrqWl@%LC`Zi{hqw*e z3>6WnJqiiN%a$rQ96(#SyC)-CaAa1Dnxh^k1tAYXL78&Y1ODoh!*6#R~O8#2+L1lfuQpiHdjo) zj@!R%g?TBdSbyrI>ah~1qe$|%nwv(Qu52ZCk20M?>wBw(tZP#SgDmu>JUuv)Np3wH z1jXg(h%0<&iodl{10!o#aH`vnL;~8>afYZ?oo`(GVms2=R`=tq=1oM@4d!Pivfr1; zNJyg6rTMziDds2b^so4HuAn%!89vlb~q zo7C9+G$&2zJGEHfE`56~x#|4VFpe3SmW@iBXbl6Fe+dbZ=D;Vzi)GSq!G*?;xqjQl9V;yVR<}=~$A+VOaP1L<*ac=3bzi-Nu~z!Y z@~E=YPkVlI90#tFWR@>g`ZRlK5qH#H#cE1bR$8TRWZB_V4GlH_pe!-&oVRV!TXx)@ zj7{OAG%I=WwCgs^v|iy;p^m}rX|QZUT(HfOn$DreJ%CvYDuQ~TZNT_$JKdn@*S&nv zEPa+cDN~~fS{tg?jFxTDuh6UvtmV^**Ne@}T&K!2v{#7t>{O$iuE>-vOZ&~9g;jl~ zZsO|i?mFnu!qDwam#r&N!ikY-)HwQNg5hKY6* zVog0k{BpIFRktRQhTFjNntl;iQbLC!xPmGY1U9T5RDxoP7hkG2gFk@-lX z2``DNd&CSmG#e8}#0Vx!**-H z*xlreK~>l4-;3?GuN*hj9Iuj~Vx!xEOa-1OgGUkrvXm9T~%U3ET}=YiLcPTmLE zJMX)CJFl(3gWmXeUTVGiPI|8WzDWId3s67fQ3IY)|HQw~OOw8=kp{gh3EiI3lD;if z2!A~M3^<+@e(UIaemDADJ}`RTPw#zC?fX3Y?SJ`z8T965^z|0>JSrS`ucsvRcv;qW z|H}(qTm!fmU`=S67_3+ru7awxOZq~%&*7f*=~N!6^Lz=Y4Loi>N{$y=6wRbBlF>uW@Bgey?|BT}tsm=VR}`8-ntp{89OCiFCej zUwvMEVAL|i`!1jBe)~R}JOnP|53?JxJDos0@4g-(=fkr{jbn~`4+TNg{k*DpIC z8H#6F!MDSlrIidO3aVm@^IVu!4F(Q#DH003hod3yGMJ`T0S|i|R>3oI-9``UBT$B7 z{&;pvxZndS4^?W`P&ueTps4L6W)qOMbQW{D&Q1BGb5o~Y3!70&a;apKQrQ6;pi)4M zJuR*i;)*rtp?n3rqo;EUxg)3h8GJ`gcUBTlzC5m+l>Z2I)>5`IPjLcWj@vm04y)j& ze5Pz!a1rc^H@U2Q73wOS0$U&eb)-TUkEzNG&HhC~|AmO)VI%dmrbefh#J(GQkGFfI zW^H9vdd{(^mQ13Q5A(2R!2D(kh?UNwOHt z;=I{WsEqdGDOGnzxScE0An&#+%r6W4pL-VpLsY(WPtbKh2%ks*TKDdzXc&pOM!p5i zq+lpX_=EnpWN0O{SBSjFg0~+Xs!nFEDnsJBux+;iJsFv`DQcZ+S!Fb3mf@>shi@08 z^Ry@#d09DngNLBe2ONRzKE({GuV>`gWIJaLfgi+ltQT=vq9%=G@=D)h`6v+>4LGr~ z7_eUI*Hr9-MwK~}ag)U|F<#QL7N-?9x@(;=Mj9+PU8gu=E#vmE8a6C=exQ%fAR02a zVG-X|<-DpXE}OHNT4yEeuO@iMjVOI@aA3Xc9${bGeW#D%wLNg?s$qRT&5&T*e*OEQ zQXuewl9$+AkG71@I7YB4pF_urG>tSm*qs1ZEwdO*Sy@fhAaC%9VHRzYNQ}uBv^I>z zgjkwcWFA%GOpR(-@MQ0V{yzD;V9F$>9hFoNT6_S$K29B1DVRAA%0K|V(;LJ6mg;n0 zc5Wm&KbltbKL-v){^wiX=MXZ2d&K>F&LW7+*S9q7pNGt6BzK95g`!>q*eGd#7WaD_U^&e6%eyXnOv3gV6ybgczqDF>b=TVRJA3yG`9X6Qa5 z0s>3;%Qqb->uzhhhTi3f_v2!zKb`?rKvNyv;ibW17Tzb5Y8^%fKY?=LQVrnajQ^nP z-M#%q&WSPx@e2Clo8tG{d(avC^1$bfTxV+_HL7?tI;_!-Kz?Vr)Py_`-p=SiN=1@*?d6T|3$E?Xu8{; z%TU+(VovQ+7tE)d8ImxT6wWqUCqLytFRbEj37i%!jjJQDRA&c$6jUoWvlAb*J9wwr z>q=wf<}hV;)mNsZqT5jg=Q}E12K2&GEYvtCRwOp93X zBzS+GaUKxP(D7CY%M$WnxOJA2V>fh`_7c&R&-8w7lRmK<`fy81;p%MO2rLd%({k%R zf6R2mwT!uA$$SxCm5hza8d3KA9%ESIq7zxog-EwX@u!6CO@#bC4s<%~=XNE-|G$7; zLf)I$t$!oCgdI!VSt2D0rnDG@iOK*OjY|~sbuX-d>1Mb;-qilNRrV#c^sv%Z^7kpl zSQT!_Pa~*Cy1fN4m&Kmz8}p_y(zWLBiaoPWGtxnFJ;)=Wo}rv#{I^{M&jt>=UR*c- z9U#Bg!USqT_EiCYFZW;D{wFN=Q47;dDAFZrO{?opbJ?xlw(9sRp1wC0Yj$Ci_b+SjDt_2pVbC09B9fpT*r{=oVP=fT|xmkTR+ zd6p#d2a7L5s&Vds)t(<3gFfHD7_m&*Q9B#-hEm!>JY)y^x(YY5E5ea}Vd2=4CxyW= zL)1nBv~MnKdcG}vB{(V-xKIAzgEzmG_Sd}{?{e<3NaOv9DJO=>p9{)oHcQ();GMqI zRm>+VHEy0$KVe%=K%f*GS3{DVo{kqE|LY&tK<8Ug`A10nsxXp}`q0_w!Iz8Wr3_(2PTRm+j_Y=aDxf$B6 zvw+8_95duPSp$lR+~^(eW1BuTFyb!K>~I$Py7CrAs|UZJNMUhe=&tkpHqk5aT=y;= zN0~bYN62zB@xDZZ_`DzJkzk3|02!zViT_8J;!9QZQ%mxO7eO$_bJ67v>#*TR)}tw{ z+TotFFdR6j0t~5hhz&gmWKx?EL$ir_a8K{$>_9!`9qq+YbSR z!mGjUgGXFu7M1>4C7v19h&X9NrzPHjIr*VX5_*T0B3&SWQX*XH&06aHCu1LZETx)6 zM378o&W3Sg^^h&6vwA-T&#ASTdZe{HP&OBp3LcNF<|R<6IOo?~eD zkv>r#9In?d{kA@Z(j~vI`8V2kk29QnJ_tPmCF~EZH4WAWmi<4B5XZbX?Ww+IMX>m~ z%lg8d3iraRI{k7P)`zQz=_G3bk&G_926ogFF6k4nsf5iUY9A$pwRI=wS1q-3=vhv; zFqp;LlPrCILoS58cEVT%n?5(STh#gDm-MF9rDZbw}a-|Zo z!3w6gfjy`pwBu}V^ohJ*10o{(41noBu=+#0i81T%eEFn;RyONxA;sXg9J%iFf@~wrIYcJGlP|M zQ!3ReSh1I`L{e$Z%Ht~T40+z)W?8EbM%6G5cYaIIf1-O3jdnwp!{zAoFY{;*I!0uS zEwVW~^-1xBb-%Uoy#987jQt}o;hzV!5E27HrA}ES5_ZspMetSrBeCY#mp2ak+e%U4 z@U47-cL)(@3B!}LWK2Im+bw)u^U<=T zQppoSy!W#6jB1KaKxwR0NYd@dZ8a-p7;9@o(?+6nI9of42_Qd97EiCLw#yeGKL)(- zU}gix9;|nI>sz6{mf^3#;A3u|$6L=C2imH+)^BdBuV|Po_9Vx?R5)O!)-!94@Kp3T zQfKDXR<~%lolCeIlplQ?V~<9lBEq^%a%hMV<}xJ2|IL}{E!CgtxrX1cz3}UpYDWSd zl=?bHK``P}<_LBEQ~sM(r;e%}lG~U^(Zt{rIBf_XNw+pZr}r z-cIn{ZU5lOQ4W*`4%Bs|TRf^ip8YPo=Di6>7-h2lnLiQ;V1_f%|3ZG}G3Ym!{{-Az zb^p;hc!YsML%e#qntquyJvZPV{Z>q1MbZ^Sjv(cgC*b+Z94}Gt+gwb6xtVs)6Y;y` z8AUTdQ|D&u^&vIksI%;Psgy#k7yU|dF@l0Z!1i^oaKN;l!;K}6DWHdw}` z>t=iuj;wGeymM(Ufi&wUUbf$t>pfD3NdJ=I9R)~g+!UAS0L>E8txHP>b@}PbFQ-uS zX%409aFTj(-EGa7ewMknlsub7r@N1qN{=IHsG-F!+%s=7HV_?gRFlRXzAq;tKz7jL zY1S%_r;65zupm98KQkxD#ne&^WC_m+kaEtFTIZo=orD~}K*n^4ufSB4(G$qI+f79oByl_Krc8wNIOGm#d3iHoD8U-DTUh zZFjlLwr$(Cxy!b-%Q*Es@0mF>G4Fp)L`KGyzw6^(J7UGU@66o%by?^bE}(-h44jzm z6JtqxmcTd$cyQbk`(Q%b7Cen>$1wptOS2az2_tyMm-%MxCa|=r-Rl%0COBPOB=L*E zql_as(~rru)qTsp`yl;XWG+tNwLjzUO~qhZ8)v-7l+q)W+N zLxU<`2ajF`dU2IlVSFWcov7K2Q#CG+wPX~iPguA}C-azIqEt(p0DYf16i3x5#>#QT zI#-lhEB1Yb{u1E^UEJ=|Ku01YnU;{t{IDlqeyte+3{Z$d+SCNDAdT&Jv4QP35fxV# zm))3#59Uz4Ue*wwpXEogrk1emnW9q(&Cx$^;21UcJ}No7Rv3Isp^z=WVaJ2xL6nx8kn=?Jhu7~ z6`B5MWw=pI4LetstjEXw4l*^ZcRRC=XIB6s~Lio-$yHT zFdSENy(>#a?YFZkt?|}Ei_~J{lc&#mPujv|5*#lvX-!_`66nl)`NbL4b&JUfBBTuh zA#mQ6U<@Xyw-);%mV+9BH-8qE$?iRxlPAkC0d|-xb5$N97chLC)VobG~JVaTnq1blChem zy?6f61bEia#!67vH&$9r$*}}7Z?Ok8JusbBe%m;lR}Yjv)g&a+8~r2b zfW#P`N%OJ*MWs}KGB(MnmJ<&IvJe@}#hYi`Z7g99By*eCq#~1$Jy;4faENP3?h3AD zI#5~{A3h78`pD$7K)=IxN2=FYXPT0(WjCt%_LMsGRJY9~~O2QA7FDj{zCm?+>knY5=qy4LW8_6;sLpR-y z&CcVh817W&uOaCyn{45CUVB_SCCs># zjRHX(`?^hS4AeT*huzkP1w+*Q)=2#)gy#PqaHfAm#nuyuBoF(QlSRB+s&u#hQu1j< z)UlG6-<++Bu~6277D?q=$xPdFI_%+0TV}bYlc>2%s}P@T%VW^-e5k87BPZ3boZQ)t zPC9jDCK}B$C)4?CS-k$0);!914hP$(=`Uqd{`)c5DJ#bb#O}FW4Fc2&IfgR!AO*9ipP~HomlzX8|!rZ{Y9qaD)2?1gy7GMpFU*Dq^K-_ zO-7J;PPo6-3ZnLku})G|A8m-x11Ra?co=0Us2!CC;iv}Ev<)z&C`PkxY6)c(L1I-GUO_&vfnH9u5v9?& zojtD~w5dHrQ~C7kK6%-scT4IU+#9;;EOn8nLMh^(^Svexb=Q=(8dYk^Lu0||uoS&?v&JY~%(swwnZZS4(YQIsB#~{P z;KCvLYr;F!tT*h0FfLM7l@7494JjtvfI?uX41y44WUuV!Hfb5Vt%u7GuZ3m#BzkbT z57^e>@r4Rnc>~x0iTAP%&p1voZ7`zga+zH4zUQt-v7UPrJFxHMo}imVAd|8^p2XWc z$k+Ja-J-!eM8DY2Zh5AEOX9n7jpT`CW9*La&Wa1|{iO@TGo&T5g5GVq*(60bIF2Yd ziaR?A$R(>BvC{T9S(XX^AkxpE>j%^29X0@ zbFmw{8Ru=cOS3`IER@~t?!(Hi-N$K_MLWbUwS5DNFH4O)T-B+T?0G}=Qu|FcIE8NR zoqWBra;~{NPcsw?mscMvkk`QaVTfygSTMSlZ#s4$9owLom!NLF|DbIMj2>9fZMjXz z13@`nhyzJErR%o+R_js#T0IZ^uLcT)Rn%N*r2jr4t*}0l)O8;#AXjH~7E5wuO0>c& z*aRf3op4Ukl85AK!5_$wKMK147!#Dk54vSf=t@{4JaED8Zek;ryMU(^TPIw%_I7Pp zee|^SZf=NvdZF3)K&Ob|KD&9pPgI*2%49xs{QJIdf_Y+6|F;xopCMI1>ODSO)=-iu z9k)DO%G4im*ja$WReh>ZipIX&i{IRkZn1`q=|GG*gsW{N+Es^nNTZ^f9F>Lvo3D+k zG!cgnCfhYn4{GqN3bj1%P#)&HO<8rh%?V@0=(+FRDh=X_QyETuXLkOy0+hbgN5A69 z?#RmBje6#QqXjD)!M7KXod2BQW)Q!<6AJS!)9-@g6t(!nD|~;+m#tdM24n7_RlaRE zII+6W^2M$B%h5XD4;)$mcxF#RJxk*cGDpZu%?H^OlrMfgwM$r;iNJkYfw+@Yoa)Tx zLW8EHhse#17Jh9=tpjmpWDrPlO@2CoYFaz()tY8KLzVtke1@G~+~ox$zgzp>hNGrS z+le!kQU39UD5?1NfcDe`x~%%`6-G}NMDNo-W3ot}m`|E-t1< z=IH>vE$%9K8QWG^-<$$mT*4ziCS1KFbIRGDUul7%rKS)co4DNY9EYKz-&ZAZqN-9n zkQpTCCml3MI#i_#WepF@#9e0gjhdmLvD#dk8AR$*yY`Np%}c{?m(Rqw>UP=joqQSm zo}^OpLe*HwsMt--M}&HQ`mi*T=f9$M*WorWVPIAMsQmVGW(%_I1T}0Pmw1p8vcjO} zKPP-WG%ywWFl9J3b6MkTL2cqO3b^`2AXZ-QF9pshgk2a+!<&$EJ%_s}83sbWnp`_- zo1i9}3Hp>Ia}Hm{Ubzi7(jP`i(_Cek*6y>nok2&fF2dHGuFk+2lX3wDphiZziNQQl1MHzscP>ONU=HK?3wGX+8u2=(W}`WsG^M6 zY!kK7NXDky16HJe_45tP0^C}ZZ|YVF+2fKP@>T9S&{dwQ<3Ivw3{=Xt8&nI2fCD+C7FrM zj@!$rp{P)ARK)I;<&^#vaFX`)D6+fY@FqI;JK-Nu>Ow_|QX>h%RAjLt@Hh&;|0Kai z6ZjcPkZ)qSgQUTJ@i;e>CX+GwtFO0r)#)aDaVJIw-r#qokW(c6TJ>$SCPQ}_GT zQTag^dQ3cR(GpwsT|gqv*L6f&B3SlnnyL+fcwLy&R#j!5Mp%z9#BV3@2;#NVDJnV(w z)+lneqZnwz&ry!A2F&e(%oQ;ls{)>ySk`4RoP~UN);UNV^MJ^PUXfKjBJ2OcRt5is zvyF+2pjN$1&hGv^aTD?){+$Nf{SOjs;0WaAnK~q=SJ6hC4G@27gFDj~Q_mJzd<-k2X%)#u% zKwRq9uObQ>qbtQ!+k%3v9k|$>1JOrtw;{KKUA?X^KJD;bz@9X5SZ?yU_x%$MCB@bn~bLrV+;KO8APH=}*6V z1{%LTgq#)#s_M7F|6V47gi-z3l_+aAnv&zqq(QEPGn}d574uVNHG?WebVZ8O#f&w&y0D+(33IWW#=VGtv(aq-b)Pj0@X9ifTQ=PBp-)5Q$|)Q?`uNWhv(MX)zzP zQB*}}NrZJt6PcKQTNZW^9I$mkRgR_V^9H@LQmI!10y=$*jKYqK;k(AqP0JFU9PACz z)68c(I(8cCc2c=)cy%(G@5&Gbx=w#L>JrG)%?;X)f0P*;Mke%KFuN}CDQYxkDO@=Em zGPNnWL?g6^Lqp)XHFDS-c7tf1O9(V|71~35EN-%fEK|MrmCb0T6l>RS8QR*NKALr% z5$4j1C9Pgjx$g4GMvH~taFi~+VSQoGO9FUh4b&?6s8+=oG_qUYt|BZWiy=AG!hFDH zY~f~XzrDcocY_?WeS3$@+4^>m^XDJ_|3Q%^$KI1GtiGwCmM5!r&}dfre4m%_ZkA1r zk;M2)*hZKD2$(zZey7G9)J4Zu{}_V#)3s|)x~|8={K?oCj`G*O-6!e70{M~y>t=_8 z-JORdEbEhjpGR8739G{>omYFsrRLE7BNEwjy867H7xo*3ONO{lY^_~W{@GFS_fSjc z2*;9Mm&D#;vdaTa5f*ZC4Fk5Yn9a(;#Yej>{#&-1Rk+g)n$v4Z14r89KCNxk;w}}+ z2wS+Q$!Uh5&i%$jP~~A+E7#E;vI>t1>9dp`@U=mOxim2lI=39l-I*&;;_M&oOJL&6 zE$|xaOSayT6DH^9SNM46%`R-1BQJz3Zh{uy07E1lJ4rup5z<9B&McURG;g21l(tA1 z;VxXb=i!?d@7zr~c1M1&uWH{KI#tkO;H(XC?iXVSM)kMEPwZs}{^B|u5~?5k|{ zU9ZT?(PU#;Ckg0@!we)2ZoE*@q~(#mY2+K3C6hG>nS=VuG_P4XRAAGz5NXSK%6sj= zN0DA^hZ&}GQ01;lEDrl7&z6M8J#ppaW-x~-`78TUA z-jbX{(zo>iKR^riUY-35g2)wQN3_S!RX<*lCNGNsXfxcmd-kUj`|J6=?c(8H+30|5 zd?-F11Rsz8&4Bv1c0(6+*s!`8JLyId$a`p!JSvRdxr30R0(Bq(x-o3Px~{dzty3Z;Dt@7{c=O;)cH z+(AxUFj~a^yj^%QZ8sA2rA^-w=p4QtF0~XO`|G1p(v>#w)=@yAdYH^S%o2{OMX?xeV*2z{1x7B$(Qtug-mUZNk$}x-7d3xa z$Q$&wE{yvJ$1h;KfnN2Km1xS*0=;e6!UO6%*#up?Y*Gd%Rg zDb)@~7Lk4YV%K;WMnA;OO2+)wkRA6kSDu0bH}e}}WKOSy1K3{cgazvmNO&8o5_chS zNS*Ody*_#Cpj$uMoQfh7(QUxutb)ehP~t6cXa>Uik04$?_}K5*w-}vIz*?M|J-gDw zVdEigkPw>n*VhLDc9fHQ6FhrmLV+j`3szDO%>t>IY|vVK`PiJIRi)Qnl@ZssZ&KGKm7{v{hc-1ZE7$5xX5>C9UdRdh@{X{uX|TpAA6rhG&Z z$1tXzd$%f zXOnhhgv;CQhk#$*BmJIrD_>2`W;o8M>my$3HSWUO;Fj}#r7E83EYA9OHpAsuFN~Aq zy-UZ*pwivGX*b4(9_#B8bn0PVGX$}2EUr0+vQ4)i4?$+a=wYr$l4BEtkF*={X4%`N zL~9)QkfGvdxah~xp1Q+){Z~*g7<0`mkss6!#w}5I>0E74{VpCnLzf;S!qtunGR+$w zQmI{FyJ`~Fq*NG}SvD^5r$wcswHm^`)hTA4P{4f~#jvZDA-VO;#351uD$dYuWLnc) zWg{EJ&6AiytyKRFz4&PISXr=n`1pl^Iqvu1>?j_-{_K2wp%A-ERH5Y+m*7b=_Z&mZ ze**8{{9pRN%V2n#Um{K53kTQag4_o>%}p$_{x&LGX}iMn1}`2 zeyH3r{!j|n{4ie_48)D_8{Oo>h{T2#D;Wn=@*)59{}w+&wJ$?%2@^tcxM2?L$-Q~f z!FbXo2RYmT*)u7V9=~q;J}Ha}YxhO68L#mJGA=7HN9o= z17XX{9kyje@^Col?;6HdkHQ%EDe3x8s(+oz7em8li!u>694-fz5fllkuL{mWT(VvD z$M1iBFMw@}V;ki=vHA+Ngl3JI_>43q z7liw)l}IJAy=KM1=>j1amrDXx9ti6u9ky917Or8b2gQVEf6RRz_#-bhm~dFsSm85C zao7oJAe;SkCBA*nAX$R_y6lU=Q&+yVY5TY1JR&0Hh%B9L??BLljrufr7-lj4)Dpw1 z>pJYW62n!?{U3z32b7pA)zQxY$bBw1rdf%{0mLQ}l)Up?r>5-_KRD<@L}7Pp(adb} z$VukkYvGGn!Bv6Qi?NOf2PX{O+DT~AIsL$UDD^|d5LGC=ssIFlz(45A<2<&*b8120)FS9o ztP#ryO7rkGeb4lV?+v(k3wH5C!R+{x5QO3Fv&FqzhHX^fuxOt=zSoW*UB!`M9rW9K ze5uo71eJ%y93AJJRli(p09Gvzu>$Y=0O$WYmxlF z80=r6_*#w~0I&Yu^82D1Y5!%95b!A<0iP~1m6hYLbVR(~i*R;dj9@Yv2lw$JRr!|3 zU&>mP_&qi$u}STo#aqin4WB825SnOmGLb^O>8B$=!@ffC5wB8L9e}K^jr`VkXS05H zcy?sePk^+S86JMoy52&$aJrYS)t_6gU-CPplV_44CUjG}6KY|Hm(jyGJ#7?|`8uLE zxPTcm`14cS(_bunOcBQf$NH!h>%1poYf?W==Ij3_bhN$>p5G3~$^{Tsy!i+^9y&hd z!*J70#tHc}qg*5UI^4>Caz4hbizbwORalYzb56$pfI|5CJ?0&J#0S)f52P;p+y90K z{`EtZ9#HyYJzE$BT)5*eW=szdaLCq{z}h3%L|&$ra2TJd4aa3Z zkF37e8RYgCUq$59JnBCAyb0uV`O%V0S+*R$ebzmY$|V&lryjpgb5GxKJg&QE?aJ62 zMvY)P{2k%29GfVs7)^tUE6dCI1|c8w+m4?C+}n%~LReE%7^w{6qEOqVk-0pnNj9r! zwHm~^RQ95&eNiXw=7Hl#CRVunaj8z_28E1>=(EN2^L6X))b?SJ8}P~EFTSym7Am^Y+M`V&TyWAMF1 z4fH=rQYC5-G|8Jz3HtCMmh_Vrbf496*8*vK8TxO=M{(}QyBp=`epLSF%PygFHHkKk zXCLh^K52d5jk1K6$5_w-#PerneJgPAd38EGie~x$Cs*P-c2y%K+2S&VmW<_dBX%V%3^z z1*S14*evoP>%Q8?!3=5ILZ#FSi+kSS*F;c4IBkBh!i5^7*xt0x8Sy**v6%OHESw;C zo;@=y{NqPm?kqly9Xj2$L2i#ZCDJOM^1T#t_)&#$ee8gLh0(<~XCO6|G23INl)h^Z z9ZLs-YQK(kz(07W?bT$z>B`}h!6Dz;P{*I*9N>5WunhCnR5E6NKbR{0__F&0gmws5- z08Z23w0_vU2@YUmpI)xXbLNv{T*xQZJB$lsW5SDA;P#PB!7R?7cnoC^=`x;t)Ayka z7VS&oxiUTs$1I_nm+SSQBOBAIGpbOO={5TAl{SNb^o96*U3qkTuzD%mgNQ7DOs$@? z1L5C(dqx~x_;5d_^~&bCY>Y~&v6n3n<7K%=u|LdjPprh!Evlj!GN(!uXrECxCIIM0 zaC?h?O*ZIy)4dQVjNyq*U;R*mqtPt z6Y-Uch2h`z*t%~wb6;!XKYe|hPJ;3o2kSoY+q(T9*r)Fw-)qA5xwWmigR#76eA?4~ zirImyoHS#WI%u}T$$CAfTJ)kLW86PwqY#&<9!EUBYq%X)>ST3tTVTx>lhkWj; zxBDMd$8AR!S!m+^O)Tn%c%6UHu{<6xnM`FnNcQ3vHu#E>F+UeP#U$uZVO=ZltlE@I zUyyiZk-Vz21-o%o)kts5s+dj)cr~oKV4d)V4^y^f2eo6vk?higd}y6E24_u%6_Ojg zs!V2>*U%X$&WUE4+=^QmYP4w(--du!L(50 z({63(Rdk1A+3nbx{Pe3b>`vlDdWOZR$4`K7A;7WYW8Ic!-S)BSd0+nXS_|@M2zEIP zxgPyLJRd8mf9ptd*NcWY3Z|;xe5_IPF^)*{C5R5#;e4QB3|pi4pQUV2&dJvRpiir} zm%V#7(#jhCb|1;ghFANd0oJI(#ua@TcjT4JHUU%MqMJdx;)w#I=uM@6~MpnALFq+C%6^eU0V2;?v6`*5r+hWi<2ACqPL24{}L_O~6X(yJaF@U=Tn z-QdrB!=T^&YjM>iGDtkdp~tN+)yM7%0$f{zYyxs)6Y5p7cLi8+_`@NjXw9?P^K5b1 zqZ^n<<3yQyn(=v$gP4RY3}`5SlK=j_5>Vzsq@@Qbk{5wRGB6Jw6ytItrpjS^=)QXP zoRbt59Ta=6#0b_z>@LRatOk9oh)7cSm8Y0Lz0Gr%B2;}mUc4J-yE~wREy-% z3`{z%6bVYa#m2;r#!nQz{lR&s`YB;Dq|clLL^UA_z|yFysnK8C_q`1a`bi06Ip)*@ zeb9CKDz0#a+lS7AnlX4%PD}&aRSogYcV+q}P;mGb>Q+GqSBQY$RS{9DZH?A*(~NJ? zz=XLQ2YaB>ao_tbf-mGdtq&^Q$hUl-*%%LdWcZrV*kaAa^XJ zv407CPvMQQnVxxz%SpecpO)38>crA>QhZH((1Z=e zZwG_n$Q38bjx}7Pwp4Nolk5Mespy?&!IF0pk1qatL0Xu8Ic-l(v9kaf)blKhVNc71 zdF>VSh-+w+Bsl3Z7wP*lzv!#S5vu3xKbtlAO48h}_M3dK45aJkGUyeqI2Vz1^Te;! zTHF$sCIKLu7lQy8gZllkC5JgIN|-?LdCh|v{H|z0|~HRs>tMEAkPnWg9Ga|!Vs2cz}%@6)LshU?p;gJF}>AT zg|V0nkPb3Asd3WS&G417)Idi~N~5{W^_xc(FtGYVpV8z19z!#~HjgHsUl6R{(lQUY z(g-yA=}!t7(iMIE5ZXq!W--EP~jI zFLh#k4@BX{e*C-jrfCK8s%F6#hjdHbOdNn8D-b=BBWg55#CVK^b^jO6LkN=R*Z+cV zh5qsPiO1~f;?;g#m_v3%;z6jg=g}T>EXVIh45^GF(UZe!LR+Wjlgmt1Z`OCD(`2^o z{nR*g?>wcY)gfd6C3v6=zlyoI)D${!Zw_luUTf?$?Dpw$M6bW7m~h_DX?1=%O?|M- z-Yw-LSywdYc6q_(Za?~sc|KQep8 zbto9rO-{HlE*nKH>|hRJt`=e^?el6UkeLs0(8!F0)FI^i;#De};z}`QF`-T$Ye_%M z%HlkjPP;O&3m*)S`O?~0cV^fKsaO<9D>snfj>w&PrvjrA)G-dT7%gF*%{Y41s)>Wf?dfC! z!x`XBBO6)Ym?~PAM_&iy2IRp-W^5UZ0hJLlMx5;Z5J3NJbjs8;fzqhYbjUs-|HO_C zQbNkKQmYYOnDd80>l$0svcDeeLt(Ygh!+w|R|H6V_}^LnEI2D_yx$lKF%J*vV{b zR8jBTA4U8}79qZYnS(6!koi@c@#Gi+3x@_e^}Pb(l)0gy2SPpWDDiis3bAuly&A#J zFiXa2(Y+oZOW`%VkZ1EXyohIuW}Ce{H?-2rg&Zq|-`kn>lS$9#0=3g>BvD+<`~Kno z3uFKY>BoFn%J-0W!LD7OH1E(_^=mH&x7WbC>f>DYv91SMx4^F1VKn_ugQxZ1dawOQ zBKxJNBIU#GuOw(AtnhAh#j{$a{sc3(-wHv<&rJ;sk-~%a_J&nSw#f8=NweEnkAQ7eAly(TZdyF$J4W`?>>M)8@fTE7|=}mO>e`UeM6JWpcFw`B;um~Qjx`fl{SfsS>PI-jp z0u9vd-3x9D$#43IGVZ5z$CiR6BZGPmM++luQ8@Ob$tVgv9H@TGs9KNTZh*cG*)$Sv z?_5#ZIM?eNW(`@Y1GEOknzgI}HDe-Ny0>$-`Qlgl!FsEa{@_=o_&#`RL#&DtWr#jX z)>g5iz~B`b=Fvi=EhGZ+9$8Jb=&h6m3%uTh^rhoTG|Q;^5AmMXy5K)Bp)I_i*N<6- zUk4?L6fMD>ooDYJjmGt?gNB&7&$gXQ7Cp*ucP2l(`;b6HsE%%5XH zt8=FVb)t+MY?R9$?$a%OMAVS9!kQvI*PR4WCA&*U@hTI19vbdQvJS%VL zPc5@!r>n~!{J~lr(lxsC%i55=J0^*F_};0PGer3u-Lj@kxqrPzPeO##|8PjG%HeX# z!(H`zciUh+Z+M7zGk-T9Rlu`%S5?{bf%Aq)cWL{elR%6aom=$p@UTLv2p>BTZtR-M zbd8}iz2|f;5tim^1MGA43fHFbll!@0EaEu4_b`CwUiWtF!kEZXaiGEI4bk9Ff)9`v zPb(UdKNTxdnbF>yHs|w+0&@;`36lHYc%Vok;jpADdv+=tEpEPr2Z}j5Y8kA&RC{w- zdy))SehLgRMjc%I#!>IczlQi4$%B}64uCp)7ijF3$BG>p^tv;|q)XHBw&#-5Fm+{^ zppdZGM!hYrtT9~p$xpi9^9$vx>sY+p+q$NCysiQO(s%>8fSFV$~eu^T#v&tSOb)U<+$1M7d9HAH1qN!DJS(36aiB1p;BMj?f`+&Et&=`24o ze+K<+xTsKa=tBPMH{ZlwT77A864_M6v6%+@w0j#Pz<|xaOv2;X;!%YwEP)z|6+?LEDnIe!M=^&B+!e__LORV+iXs-1vwz zGA6)1ouAH`;xHa7q}7LCKc~s*OFYAoeH&S-Ts6VjYRGkR#37*XRp{U)Z1%mb&n<7} z#{$brMFmVT@rnzeb#uu_9THdv&R}RwykF|M=364%)6rnbI@Bs(rQi&)|0~7Wz@zKp?N#W|Ou0tnB z4%JRdf;BS@jrodhPvF>UYQP1TYg6gl%bhGd!%kmqz0X0r`^ef%#y(5`s!xVS-r&MGmFbsA5tw>DC|4KOZ4*9 zH$e0@{DG1KY}*Z&EQ^bihT-MX5u#HUvl~9110~omr0b}jmd9TI3stZ1@4lOzR;qwz z4O3NFujf&Prl;jX5 z6>uQFI>n{7g{w{-JD(m-F)7&p-E@Eia+r3&^oi{l?fg@sQQ=78@ee#QRykdO@LKpZ zEhwx6|D4H^SYWI`WN*u%^Qe5FsP`0vRFpzr9!8YEzddx3!@Y+ud%=oykY4X^QwrtA z3oB^`2pRwOQMs3>-*Z}|lk-|XFW?@a`sa_TeO|d9#w|S_Fs4%T6U|_BLm1_DySJ-k8lRlO(olw@o~4>y@q90 zlGnj>^ai+t+25~b(1YSfOfr=yV}m}y-oLqshDGa#M)!Y;9`wsMtM2a8_zUxf;A0c8 z^8h9@uKhW9fcZ8K8Sqkp11Y4_l4bhNcbA7$ai^_i+{;g=g6+eaIwm_$e{xBNIlWIN zPHR#0E1T8LowEDR6(y-Pm9!)IMMn+@9aDX!~tkFGY}WPycY`P)s!+eH81qu;d!+mYG=j=m`0RQ+nc!esgOfR-=!T6K$VQZuO$^{e(u zl$|}qW5$88M{{_}ZtH0$GTbV*({phVClyA2hRQRDaA+-(lae=78$`1l>t_J~89bk@ zX53SOz!yB9R3KEA{?atekvFnhR>zCi!$5QEsLm^8s`wQyTmSoz`99~N9*AXYl4ry& z{k;YMSe?`iEQh>cidhIS9q~K^g|n|;dLwDTa956VK6$&-_vO0#7tSlwcEG_%d1Vp$ z?wxMRxQy`h_dbIOSmo^?%In`~Zn-cWa?-+o%MklL@RwfoI>FBrYj|PL(9{fdN6CReu2Q)z`}B+) zrO!9>0RRvXk)nCB40dsDfzT{6_@Ztj-$P=0e(nbfif#WuW)B4SkL&qKYzO@v_c!Q2 z#=jD|k@ia(31$7QlArZfYM21kR?ne=bu#v=qMk{FXshE_ML!<<7jotP!}q2l$nU3y zhSX7y!);cmZyiO01f<=+=Hv2yLUv* z%?+RZ=3L!s#J8`~*yHsT+Wgpxn?n}q(ys2K6pN118C}nagNPVGth%wG!O{w*TO^H7 z5?Ub-*)xC|y8hvACSWpM@q=PJLlBki_Clt6MP$nAEB}S}Q{+E6=Ydzwlc1y%abXk6 z;tH(s(eGa~=iwvpAMu_N{-{4}$Yw%QHk&=&fxgqzk--UjRYQ<1wBX_XJmeN;LiABS zgj8*?guycWIM3R2lhAGteD*q6p;7o5X>zy=kkBY1Y+H;Y66Zcv_r;p^@nfA3V=4)2 z(nO1-C3{tuh*8cY>{Y)O&X-#fn!x!k1v_s1N&}b(26>?CsIvA{(EI*1It48j1}y+~ ze$eu=Gu75hcZqJZ+k5nuu~DPB!5whQz&c%$tMX9tSWkjrjn~e!;c*zc92JM~iSCWR zU!F7;0DLkX4ICmbMN+n*piFC4Oqy zx3%ZMMhO~QyVPNXPICFy7#;>hfXYmABzNf z$cD(RWpAHE=J=~QAg?N>L^J$|ttg@2SBRj;2Ye#$r`GGRPSnr2;gtek7jT{^whr7i zMWo0mut*m_PnT#HzG#{&dm$%>QK0&Vds<3%jt?F~W5}_#xiZtfNj51~Y|@KKZg>wl zf;2^^ch>lwCE4Yx8L#(*E<$F^gjt72@BodB6+@wxhwAoao!EUE@~K0v1)C6`mB*P? z?edS63)lwdyXx*rp0_ub{FJ15P5~sD#v;415>0L4iFR(9+Wg4=Zqe-CyfOi%!&cW$ zTvfg3(x+*W>M+8fy3zx+RS^s6zl_M`rFz`Szr)NerN*5|vnGk{SZmjT%x#4lupez~ zvhyn!UI2efcC4-GkMVR$c^=p(HX+74?NMXkqlX$4P{(&RYi z%eb(-gTI3Shbr7$V|sUVN#9)egtCn4_>uQ`QGdo(&U4>a|69;0XXf?hR?b#GFP34& zMd1fys8Z(Nz7e*(lh&KajbNO1p4QqmJHzIkAsaC5rmx)pFNJ4w!Ld1KU0=3t`5*Q$ zqk}=H=s8e%VNp2kkmzJ)HttPgj`6u zK0nG0M;y1`$gZe90-=Sr)r$1cU+5h&DV3(_wtPt!C@n_aV8 z+AL93+fci1><-?B{vr>8BVJC=%IeF0_)&8`U`D+pfGNL-lNt!zAo;Q!j z&9$!mTo?XK@dLR*GX50UnQHVH(NUv($)oAc-&EqN1Jr+8z=*jum_YKR0Pzi=s%ZZD zkVt7p*ZCu{Lk7hnUed5qxIg?>9Vxkfz+ zv)&Nrx%Fa}icX-jR7U(RwzMOeOv6fj7nNF6f1c{a>C?^kyZf&jYwzp%WK(LjM_VfsUDxx$N0nJ`8^rz+aa92@t&$N zxSc53eQ1Jc>4-LA41M8dqOdY3H&b%m;4wqne8EJ=0g$C@P z-TSpk7b%iEA@|n~wD&a0Hn;ekT@3|R zCm4->wgd&C_LIGc8*8iqLPTU%p)@}T-Sc4Qhp?cUO%v6MWAeH`1}nTMdTqEVV2YZq zpwfV-Sb~ndEO!3gz{6kqM&}-_B8xM%jiycjayu-7A{}b%kSt*m%=nIfgX)wE)#D9Ia%wgyn}joeOY@z{f%hXPzj_4MFhC|VfR@T0zOa1~Vb^B# zAy1@77Ewb-2wLoy&fKTK44*a=C7&o!2Hkm6(nIHvqRjJ*X{CEd0x_!U|dPT}tE?iB9s?(XhTK;iE0?!Iw% z*|@uJ+})}<=k)7wZ@+g(_sBVB#*D}xkeO?(h>t~G^DeP}u%bEZ+FfUsn%6dw z5T~l19bXjieb*RKat@^2tiG&(imV!ECeE4gQkucbh)`q1B`brZm#x@R+i4we65U?+bskz)jWBxYCLioHFS2prcxA79d})K3C{70pGhN=yJ>kIc zf7PI({&=svl&=B+dg2gSL}#Mkcc=4(&$|e*F6H?m`BAa{k^Xs72SL%m$`wz>`Tt$T zD>U5*`qK5GPJCR4XLX>5v7BYY=`Y~Aa>sq{iTBuv;H?+RS3B_EXucHA1rK652yTuO z-{_peRR}HA#;$muu8(2bSD!Z>OG{Kwc`-V&=|t+1W3E%>=2_l{*>{yjxPEGI}n z=eKKlqKRhBZ=l1MDL8uM_=zY-G}WGe5<}Dufh-N**u1<4*YFYbG^nb?V8~_i%-F03 zjyl-0Y;X1-yfyle;LcdZWYH9))$g*uDPglF_RtZ)4xa0sAw5fHXw}a<7dRMWQK+v> znNTp8t`z_1*1C<$WfUU0EjfXQM=un0Oc?}6>faZ!&w6U#UErXc(JI3Q1@=XdX&a3c zO9vyO-TOxOIW+?V`bMMjEweD-H(#<=48PZXbI0AIf^&71iuVv6Woby*arWDD`16U~ z!Q)DIdQd%h=w5%Q`i)wx_qO8q7nrC7YbXUnX$MPDhor6jp`nLX*GX;Qsrn_${CiF& z6`PG<`P0WL+?qP*Xm;|^=9WWJ*q-3Xcc*~WXgN8{Q4khmYpQ@UlglA8qkneGf-qg# zaKk6o;_Xu(y}>uHkc2YtOxMxH`n@B|fSN7C05&0kei_}4Vg&>#MWUkkNY}l2`Lea$ z^@pM0t3fptL|VQCuAu3MAj;18QM@H1tLmXc z?^&Ny7!2`NFI$y#*_Nyo)dPpqjuuxH6jg{yqqy|L!N#FRN;}JYb3AhGp3V67j zC81;`v!IM9u49_bnpixprKsG0fc5tru65MB zUE{{2B@DJ;zJ@yj`ZvuCGm$dM=cReDmdcH@!u0Ir2aq) zfcoUU%PmGfjO+A%KM+^N_Pw%JO%HgXEpZ~=O?NZd!%eACV|yp%MM~}O?aedMzwv6_ z;F87}#_Sg>dqjkD7RIKKYA92tSX$#fj=f%gQq=Hye0lx#yiv&AFU6HyNhS0pYs+st z<}2&sZM=M3(dJHR0=M?YEiNVs>*&WrOcJL$LSOFp&G7iV-VZh@80_q}|CY!46Dx1z zlf|<~B=4$CowC7ZTE}iR`_bO|g!?i}naA1H!Z{bycV_K9KE)DX&BGvxr8hIb(g9!n zrc`MD()o%!Wc*G!9qR|1JyKI5(u)4tO3Wq&SHVHtnyEQ`JL}Zn3VzU8WvVNz@31)u z5?ZgJ%4mr?gta5T@YJJQcg04-F%jPbhX@_1i#2vH%8Bv%Y{LSa3*f9XVpCEK<(H_S z63M@p-<5alXXXd}vlY#?-^o1S%OfB=>Pzp+!MpvoRz;IqGAU`+#dzt(skMTVee4b`p$*@U zm_#X_U$v1wN%i5%w71W~AkD?_?Z^w}m6V)N5(aQ>p(HiM(x5gHA9z%CIgPU=&0&Oq zVIN}ct zqsHPYF=dD{=??Pabs}f9ul1?6Ag|bQgCgNGr@{+dmg=0u9YCXU^IKEry_QjVm#xjX zsQ&itTD9(Uq$7j56VRw^zr4|nHI%FPC0>KU2WB=a6@zNLjkvu&CNj_8+qm@r#YO>Z zfs<`A=VfWPCvQi!F3C1-^6iOfLE50?U9wAlkjMjn)*PH}etr8pKA!)o+uHRBX{0nwwsJ^q~uB4biLv405Tu(y7@2r{5 zwmh+a%WAE)@XdzH)zIAY>A=9-xxPT7I=ZiISjh{_j+bh^@u-*cs2y0JV~($H3?}!j zG}5o3*JO19V{5yml6FLb#8cI%0irlEN<%@8KFm^Ce?k7V60gyNQOWbJApiMTIm4VV z$=^!9WH;xh+AIs#Ix*&CRZg{wXG~pkQ|d__Gl}KI>sWxF%pR-t#`?3g28K6LO)K+= zhSNYRx?>u%nTOB*<8m8u!n2Wx+#PF=9RU`tql-_Nt)Ync{QTkH8J^kqoiV^UY)0)9 zzZT!M?H|rAmlK!D?Qw_0O`h6RTAG;-^mz?$?@G4uawWk7fnpQ*zbF(u8O<#!ar4EB zs`k9+F>(0@it3R1lQ46owAjL!6r;QhI-_-*k}wd0jUsSu|6Enz`(bzd-h{ep$6BXW ztTRG-5@-gUZ8UHB_ZW?iPYVRk`y$~!jK~|SeSGSx3;U)@uTSGn zTu61HNIz=(X!CJ;>w`?%-1ln4KU;!QYzlk@XPy8_*bJvJTp9zY{g(oh#}TS3Q*2et zL(Bk&J9#xcMadSxc)RVP2GKD7U!HUD75N~&i~jYE^>7c?z-kxcZntEt=O7%6{!ZM& zhE1MaRcUI%VZ-Tq5Z>E_^Gc+1UTGwYfOp2F#6PGznZwnTd_<=dqV4-yri}XJNw2^1 za+q#q)r4}IDs|baw2rwk<(k`i8(Gl@B;r%fQnebEs5y7D_0&tSxE8 z2>V3?0JRe?GG)5t*zluIv&yY0RGKzip+K*ag+2JD>?4na#WZSV1k6B4z5Ta6t0iDq zfsg|fMwwl91UYj=grkgFSDpQ z{jL{|V}jY~qN(B>53U;1^eD%x?#B?|^mw#qQVKV-cA}&3*(QVUoI*X`!>2TBEGC$3(kcU?s9&zc60j^6`hqxEAsau)i%$JtRAi zH>F70q?qsw))*CWpXYsty=SA%m{^hj5SzQ=#WhEQ9*2V=i?9Tt@DM_~{jxKHKKOm& zZ1C0Xxaz>2zCbU+XaHUu_`hX@^WV5D-~J^y7O@2G+LJxXz)n>_nlA=6TJ>o*?^J0y zsL^p&qGzf8SDO6aI?&3lJ&z_aYEWm(?I#cf4H6#%s$Vk{)cRh3?g|O$`|hpzvetSs z$M4$6>S=Cj+bvG>@P?NM*>x>x+qk(;ee{8ElT@~i_a~QL)$aHKijTl+pLT2+cpKXs z;s#c=+H|PceC||u*KgeGFzRDV=zq(|o5hIpPn~f7h=Y)#AS`a=B4H?%>)+1BxBe}3 zg?_&8Id497+vYmQ!bj5;@yV(Ry%K4CP@(-g=vTb)@8 z2Z()(Fbb=%Y+?IUXnu2X25ee27(>~)d32+4DX7*0Y?tsXzoqs;J!Mtxk z_}PK|H`=-XU%Hu+Axra6;qa%))gZMzlrKfk$I6P1*N&J~;K;Mn=~f%A7nlX>BIhAY z`%4td(aq*wcxIB7i0`{3$dq(OO!1ia^ig0uxN$B!t=#YC7f*RSlwbocF;>J8SD(=e zazJHLU^uUkX_OG9ZJHU&hLA)Q+#joE3~tqBC(BqRY{c%D^m_#+_qsPZ1x$JuC?U{e zBE?pbb~N3Oj;7bd%2z=?gPiEK2)aSpy@p)ms|GraRm(>(7AaFTSuQw8(p+h0i=TyJ(Uk5A}F zp~LPN5m+Ej3n{B8_(cN@`H5`?@0(g#hhKT7#pl7@+C&w5K;Zqm0z_J3NQV}*hT*N3 zFIN||HityC)u5s!J)wntU+#N1J&XPr3S(9FL&;U95PhbMEngAVVgU@h`L`Hd-v0n; zZl1-m%U+1nOH4+Feuyh@nCm(xTN;5}Im5)YC}-5h9??Z&zk%@P1A`YwzP}DZipJrt z7Nwm}y_n_q-x1$l{-B{T!S^25j0vme7bPE&kwzuK0rhd&;1Ad2wT4*jz4P(*Q-`{{4>?8GpM;J z)qzvC68Kuvy;=q=qFlnnfSo2*zR}-D251Qi%~KC;kD0K=7+Y{}-*OM>0Uk*(UIDs? zX>bBs#V&g`>^*hrlQTrNn|AEgM+4{ujBg*7IRsg|Gb1!LNzNYyd)98=A8o2~^F>he zo6h{YjOPzBSQL^7W3+Cy^u(tbn2R2zpYZJwACaxfMog}t)(jH7NM83Sw}H;7qw48m zqBCd9(PK|Ph+it|e0{6Tpu%Ki!-X~?#-B}@Wkj{iu6nboS`y~3)&tQ`S52;>B`KB3 zawSJk?v|Pb7c_t|oEK==j0`;2IyAwXcfsa#8amq^?UamDAcL6%+yGZw3p6Y7z+Yhk z+B3tb{O2nN#JAmr!tz>j$Fvc{&7ZD%8y+_MN{bGz^5=BaG=hWi7*!34b2(OnlIm zC$fiE=Tg^nUR@A;SvDUE&35nEQHTYEklp(EPAzThgr|IP=!f zKmP6$bcU>>*D?o~VoU@3^eb1@(DSqppAAfjM2Z&G|+w7X?UbP1$@S-*-$I*o~+OO~Z9M zCl*Et!C%3IIhQ^@yub7txV%;ol`Ea7$#wNkhrF!X50|;#hZBax9P5O~2olmz@M#st z7u`xhrbQvjs$h8l9FPP$Z6fX3wbPGLphpB1hY(8G)vxX{X3VJ(Gl!aHqZq zOlQ}wTB=$vAVosA_xwuY2D6h?t{q`5xPbVF&` zBd%Pr8>G3z5Obzt=Ew(kE~$SNcqS1va*EE|v4JMRb#|SUH~N~=eIPNQ#%|F9AC9r+ zTKeG{E*OTCrG&4E3r0#|Sq<5EX!>-=b<`0_EKToN{B_0bA8 zecVh@21hQeJ74wmt)y$_c{mkoYm{HJ3IPX^r&}GERyb3&0%G@iaUoRK>P@rEM;7BZ zJ#pZBsI9Y+f|$L387+7+>ia3XC(-pdY~n^TvE@BL=Y2BFT9YB;nnuH(k$J;N=OKa3 z#xLpI-q>;aPopF5UUXCf8>ifpBdv84D*8u?@w0SHql(Pm7j1qGE?4T(AI%_qyBOAG zGdz;@TM`~sX~*NpW2~8~qt>l*l#!$r6|y!-ma)tt&9av@2J3ECEMLJLDKzC>F6uYi zVxRVP<}_*oGj$dnG74!S?6DBXEmUZuE@+UOQV?wIO$8zW`Yx{FNhi)ml<0CdB zp+Jr-rO!MUpqAhm`Y+JIs~)j*-Cg@oHNn)>eU(sjSYChU{yc!`_|`UsR1<&yJ4uIk z{XvN>;+sQx>#csu)w3HD+(gUSw(pyep0-k$j91IDK(Vur-3^7l=er7w-8#Yc`_KCz zgO)AyryKp_PTUbBa^H952R4oc%LG!WrQbN(Zd{IV zTn18DKzHX)>9%&17h?4$45yxiQkYgR!?hLn@dXVv5yji(!I&J!gX4ux=8{<6-J=Ir#xgpg3lEor5B8eSEFPN6t` z5km^1`6sWnUL}WIo5d?DT*U)A!|F<`H{U~SM#m$ztcpxE#Wj|fSv&H6_J1Vn47*m^ z%kP2O1_VYB>Nw_PpT2y4auY-bY!+IC->>hiUp=2RXzkkwhU`?{JoOvro~1O94$~?*{Q2& znlpAFX^}LmigjK4F?P)Rmo`#+$O@oMNgbO-y$z2aW6>Iwk@$nczn6}Y%S{p4TQv3x z*PB8Ae(qp>JEQh(Yukc!02^!q*^%Hf*Vy;|=dY}b6V@p~n_1lS7bj~kqFc`1g_79! z!4;s5WCS*`=pO`=T-}Aa0>P zm^AfTzaBIz58iV%e1$5?UtksC1aeiDIa2!LD7aMJm6>VbV12;rRS80zqN%WF)2ZU; zmMC?mn{JWUrQ3WLuhp{kZVO!28%=iR(yg!N?s6j89lc>uui7X}A)m z2}>&7+0F8`>@)C0>_Zq9?;VN^vlCwrpjayxnZ3FVeXn86z*x14nk&nE`_yxF|X@agMDerbI2R z?bc!nrPkfnYzDor8N0V@Z;bya(AUtxAQpt>l2Bf*=swJMT~7SsG~L9=>e>Ce_Pzo5 zbMX^~`D=?`WuFIM+fM-js44heMGl=g)NK}-e z_C>)TKk{|bUt{Id9z=Xa%vkS^7t>O}K+#A+wH5i~OT=+frE=oWcK$-6OW6xH>f@;~ zffO$$-K2BjlDu-Lx(K-yuI1L9AGEEZ{mxuj@}YEd@Ri%8%3o%}(cfT0QzV&kb@z9e zf9xhrMN<_<#Fz;l@$cnzWm-(CGGftIN<|cnb^*HpEr7bfiG$Xa7mzR=n_HsXXKox8 z6K4mNuJB3Tw!}n3ENF%HtW|npTSF{4DF(KIf_gEN~kga&=H5 zVV*PQAPWUNCVY+m(;|Cb6|XeK$svC{D@}XdS)cA&c8eoYVgxIF>o`S5t}OcolNptT zFZ+7)QNr%0SE6u2aesCSp!hVlk~>6%m8kz60} z2X)!+5^0Tj-v2qj25;4dHlV`&jpz4|+w-@TU1)<)g8%oxSU-T+iy$Cze!bWV($AdM ziJ7mnWX<(S^PCgEC_Hi84SJzrxv|Z$z>u;c``T_D`7trEIaInKJJ?M9q%wUh(!8(+ zvlwM$XY)3!Or~A!O3LBUD59RhO?I;yS<2D#v2*@{{`j_fp{JP$QAZR(58M~{J8^>M zd{aQFcgE)2DU8fH+lm?3|7cZBSMM;{nhuk}KH=4=O5NlQebvbw^@j7w^65vL+74Ux zb1bOr^3+Yk9SkxDFZ4{l2tOR=ZDAEw5k;5*kaI@F; zXG%@Ef79dXCSzrRS((a-E^^AD^dNmJE$fPehWqw2_SNQAnJ~&8pbAqwO9a z)0yG#5%jk%l6er8g%XP2nReJGP-%8lyM7ZPtNJp&ihxrf-Q15aW#+a&+10Eki{kXW zV34h%N~!fKJ?yOsNvyVgp58!(Zp;Tiigtvy zGF?L3x&qz~2aUfIUKbr(W%xyP)DW9RUI}15t!!Z*eItKg)Ar7=zpe6*lYOEZXt%Fx zPgOK2qQy>MI&!eIcXeH%M1%pG_wKszazDHA+cNX|a+giD?i{atZ+)O{-RJqF=tX zTcSChoATO7OnPlO7FYOL<1X-+Sg>Z}wT3J=1^kHlr0q!=q%AamXx84-Wr`gV{x0;# zuc&|dc~P7`ETtFPEXUrNU>l{n=Yc7vp0xvFBqFrjBWGcPGn&~z&2DP1q>>*uI1GV{lo?C(|?b@jzqP&P0^t7jhAYHIM^|A$F0fu z>moV+HlU{Iwc2Tt-DfOP(yU2xzvq|=I+&`dU(7he{-GYrlKV+({8zc1W;CPulmbBO z`pi}pG<)OFJ9ZC!bgUAae#bIq5_1M_w$j{4WJrk0BUioFI~HGl3QYFC8s|LOBTF$) zvKd+z=y*ra)dG>Cm=|MMsBe7zNDaAURh)IMSk$|UxCFelxd3l^huf5DBK;06mGM!) zSWw`Hy5thUWYs3RS1(8%mj*KbqJ4N*p)9*^Bj-w%{(SgGJ+FZMsdf8+{wMw>A2mv| zW+_LAPqr{%e&GPK;wem(zdAK?`mE4&y}2{c(0f<9aI(M_LT`VuGJ)M_KBBkM(Eklm zT5TmbLq=N2es%)u{YIIZB*J5pN&2{@T0sSugu=Qsg}Ix!+3vtUu2?1{@k~eIt}BAn z1k$?hd4$!P%3y<4Rf=#SMp@HgdRuK$@{b_r5Mj*pU8uZqsUy}itIQ^zs76QmEDk$~ zE3T`wdx9ssa~iSRpK(46??|qpG!!SP1$$eOb1g0yC$rFC8{cGr`f7h-TY!OK8)V5v@j5d|fZW7h|FCD_T1`Mmo z!!n#Ym2?rtC2bd*2MELwjRd|wneF*Yi5vNeGa;H6JoTNA>v^fv+TTd60XD4a*eXCN z7kbrIkSl0CtYFi8y8KyDR_U%3DT|I7wl?m@#0$lG;n30=^fN8|i0!}?6 zUA^e8DT{kcn$L>pP&;eqcHPX=1=3fx0D*MT{sh6J#4Hn5BbPZSEItZC2!l3imS2fw zy+#ksqf7ER%leUGb@KJ!3)02v!@_vF6EYrekYa`;Q=N&%E@kG;8WlD=?_FL1-XRWv20u+7!C}sj89N-+`9*E_P@@+_3bc(pfTH;l2BU}`xe(bw)B^d>ZAourkhO@wn!H=oK4AJsk|`r}ZZ2;C|An4e}?nhrCLLgM5we=utYJTTP^8o%*d#84RLHVyxiG zb%L7V&QPl+>hOaez^X6|ec_f$4Sn&K{?2cuj*O|QzHC2Pd8aN zi96z`W0n=%x&5^DRMEj*w(sNj&Y!zYkT~`6c%fdq%JIHx1M!9nnd4>-cXf!? zZML&CX=g-lwhCteMTO?|=rfSzE;?1qYAdWpMw*%rnJk8xW}M)vt>7{o|EH=d#~R7Q z8Zk3+wcwJxe^F>BZ%?Z-v~}XAy)hH1TkVQ>#-M4x)dk1JX#+-o)Y@aFpS{oM=%qVa zPk`=|a)5?#x#5^UkULaM6(@%4mMO2+Tn!fq zs@e;UElUU1XH5~wxVhACBmN+vS;@H%bdp#aE}$;2;CNf*qx7IbX^64LOJ_d9LtvGb& zO1%7X_Iu`P?cY?Y%9Gjhh`UZB*rLp&g)>{Y{)7q$oYgw37zyh?YF<234Pt0~YWrv= z^b(PnHE6{;lpVZilrB%?W_NClTofZX@6cJl5$QXu06%FG`9n3!)bYr3?nbS33S?p6 zf;OlW>sA7haY9}w_8ZWemW|j@M`;d3FENiL9-7OZkYB%xPn-y@-$sI;{GvReWS{g~ z9f>x3wJk8JqZ!EBEMNVnwlXs>lHRyJxXC0+Pp6cLWhS$+)%VOtpY!06ioNCF1}*tg z>m15|l7Z`kohwC2$1xM7nHumE{!An6*k-gwtlq<%GZ@ik)J)igYEoVfHukTDZe~E9i2C;K=&SaEe;Z^B# z&=~<2-SOFE&4^jp@^KuoIGH(RT0La+S7J)iJeD{qU`yc)tIa2T8Y7mIuP=*c*>GY# zq~YP@f+RoY9(wLE&==;}gk10eMmTC)l-YzxWi$A|$SJ{86wBoHgRym45^5FK-KGSf zR{OO{pDiAgmaul3c=?&%6r*xPub8ftO;BcfxZmzn-S?+GgNQuS(8a8<5y!~QI?r|i zbYJpv*#}UV*^kzit~aQo9ki4?pTWB7Uzj@!mca$w%a-c^EiSInraqbDuQFOdQ(M2b zjNzT#!_d7)EgRF6rW!GiMFQD77BAtw&a)Pe5VR(j09WvE)3B(Jj-0H>u}z=}wpq*s z@BSE({FN~0yX@7AX1*u(b2M*ad}r@vK1JPD`u1M`{hd?Tr>V0yjnS*ywJLLaw4|zK z5=vWqyA8a@4igTH`w;-g6u&J!&qfTHjm&}a)e*ljCLxuB5k*@>#<;EQ#{>F7nw2$E zN;z`ZTNJ)>wAMeF5-CF}g>GJt8^=~&msIS}5L0dz^$zR5)v<1my|tKbZ}~J;#)jSWROU@S9|{Onk_oX`Q}(t2K`U zC2WnEy@q(yhbp-OT}aBr)6QYrRjCgR3)^GM)6h=xoyk(wQ_pwf^r+JYp&+ljUmWgZ zhL4t`6TYZF$_*QH~n=b|_%)7Lu#4*2m1@vKyzy>14V^v=eFa+>9{T3%wb-;^O%7Klm|z&Gsppy~S0$_u z(9oOfjC(r=v}3xEiW2R+lEI^cn;*c7Wo~!;ZiINLV`sP{I1O#3fP+fAkj{Ux5D*16 zJf^6|t_se|KzJN&ueWQC@`{(9yw7qwk9xb;xJE{FgVXEo<3}&KH+%cyQ`MVuW>9K1 zxONcUKtV%IJ-T&FBOk~HGVSc!BpWd6Gh(5QWvdm%o6y=cCDHQQqw2IcFw3atr20Vh zP4av=CXNi=O+zP*8ZcwuLfX`4Ji()!jnfv-mw?&d^GIWXE^R2e+KGQsl`0t<5QTpVq(W?@VQao;*lIBd1MR)476jFwVIyTi(^fB!mu-qH!4IDr8nF>4aUiN=ee> zy0(fhHnGJ^IbuGYa6b+?Und;zQ}>SjVgqRfA z_p1nqxD&A$6wC&T;+Q#Yy<3GDfNf+O!A1fZ*&K`y3d9Ye>=s#UhyoN}2S#r>WLLw6M zu49fZBO_Qm(q@&3?(mpgiL<6a^b57Eoe|lCU_Sa>c7Lgb)HZ$0Nk)gq_*ni)BhU$p zEtLZ$Btmg-J}PGtSg6vD!Vg@j0O9{aS~>ko#|%}XQ)Veow=}KB7pNXWEbXv9-sX`z z%lYn-TUYqX7%3*s)rLWE*(d3(<#Rp_qbBA5t|+Gsk-IxB(+Nh0z4y;@!@v$OqISp^ z#b+Z+zFHFm`#4shLFYL!`vjT97a4*f{1ld)Z0%G)N#T1~SyN5_ebtm}=b=<4fk|l^ zW4MtlRl~uJhpcUlX)hv~;o@oWrE;#XZtrOnOM1opPSTv<#~MWCmIs}k0ey$$ouG%PZ*bP(-=Eyn z@^Y*kde)W}eCAEtbT0%>ll;X3e3XThIEs%2xZ-X2hiXY33i!YB8=1KUoOjG)Zdf>s zpH5#D(luk#fF~v9*g)V^2aB5LRLJ~^9Fw+Fs7^qK(M6`T-t4er772AJaXf?=ncXK@ z?0Th0vD6lwbU?Fx6Qa1!#OXumI!R96NH#Otba(&Oo6!TB9MgfJ>*M?eMHekoF1f5G zaEW1nn3{vGfSLB+#p8@Mj-CXQ^pldKU?ao{aa@>EzCa-|Os^UXFJCX zsK!qa3BJJAkkp!06QW}>m-7BOdufI{7gLG%QYWthj!wcH&t4~E8&k8{QQVO7h#)Go z+K$ZD1q(xNn>zScV~?W06#jmXFlyQH-N|swYJLwOK&FyoA2=J0v*r_&GcX5y)a93X zLPu&rZ_u7g>7X?~Zpd?M;=;~KN4#eFfq8$S@H+TQ-q$VdO@n$SF8U!!fO+E(Fd0kf zXHKMfusLSr(A{U~^yA$&K%!<~H|EK#5#b~{yE&%FK5_azg9Z18NlSr%&Ih1BgEKL5 zx_ml*8mrR=?+O$C{>oNsRBtq>g$nVjW8Cfp^Ll7L@6b{Hq@+-=6KR7##7_!U$PvlE zMM^azxt^`U9b*B~F|c?NKeYHOlS}xqlLnMDUS4w+9nv^mZ2c;pPk%&%nyj(e1`Apo zOoxE}OP?wb?=sRk1VAYKh#tzPX#@JkzY^C|$LRADCjZ=Qx@xZI+0_H-hipxCaWM$% zSwnhux^}-TeRX{M>=A9y&3_>LVt^CLxGm*V9`B!9QrK9wj?o-@ti&VjBPwt0qjE~u zGPuPiWJmbdl919$!R>`Sd#f1^w&P6fd)Y4z%2zq4yZk@2?7y)k4V#PX%Fv_n3rJ+f zsF4!b>DsP*_Rn^q{I4dFc`F38+)E9Ag-5oCWl>Nhd#p45 zAS1KNBCP0$yy@G5x4bpVFS;r;^DSnAvVS6pRqTN2Zc`;OTv&uhC5qN~aT-U@#g;G& z-6`mU`E^)Yz@L(#MJwY6N&5G&ia&=h*{w;<0o4*1P@(Eq={-B+F7&f4d^UAjBCs+4X#!BuDfyrgb6L2(_1r*4wCgM_UBox zT?eRVM{&#xnwWQ(XraQ)9^2}`%gh-g@XwI#!EIUYnT%nJNk42-%P#()h02>+jQ2C! z+uBqh61t+7rq+hu^}iU%zg~Sk{{?Pwu}GZtQfyn=HWJC&$)!o*Epl>Ileo|v~~Lxt8z6q5Bg)hQX}K#)f)M`1%3)n1Ig_TPp3)b7}F z@yqdMv+8TMMlyDF5M6jmHHI`B(0fxS={I*C!rg+jgsWaG0;o*P@{JdjUl@s zTyUs?H&s^SEZ&MpTY5+xq#F=t&8Q_C(q>ZJ(POTGI-W(Pg{85^^-RRnOxGadC^lyu zq_<^}vLCFD*PP(Lx~fmn?uG6KScc`POfLRd_tY}NU?T;NrTC-j{iw-Ob6l1$@BiI4{! zgfqlJs@lQ}%|1iy6(=uq2B)nQvvpE>0{iCBjzSc;q!#e2SR)lfvZ_$RhT1p z;rRvwskcΝ|e%)j2Yj%Nne_SKtXeClAS+4Hohg>q5J6_VLHmB6wyvwO&JUm@pWL zmrm|e=5RT90&kU~ckT9`{+1&FUQ1`;q#;MDULjDopS`y&Pr2^=`Z67WI>*d{&nWLj z#&0C%Owpj(Nk*Y+lnlh8wv|oaqv~;st#jLi)>p9TPuO37A!T0~3~HQ2lk}2IDYX^I z73A_Z!klo%`6v7KF8z_BJ}#b)=010B~ZzuDX5kD18T zCgM6xB?4Wv_u~0Gc72KghT0N4yLi)`jgez^8ZNQh)s#&B4{=nw* z@_q?^m5$xq+g8}t?}XHxbuGwFp3&N+Z6m1O!HN){IwBxR{2-Pl>&8~BaTZ?_;4{|H zC~#JBUoFs6>vrdhFcPss-NJ{}#J#reeS5er+`ZfF{Z@#l*#fBr?f>&XKCNUNGkPxp7WdeqE}>YyTr)_MF#EEyq(L#w6O z1|fF-=M*_?;J}U)&^gWBqt$+VEN)L4+m`vNRg4`*ZEQaljawOB+DXzVwTdrtRJV_B zNMAOAhx&MC`<5l%Tc^!g}&(4?di`r>ow6A?HL+ z+_bW~ZlnWuK+wD{?~rzfe^|FKbj8DMDO7Rk4!zY?->{IC=TE-touzJqGVKni3T8rg z_VBw9nmzScO-@nM(cZAsWgDD1$Kfk2RAXLO>7Z}g8&VInFo+xobnb+2rrQN^uGClh zOGMq@gFK9#412b-72jjxNV3AzCInL{`dh-4$d&h6otTgv#`x_sX?7Do+6l@cI}&;O zYDo~pv`M_Dk8&1Ek{?AFvtTG#&L(y-?SbSh5eynyb2TRvJWu#Fkv$mjgsh++Ad|m< zrlQBAb}c23+-;dz;M0`ZfnG6aqr|%3yl47w3jvIH!E`c{8#l9`H)sWfrM!;%yeo=5U4WtQK-x8fR&mkBRW^Awp)URw5-ZrX zNu{_t9nu!(+yj5Gn$lICAB$$6CC=j1p2ZLL!x{42jjM7UEVx&+rCs%NrJEgvMgW@x zwe_HG0INR_5Q8ah5~I;tyiqUopvTLZ+S)a#Hog(L#C+;Aq65i`RN@1bFGFBdyTCjQ zT~x|&7FR>10V}qwq)nl#O&a zUu85;6uYxTDn$60y|m4qvq)<5kL}JsElKv$rE^9zXD(!k@R_d0oxRhE;KE(2^$vsv zPcP#!9-RPv?RA05?n(2POs3zRSs_0h8qJ1%gdr?RC0=aY$c!tXvI^8@gz;(_bL8SJ;ZkG@ODGY3`j(Cu+kWQG? z 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�a41fO!mZqq)?%#<zE=8|3w%;HY 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 W}`8Z#u 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 z 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 diff --git a/res/lib/nimrodlf.jar b/res/lib/nimrodlf.jar deleted file mode 100644 index 3dcad2e7eda79bb3d6926789bbc3775f5d4d7211..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 215923 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 diff --git a/res/lib/substance.jar b/res/lib/substance.jar deleted file mode 100644 index 444f420ef80ffd305c4b4b23632affa3adf3c445..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1741419 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 dCBc&Yw2 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%0DNG}6i2Q!P(h>dzQsg#lQmheJ5 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⪼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 z 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 z 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

      ~#NpH*$|0SOO6I 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

      7S|xJ0N}td?ar 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%0Au198pJ_3mOpvV39Syy()niFRv)QiEDSB=NU7 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 _3U5Xj^H? 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]TZZne~!!dLI#D3Zqae$c< z1X{X)0vo7YRGJTV&ftMx*^2RQ^Wg1#?DZmdL`0^~AQz#}?*#f7aVxy=i#j=<|AKt| zrzrg4?+$anpdf7+UxBCpv?%^puE|vucM18Em&i1r9ZMs5nZqwgx|o5kpL8 z<$E|V#BjDXtiBtkhPcfyzOW>tPE?QGa+RDnmZf9%%p6s{8(tiToi~F(=8ENHXVZAK z{`0Yn+ge4Ph^SgjzEigDYNGw6!;pfE~7Z1|Hekc8A=3PWxxKhGY%g5a%7Rqok`VOV;{uA4A6KV82m* zJ(Bx5w&`YOP0J++_G-V6dxNwyEK0`CE;P>hCct?uZJ4d{-HOi>k#K`#yQ82P<;uP< z@QFJubJODeW~F1Y(4OJr`J4}g&_zAhAp5}St@sYb1AP!gKg*fwa1Vq9rq26OZ>q!^O^K6^g~CiD!+0Mg)jBB8ne4 z@G@nI868i05U ziIPf7kO3xVK{$mW3B|?s@KKD*i%S6U@RwqCieV!aFzi)K{J(LV1B0#b^h{J0gTbXj zlY3eE4h7r-BgrF1PJgP~3WgJ|kA}_>cZLrMjc?lqo-+JV%UH?dijA~zB(EpV?2dz@ zxmz^skB56fVdjEUa`iK!iG_;@L&SJmP@#NvEncUAQyC9hip3)kFRe`t&Cf^E_#g`3*HL91vOb|jzTu6$_Dn~; zp(Xt56Gxa@%#U)T-?_rP?vu3**B2=e7$p{(8p~>}8AIZz;j*Y|ox z5I^Q8<@7B6HS@T&fz?eRs8-fYn5Wv!S%M6+Y>h{d4cd zd&_)m0rnmFE3JY@Yi2l=$O>2XHD-QY3-dW55cAahP=!KP$$%$eFI%BXS%9|sDc8fy z8a_~9{@?<(@d9?H>doYE{oU)O7%pmL(5&^(18ak@K6AXtcSuj&Kh6}oD{G!RplB(V z-8+|gi^_1K7$=d!_!Yf`;m@gpAl@>y^i9obnH_m`{(Mw0?rp`|K9g;1sMngNR&nps zy9nu*v47wx(4FBfn-W^nM;&tRspcinQ`1Z3r0bWSU;IW}V86eQ27A`w;I=w}Ux+mc zBp%eI5oNNn|9-C56~|3Q>{gE+XlCmp{wB)R(1>C0c-uy({ddhj9{B>i)ceYB!OTnQ zvexbuEtn=gQ<-AAUMHSutj^eC4E%>=($F0@ATUu+-+E`#bm=(=Rco%A{$kkB-xVIq z-?~Su)-%09+zV0Eon_J+6~~2mvdveQinlR>Sr6P_`+M< zYPD`}2K^Ek&5pf=3wY^zYHjEG$8Ey)Oj162D<1S>ccA~b;wC}N-uv+B@xY3E{dd?@ z6U5(kSO+$7KNQ*Fl|k0fBzPXFIAr>;OP`<=Y#Nr_B~E7Ku59P@i#j&zfc*H(NdFII zUl|qWmS!C+KyY^m8rx2wd$-| z_4D1e&wd|&^3?9AJ$qS)UAT|=WVken9n@j79G=lMG3ipfu705NzAq!`)s6*(;m8;C z+vjs7i{{?JmXBV1svb^FDrY52j4kektYY3RBfxB>`Xtq{uWS=rw(f}Io0LZL*%7yj zZB7?bN7!Po+zGsDWL#1`Gc$HM4IIyINH=0ZoePimm>E<-l`&G5p#kL5u#+b^%BPbV&67ti)0*ot(OOw7azaw2 zJBHGT(`L)jUdzWEMG(IzMcoEtcu!WDvy}x^pALU&opiS@^&nZ0s%kPRjQxrOnVU6# z(>JrXv=2LO;G3Yl*TpJ4WA;r{LQk7FY+NErwk_#^s+_cyz~w{`Dy$mQQ0|MS5Q+%X=Cj zIyj}901Xu=wt=EaRW);Y(cHJ?!9<(~I%`T7~oC&gnnf^DEM-E^LS}Ovu`6nA#`HzHjaAUciI$d_I8(2eH z5_s8xP83r~S_*oo)~Wz*AkL|T_gdYD=MXuj zhm5LEhK=5d+{jx3xWlo6J{q5Hn;$EbYz`OYFn-3?&-`qArE&C=nnP+C>p6Gr1o445 z`q326bMaQ+4da$yi!zvTD1-vTw!qT*&MNAd9!_pIN?uK0GSm9Q%7iP#YP4d101OyC zlpA)=SBd&ESP#?UM?{z(+o$V-`AJ(#?qK7y>53Q@vt7?qCuvynBZ{Ei?p5;4A91B9 zP9%T`zGGuq3zJ%`uR35!hZ!_ZXfp;4X?O^FkLVrL!osGZp7OOKJ&E%ui^EKXo$l$O zl3f+Mez!l}Tn|MUj!cqE zsSN%*1Dz99$BB4`>qWI)wFyQoxDD~}p6mg&uN+MgMb$!mc`0)zl_ilU{#TENyo4JwOyE&mt(Z-d*Y2k#9Nar}pF~2D92`WlUf~suE1}kzPSS5?eef74;gq9yfxna=;CWR_O~Q-0*^!4 zG+~(DR_H=le0S>|=d);of<%9e=NXgc8#C@2W0Y>o>2Vy^{r>u7<7|cJFhb9whQ0(v zuU%J-MQ&g)ESdx-KAL6ofZ|j7QhwMXV@*lFGo5s^5E7r*4&_Q@+`9?)MItESc{PHbnnmapKRrsDA}xsgI~{0iFZyPKlIB z;qD3W1(>&YYpw$|H{`cil^mxhHfgo?VQ1F&?fu5V-OD#M2l|TJt^Tzy-D1r;;&&2y z{{O5#|42it{M`db0D0iZK9IW#3B|BVpq;vy_#~=Ii3h~!5@i%4DYC1hiadB(GDw(E z(1cw@n_Rq#H&%vHO8Mbyy;iOY_X~WVUEf-`zk?ib2QYV9PrI6gjTX@-zP=AxEt<}k ztNn1nUemFKH(ztK7wmZsvM6IA3pbcyHF97cYT!qaO8np3Mo?~-N)2NMdB;gptia># z!rLc`1nbHX!3Gbts&31CUqHPCvlTN=tvrsA2;ogqC&G1XYlq433MipA(;CCsRKWZ8A_C-l!~zps-YvazzY+yl+m3z$4lWmPnolcepKT zu@pQv1e9{t5cl6%=v&`#sHgqvP;%L#dsf+i{*HecR(Tl6eZ>h%L)#Glh0>Qlzlr|t zcx!ult*BwVt^b;)kn{C^S>|KDGl{NTQr84TMpek9JJHCbHy*NYQ|v74HL>fYC6E!= zgl|JA>idV2^gwcm8BoqT6C@+hE#ZhwF@3Np%asan-h?LQJtwhTW*k zM&96SZ;K z0P7CQD|gRWbhCRx`k?0B;J|WP8m{Y>$Bu$K7R!F{(J6%K-nCEXjty!AY+%stK4;UB?hrcC$-y+w9R7 z+>_Ef(cV{s1!}+CCq+h7wSXx(i);n76bytQZ~}{Fdi1DZ58c=7z4d}1h@&&iIig4l zfFHL8<*HhTk%nS~y2KN=W{XOhy64MW2UF~kqHG>F*89{Wi90S13(^YgT8+haZb( zzkV5bMmbW2NT03#_I*dxsD6bArF!>

      ~F-+(x;r{$1+jBy{QzfkC1hi3J$R#0YlS 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

      ?T$R}*}XyTCgI-H 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 z�ACb3293EMsfd|xRVD+HkV?f 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 I7 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


      @yUHE3{1&LW(W-HHAc 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

      vl$U*yNKrrwX5JXVJTUgU9$SF+9x(sU+fK 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

      a0yv4Xj;E{sVURZ;QC-xOUjypU9$@PZ9F9 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

      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; *
    1. If the dialog was canceled, the selection will be empty.
    2. *
    3. * + * + * @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(); + } +}
    4. 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�z3cv0+!Itiv+G^$ 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В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 +# $ 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; +/** + *

      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 wcu*8pNx#HLg9 zV%40U-xovufIpzBBg`y%#iAU2B@g?wx17<{fgNm|?g#SkDUuOVpg;cqB}J_No+9EF z>5Cu78!q%iybf)cZ61jz4$_aj@C>~P#0U(~qWBi9b$_ok* z|1CxO{yv|;1{lnY%?D06j5?9~RCObcxRDrMj>K`cA6L_5$C4#GO&y# zcT^Qz)E7z?i@V9&v%n z{Syh36j28pm~JE$D^@3oC~h0&GiSTMNi_aVqPBmLNKOjT>uckj;(td)N#DgE&Nm+ zhUH-~W-0{v{|?cJ>UW41RvSu&*qf6TTUbd$myecwb1l-!-4s1zy~Q-jiF8mMoYiKh zZy0bP^}IU7sN7MTGG7K|UMHGLmFiOF=x9q|*0-_bl`}*t+9;1g6^=l7Id)MEk+%Ty^uNXvNof5ErKm zw9(h?#t*i_+@|tMEK=VnB8S)sCgnd^%N}LMeZUUw!0O#c8EK7#Dn~9iypI0fni-lP zToUN;N~;B)bkomAc!xH|Pw)!0a?#h{%ice0L$?OZtjO+V(F=BhHJ3jI_8PxOL{}JH z4nmhUqQR{zX!6)ZgI$4Mhk`ip%?I-zXAu#CA7o zkM=;(ZATySbs3uv)`Rgy!_zo5ulPNshkM_-herHVg3h2HkP)M-zYlzFBH)OzERZkf1>F5#d28O;(t(tX8lhTxjq~}ce)37 zS|}EgcMYC{xUfx+Mq5!_ZM$hH_S7%j|( zXEY*|oGs62d5{?!Dn=8djWO^9jm(yWQ53BspaeEHEaA{u$;i%9w0%S9Ttp`R!RZbt zy|A2@G&!4xB45}?>$zy0HB!MHAucZ)XXuZ@Y2|;TsO{Im8s*l{ZxjuEqo}q$Qs3hn zML!3#RNUy&%g#9lQp<&tz`mzB)Bl?0Se2pBIR7!t`Hpo>`TcLxT;_uc_CKaMlJ99w z@n6$i3UkkYPjim{nC7x`<$ArEGUkq&&PHC2Y+l>zlo81g&#NLhg|Q_WMz((&6-YHY zR8(N7#nYWlVyF;o@1pX!#2uDT6289KZC{Dp$XPX^a-7)=e+jQ*^LXbLC)+hrv^-*H z7#E+Zy9}r}q9r??con*koroWX%IRYc?O8 z;|YN$G6_wwRlRxf2VD^~#%9e`YzO}R#BazqZCKd`^EM!}66T&!FD`z6XVoeHg0$Ns z%c49l$mF{8GxC5eU(uQ7#mKYyg8TOf#YPCeNPS1>A8+ik|It~Nu#Kg$wamAs+SKm9 zMbxz_Q+7)ND7=Rxu1Q?YDFT*@<`fBSg(>2yAt+Q)RHURus_2(w*9bT{zf9zndIS3m zl|f;Kv*LxeB9&D|;Upqvc%K}7ZgP#|{omhT;rhW_7bT2IV^wQ1DM}EBYAtIHTiM*3 zJE~)^&G zJN})8!(`&lyXdy>EJRWQgfTp@({V1@03R9xs#&HoEDJ8xPbn2Ps~&xI8mB%u3*20)|s{y9BerSgv0LDD{yj7szdS!a`x1E57CW2PN?Df_o9V z>Qhah=}W&|@nO)I$gI%L8!(-c)f*h(pJZ(`JOX54;9ERPW{hpJJO%-G{Abe)+)7i2 z%|q34@*GiyXG%bG_!F{d8HB%4sg%M9wP{%W?d2y)BNwAUXX7!`rFr-ZMQDWzu@=-3 z>3bLI`D8QQ2u`_6wphUGedq4Oz4UQ$A>+d?Hdgqh!&ysC7Zrs&1HlP<|*dgB`!G(JDi{oxs7ViDG%OS*3d~{Ei$6| zV+btwdcYeSgXddSy5uRq{4W!bmBVW$*t}2*e%_Vz-S1>bD1=R@S-1( z8ON7;(j8+J@YzCgM_*U)!O zEWIP}pFjLl93Qm=1y};~AIskJte!-})^P^)$6(y@)_RenkiS+Kj(?!b@g(V8R{US8sgME>cBJ~< zN5W!w6!)d35oeGqO<3j_^1FcN*2sjNCU%iv&l*(@M19++g5dQ2LQbUkrh8}eBy89R zNpABA?=m)BP%aHC7w1aqRrbt-I@``WU94K zKKDC;({Qgs;u56Zid#*R;thyDj8VhNhu2;dYNe~$*TQytS>wXbO)&^)GQ2g9h;K_3 zapqxTrl-m9I-|S{A$DiU2IKx3h0&nMw>dy&<8;UsTRE%Yu1|h`m}Q80`%9agr{H|{ zTj85a1z&nWbN&~nQ(1l6aWdahXK+N~a4NH>StQKux|0aDsdR#fw`x`03y%EN-;XHj zxR^T+FMesK=*BxJ`S@sbquMkq?=F*9>Xbh}Ztd}WA&K1bfhw?%Jm@sRkmU(`Zpuow zePK&eB!4aOoU*pl<<_~JUnS~O_Q%EfqOyz{uuJ)A39Iam@*VPn?HoE^&>xumL=SWb z*M$uz5QZoVMlu6TQWs=1Wuj2xVCyV3d57dGsf8>nk}sf3m>8KmUM;>t)#NO=8ro!& z5FGV!0!h@eL^iW|Yo5^tMr`#nYX;V8iwkf&rCiY0!!7O8*d}BWdj#HQW5RHrHTi$< z$SdhBk6KzQy8Py1$c#8*61uvI)`uu(m?M=d;q z*83*0<{RBE`E5<_wl(aVdt5bLwpC)}51pv`0O_0Dk%H-~F`~9L4ydo~Ra5nb&Cu+O z9=W0FkFjUGk$Kx0&c;2`lI7Z`8@%5RyJQJq7u zu#zS57Oq|$hNDh7zmd}P;xP(&rDe{7ZZSVfYd0l1^lIj;9EK+cK~hz&1g`1UeS23mmm2b@U+3=5J(wg?LyyRQkkZ*&=GxLL1~2;8 z!@go$D(iNKOuV?hMMzWFeA7{CBpc_LkbnrdSlkH(k}OukD3+1tZ$_3gY1OGT7OxnS zW&7XO>4bJoK)4D!boe@_BtA6>zNx(;zi(BYY-lg1M7keRBWrf{t1(v zWsAhBD*5*eagta8ht;blZkUNYR6`Pf=jDg*$^v-jE3I`!kdb)zj%DOV-l@D;j9D_f z?gy4Z&TOhhMsNq#@jf|LT9N92JnQ8s9+)Lu@LKgg-Q_|%$qAU-S@`UwAPV-u|E6Lq)6FF#f%YpfMJnIAg55enzg^eSyRFF;*zxDc(XNc%uwIx~-WuVKo1nL+l&0d!FyjztVOa1hy9wL_Tjdqvyp zt8|MZ{}WtWTz{Q7kraDaUFfqk6_r(4w`5kC}`2%JT7Un2L90 zR~GMrv=y|C)tqN=r{=K}8vlqR{nA1v%Zt2>y87;3PNhMob`fd3M*{eJH))^4|=zF9`%gA{i#k*Hbd^Pp_6=#t7Ni8ou*FL zl^x++Nl>Uvx82}ujatsTD10(cIgO@k2D*=AatlUphDGO8VhY?1uASMmhH7PhYv^m{ z@DgiK+yaa=qLDvt?Sfi_Y-ufQjPu5Fcr5MemKliUvogt9kG}6MW9faFiu=cfpXGxI zfC9fCAe{t<=arK|>c}nHNIbxxtjcbJD6-okEYcy7PPfT|{c<+~y2ZMu7!{&9cF+i- z-bR2qBW|jjckH_27}0dW&Fq4nabpN<+qb$yuoz%n_cB;zrdgBY)+lYtK#mcf*QfB{ z*4jq6-=cjvFDoUyp^0eXCXb`X9us%mxa5##b}V5AEcy{1gOSbDZ^HdT&tvJ%-ruAE z!(C4gYs6Gl4GbWDyK?mx*anYZTtD+dEiJSY^IfT0dsOP)R5+t(M%8;sy}hW5 zAyV&8zn;v`YHU^ed3=>8BPosb_)6-kph<$A#w9WECqLFvW$`D$v`1nBT!By*1m%)0 zM)gjJnZ=&d zDH8G#0WLbArRBq-i%SPaXCaW1-NI>y4cyu~^wS2I-uvY(;S?-{W?h3l^_p%`WL%Zg(pXTzFCBVP0zr`m%3N zFJQfKvR@0x#}SklGxS`sRggZ`M-q4yY2z4(-Lq!VosM6G*w%!*77^*FbJjG!?Bmvn zPu5f!Fy@L>ynd!GQp%*}iMKounMuEV3{QYR~u#mbEoB3cU0dK~^ zNLXE5Jo{5Ro13Q8h!FN+zCmSi?I9^Qrt(0khG;g}N)cuWFKyk3<|;zGB(uSVI6i{+ zCp-ZF8fXyQnmbBoi<6&D2_}W@f&9d3;%CM%A}~6Vq0u^6cmbP;E!Gg~gRYzo2D>3* zOA#Xfa6G~1|8ZBtjIWsR3FF6)a=srw`2Uk>>R&?>7nFg@@0OFT%p=*I?gW!T63l)9 z1O_N+0)c=AGeU%EV3GhJO)_TsiGCBZX&DWhmS!z<8^sGOt#m8u+Qm*32%6fU77KLk zuIiSJ-<_?kzxAtCJ~_Xyg?c8-5OAU1@ARDHUFCUSbDr$5^S=W&a#~mPMQw^ci9NqQMX2-yo)DDI4G=^(OnCJ#dndpYFFs*;Z-JW~8bcDb$ zaX64VTbtljlXNSD0pl(XCzxSsJD|2{b^M-msrGb-JEPu3Z(QyEapchw0m{JBS-|lisk}xyT|epNVxzXR5)^ zZ;Rqk)`PjJFBHFxDR|SP5d`Ub?R_+p%|I&KdlGE+tsB%$LSgcoyOc*dEERhn&Hgsi zgTp-@+o-z6ow}_@eM~sO8aC5>sD2Z`r*`3|w$E_?6&A9aQi!iE^&9|)pJK?)H#`o% z3D9Qa8AS69Nrb?_NCi~Dz5z1e@c(?OVf$r6v`KpCgi$+^PQAy4?56HxiFw8B#%}^b z;N&*|P}jckXL%+QyXK;D>i|kWe%d7@d;>lHya4PB18B^DJ(8- zV8yq9;x|sAz`Mm9cSw{^d9Qg^Ak7HB78(^)f+ks zir&(4b2lELb0Ym-G>ssJeih#5AQ9wl3O($4d*hC(PF)EDy#d#G+z;29yj` z2%-o-d?Cw8%wbo1HIR>%>-kQxMbc{a70ep9{M~KUM1fR*=Ar^zgH>m8DCs-q3*le| zUmHC_CCuX^7>HGXPL+Uu2K3Xl#7I;^SN+%tl=X$-Q`J6hq5(cP^~-6Mmvh@Cjas&e z7-y9ek8Z(;kCY*UCPOu>;2EnsD|K}ZQcJT2aNH6vb|LR5E97C@ zV%P(mD20uA3N?8JQrFRN%}O<<-VU_Yq6x7ihHZ9v(|D>7W?{U%R`h4=#HC#wZ$41z z)rWtqmH^)qf<@6rXHugUH%67T)_lW#b@58^()!z3k-;O>>Q z1CXSsjb-#Yhfh~TU1l9UI~dFByC8!;#%dIdAb zj~>eo9*fhN%!p|vajL}8tvE`d-w-Ko5jO3DgTP1p`O7?n6_I^tAmO-hK$Tc!q z2BwRk)aK-WlUyp7;kMB(;XRkZ@o&B)Pcp7x^QwdTLc>vg5dF*dq~AR<@u6`P_xRfN z2X+tfQQnC^B?tMbpV56p2m7d=sd~%$+aMvn-(pF8ln2@X_DG+)18ukXNT13B{`=g} zz0qIg0w{3`g15iYO%`cD33M6c1HJdCp+B*ArK9yrf%Q%Kz6PF1zh7~ep7VgkJ?Xwi z;7NIkArUGd327je#neP72C0}TxD-Un5>O10HKP(jbrGY+#WJwTbN885qS#qlSioAq zBGnnI)RBr&5{aEq6UlL)dBmWje0+ovi$j%>z@jLQ?^5k`!7`$33km`NE05lD=Rh$qpKQ5iI45(mJdDUEwft%{udWe5BegFok#kd{yw zb*B|XLNh8OG>ec7FB7P&bq}>zYhLPz%%VAyGO8n}808V~M}Q}lqbkfaVKg6z{AkSj zyyXz3hm|C0lttipiX*fX%Okvg=^(-xfst~E)}X|u?4taV(xHeX6J?1;6K#f08MYFw zL9|9)81>m4;S#Me&-ah-X>sznIlw9|;uRU`izoJ*v2&*pFWXOQI@4fWmSicxEaQ>s z5^yOYwfJeey$`AwCGSn-JU6Axksl6;vU{)+QdL2*=ipGA_AFpF zGZM{ECI<>E0W(j-cWcl6`}2GjOGZSOVQhKjR&mh2e?vxa9SX_gG4)Ay1%F*H9p4b2=BuUohf zPU1PnF#iO$D9DHc;IWL%pA?T-XHnjGpr}Npr(4 zX7a8y@&`5f_@@XPrTJK(8OWnu%>ieY-V<$C%wHlD1pB>sm^C&1}b39!DR` z{%EVOHq+o=16zskNZv0trP<03?8RjTv9}UrUVe8_%bdasjLL3b0^BN5{GgI=oEF{ZtE@oIFAn51A;0 zENN5r;ElSCnw`m?vf(B0v?#VxasyWCOW4)8X)4PqD<8{n1~AC= zonXizPqgF3ZsU$}Vla9XB6fohA)>gUoi8UM5@ls8x6cv~gkK#jqNK6tPfdcij8<6y zx{(I2ZiSJXaJescOpPVM<$LpOWd;({>1O4`ag@1GY7>>(M(LH=aZO*B-|T&95G@It z(t;>y$%9&auR8zSN=w~iP$sOd;ukuFpBhsOk+&`uqDu-BW{LGSaa&o=M zsRbu-j44o*!s&Z-xXsA+X4@{${9?@X;pVfT-LBBxd`pU6m-+aNRTk5n%wD6>iuiq< z;Hau+#->LggecsVnVq$kafH+5yJJ^70+x0LiPm*ARlI=ZuOF}7#2;I^@mnj()KbEg zl^-(k>?J9e%=&=cB$Jh;Rlu+DDRIREd|} zWeUDSYnm)e>&i+SK0D52=?r~KZe}qu`wqOSh$8{M3G5<#qGn?i`Qx>>sCH~M)rNLO zFSu$4!(vxl1|^ua9v}F5TrwV{%8c4KIv&qtZY`X!m4_7$Vq%3j=zCoAS1R^v!ozy# zl@WzP4f6``sZ5K-$7`ma!B4^wE_7j9FAi6y)3;>Kvcw$zTf&G%Z%0po8^Rnh`rsJV zCpsc^F;ZH&fTgTbUU|MD<7(cwiI1l;H)=$oYV_C;X0=9d`g_wOu1dXL1gW<>YkxG4 zcp~#v9R%93k`KA;&X{)k?tD3fS8EwZvSZw|%Q79^YJ<_?d$)kH{Ca8a*cIHhm<4|C z0dJSr<(TlylEjy#t zQRYXPqWH$wo}U*E)fi_Gv@?5GDNfkrV}(*eu{MbxR%1-SUy|q(ocGfR-ht7i-)uaL zmI14EfE`My0C@-mKoGFv1&K$tqV`E(60ru1W(5>O&ky}*TmUOz=*bC(_bn1Y4pkf@ zAcyXtnKnW?E zok{2;z=ZybjEJ!N80Lr zx@7RO9eV75s$1Bsao(F8ih>VJ`vo=h*1eyrhqci1T#^Da;Fq$zfaHBMg^bB_k3oJ_ zeEuB0GzuAR@WdZ33+O)D(M_vvu)bmk!H(hwLyBl2Pb1N4Llj zH|=x?x*=aTs4IX;2hu-??U~sos4oEG6M7p!^)O()aYTlYKal_*KiD=wLZ<;Xw$Hs0 z;-1w#@biFWI(@I}MwpX!)z}fnXG$Z4)nuizv!xt2WBWkE%Oc5=&(7AT3Qpx9O%jnSpg8Xlmg?1@=txxp=<2F@x8 z(NaS!dF#7nV+MNY`@fWQ5kju1sSN09rt{83*08{I3nU+6sxOGbJrmTlRyF2EF=vCj zzS|)CwK5MK*J6eK?%-NV1;NU#nB^6@E)T?VO$Zfy;j;Ms!{k@B+DWIAykH8C32V#oCyx9oKX7JvSS`L_AE|8BV)Q=`u-iY&Z2-5*ot>2Xc*=|6p z9in=Vfi3{Tfe~kb)Bz=Z5K0GpcMR(pY-PxL?T7s#vy; zvu;GnW=ypGr?n$-UB4`g7h_B7p4#ilm@S4FyIz=HH%$R3aEXOtbnx_<5vzi#QR7=5&G0G=aGA6edT zeKh`_?*X|-p9d6tbQ=Ks!1kT&&o%^&F(9HeBMCK>Ek?oPx_Ik>_nEKsQoBNo157>; zSDWIL7mh!G=RvvkmGC`6%TOwxKg_&8FkR8{4q5Bi2ilvyU!F4iPXRClMe#?DM~~R; z8+u53tftE7dy-bMh-6H@hLoh}AvqSsh2{G&7L`4VpGU?kS08$%!Yk@M@|z*rdsdP{ zTsvl&MRUgiLg?=kNOt*dP|lQ$yg(h8aMRimAa=ENg$pn#jplgT(3EDsG0X8J$;u1U zyLPEtw0FEufdT*CXX^Jv3uc2%k4&Tu<^-tP15GJw|3c7Tk~~oL3ce=6wFjW3?dpUu zbx3UsGWz7zxM+qR!Od+$AVu&yBwC>>N^CX&9?wj>U~)=PE9XO$pjDw;ONx}eTGIpA zKeF7V2vDD5zJU@iM>j~_v;+JkQnCO(4Y?r^s83gLDgt+oVSh=$&p(urNf_hQx3H?% z=3}C`>4^8UaS{pcq*5_^7ncNBrVW$gm5y8 zv-3%DDs3bqPGSXX5DLy%#|WO7oc-Rvia_)WOXmvMSDnz6*S!&H;BmueaB(K$htTQ- z+PGSA!Q7RBHzpL~hotAtK&aw^C+F$J*#)&>EBeF1wr$(CZ5tJi*k;8^MHSn&T`?-QQOQZIHP_mE?sHl@yX|!~?#9g+ z&-Xw7+xyqMQn_N&Bae3>Vz_X;ne2QRZEZfk-w|RcC9@bV7&~JXQE6|nC z?Ge~-i1vAl0;FJeC@{Q4%-h4nDE?Ar^QV3AA4QDmL^p~his=eJOBGSA8<%nY=%UYc zK|aX8dZ(&eAB{njHyR-51(Q(yia`WZ1 z`&zhuiqn68c24vtdv@BU;S?!7rR+e$iH;sUKuuNUP0NxR_7?V_azBWP;)U*B(#bO> z{rtl5j0@U_U^Z2PMx@X&0{$ZeqIrONmGdnLJG(RZgWk*&m44plUV%-{&$iZV)NAho z(D(gNO?`eWJH!ukzgR=_Y9?dZZR_W<6Dt3tt9GXV2(}DzjH9nO4~*^sgKm(>6d6@&&= z1;A4iR4&x@R5^82?0GH^UGozR7Y<67U$F>;z(cVh;#~?2g)x$El7F2p3MlZIvfYc% zcEhbUEp0vNZ5cMb3HXx9OGfjH>WzjpxRJLY%ohG$h1j=j{|Y(3o$`WRohW%Y zLS8TMNVh6eGQVK<6NnM;CJk7NV%S69P%_-!th-$rf7T`GewA!CzmDkCv?3np$G+ z9h1e41XYYtBlso#WV!cGuze#~TkviM@f0a9f{dLWSF7p4KAM)|o0nT6GRowhqF8rI zzAMa5MPj_U+s~4}DGQT&VX&nI+I|mJO7$M8WmVLw1CgeUDTz>E9T-y#S>+r{_eB4e z>Owj(I^JkRzc|*0jdo|Q$6~pL6;V^nMU0C@+=}ePAB!(6Th7l(Y;3_j0Dg>! zQ6i$73|~uwx65>l7$+CzsmncZSS+HO4S)UQ8cs1I!Nk04bu5|tUK>H>G&z%t=7`bBp^ScB>hh2i z;zHKhE!#N4@4Y1_Wlm2UNO61)^t&5muXE7T1KVNI^YMs*dY3&ain;!s;J-Rlct6{( ze7H7X9X~r%h>(GRxc+xF6$Lj}TPu4rHCHQJtIsPFF8^vlv2jFMMti@oZloDKO`9P$ zy{4?CY>H4~j1gf1Ho*zj3I1-EEtr&=($HjPS{1L(o7hlnWt_;qzc>RSoXI}Aa4c&M zZ3mFZu$s35Oqpg{Q3zxbxN<*dWXQjkeq~l!yIXIk(E_<0BaE5O^?6vo^?TfOnM&FE z*mCfP$pdu&n~CfM#*}nSfXxG^qL)S61Ex&B+VhuPB8;J`KHnqmA8h!xY2I4XGU8Ng zAjTgcj$eZWPH&3_nS4=8vQ2QHrvW86O!WRzGneza;b`0RkZs%Zn)zA>jG}5U)W?DudYcYv8cpQ>Jz=n)f2L@SHlz_!@ zW5w?tQ^%J<&$!NGc|ftN0$Epr$AF3g{&R$U(sNec0{S{(&a=$Yg7S#IuH?Ky>&Un) zi}4)4P|P3=5k8H6tt*BFTEADMPhc8t+0b=0Bh8X;4$Ze*O_y{DI!`jNw z-*-~QneEafGPoBqCBkG0s^IQn)_XSuL9eb=m8TX@-Se-?SpF&T%@l+F(Jb3dB)Rnp+LBnx7@Tgze4hahvXU zwC@Ypc1{vw*WXis%A$|fZWVG_zi7PKmyKu(%NNoN^QudofSC)$A8)EUrnadut%@eZ zE6_`T$MCF54>blL^LvXJHJ+7swb?%7!OQ=@Io zUxDQ=F!m2(-#ORD#6D9iufLW7O0OCsFKwQHb7vi46>L0HqYhg<@lV-0dIqC(-w;o+ zh?n&u0BMf8{c(=EgK=1y<#-&2NqBy>{1uemUAvUo{o~m3+eH8--m+aZxYDa~z_)ES zIDx@w%q9O=oxnPc0E;8kJ&_117AcJF(*-Yk79YyiA9nGu{L%@K*{Sl6cx-M0SWT^d zdc|Ovn262W+o|tLW8puiw8{bHl@tR-DUEO^?67S=8)%l67Nze`u<+KTG$yZlmh8aF z?_gtM;q54pvC5^rZFF37yl&wo$cUg*ldVnzxU6ThQs4cjw02%c;9!1n@r@0o@?RsJ zszmEfO_Us^R<=lplgDJQHimWo$l7b&K+H<1hj%XP>Qaw9$Y6)RMzTZi#(2btL4{P0 zi0CgqUwVWaKR%SMcnU2Dx@IQy;)vP3GrhZO$^qpOi41Xn_Yud`n8%pGg>>!=%k`&D zg}>QNiW4N~LA2(9u_A#|DD4nU%ev%8cxGMYBUZ=b3yj%sg<@NwHTECP2x}}7vV1I1 z*$#0eSW@z3IJq{fENx{ASryBShBISdugL0PhZ*7vQu{GZE#+c1)j)-9V{y2XQ@BfO zla@F0ixUd*OH43hz7uoe3@4TXc#Q#&kM1@2G;x7Fv|U~YsM zKQtaB`uQ(uRw3i8ee`hE_Xdq9JJiBD;Q4m&M6LL6`{2jL4>Fod?=(;JJq$afCsGJs zeuJrcq1TnppSCUNZi!_Ki&eNQ9RjzF4PqpGd|70HQQj1?EA6({UB(I@Nt;<2fV}TB zaVVEbFWBY7_)Pe4=nI@4xxki}k2X;(qZf|evG^EW&|%DH3B_weSe8;yW?GA_eq=lQ z3fE&UbyCcZ#IV#l+3~u+p@ra5FuAW2vti_4x?3y_l?=rl2NvG(4t)q~V)hYFbFq$E zAT2JUgsbL>K8q0YRnp)_(3%yAsm1o`hLYE?#-h`aq#2%43;A8ll>>#jxos9l;8C@v z^u$6#&~L8Kp=%VVIxrI1&iZLEe9zxUlu?!VvGSuBO^Af81KU&yZn_|2e~cz5(YiE~S^C?!F?pFzoLm$pqgllH{JvCohjP35D_g93?JYvrz@N1VQkoroL zZbJz9dZ%ooxSi!Qu8#iA0j>v)j&b_E$FpxwplAy|$|UqsI9C)_Ed23+D+{W?Zb@|h zWc?nA0%`)MlM>aGqE1dJ|nTuL6R^Vt4BD2kv2)Iu%3kUx} zSZ=JUgK2AN0}WWZvS2Ku^T-;Y2f^cD~ zvtAQ)06?SVsLZoe!4JI63np=!>9YZ9YRO6KT%U^C_$eCqqFQ zanaH9aT|O!PL>%jln}Axk3)N{JX}^P6o_MBU+9Max?+%}cNq6%+{T+U(D96MyAWTU~rl9GYJj$wrU7ONr15mNa0vzBS^o8bJIg&em3d+KTCpNPd{z zdVS&+yWXSw>^5!)kUS~A@&|w&&?TwzP8^9?$tX^0%n((6tBtf8S99tcR36bOj3&_`gb=_t$dZP8E2l|E}g4-p?VgTEd);F`?;hTYP0JU?faeU2Y#uBJs zdke+YrnVTQM?mz*5nCo>>_G9kU8 zu~o0}v!QRmd)Rs)-z9=n$mvKdFd(YVhZ^kBUsRfmcBIq5-rY$oR&dC!8XNSf1Lv&F zu4VOpB+NI<%N5Gp3yL{%whkjI}z)IqDG84~!C7SCN`x$PYbv?}ZihZnl(hdwSc|?}wiiq2c?iTQ3_8 z1mpwa4NR;?JRc?5PM>pT5}P<;mq-`TqXMU#=|masN?-NqG&vN(!?Ikg%bJoLGbnUo z_S->M9iy}a94ndnP<9JEJ!KwSvl8gvEdxp*?rjtrdGQbvyaYMB!WS|J!!l07JXuz= zvS`raB_?A{Rl21q)5p*6s!QqA;ZMbM5~LzU#|6f;l2f$h^Q!B7WePtJDEipt(F{)b zro@?DYg$Mwb&~YtU5Tw=?lZR?Vkiq_2;_}A#=y$}Cg;9uhH^wg6?zJ}M`NYp+$H4X z?a>P%_DN|_b^Vy%^$GjzGMa9`pMSSS_d5e}#n98|(;<&WJ!XS;FSXD7?G3Ny_KdLn za<`5OBSS@g@7p%KMB(T@Ah^4@i`$yy>1Jd-XJqs(!KFaW)Tq-Zkw(znZg}KESinuo zeYE=J1{@%btu#XiSuoNwbaU*i2FdJsI~l9GDYgSVpO=?cSM6tOKQnSwUpuGEua=!H zk%U4uU)g39qeerIfFO&_wQsYSPaemXX7HrU6`F`%I2I5iSoCxJ8D{h-q$y?w5`^Sme% zqCI5Uji}Z}@={l)UDT;*=bt!H^|F=@-7Pc&^+NsZZgX9vN%@-S2@w}W)4H>Bm6EXL zZRyKz>;$YgcELlYt>~ihy&V@;l6VF*$9czQ9-TwKy~(@f^{ar;4QwGYYr-e$@*5BK z$Cwr;uWCFcOn$PEJ23TuE~)Ytdf=#f9;$gj*iaT)&%j|=&j5cC+6Xb-=Ro=;q7(S3 z3SzqV66DGU?(>EVY|l5=&(s~R$AI-SKa&gQ_kM1N;OMagde83_*f9Y1)DOB{XS1A> zg}a4zl~U-|H}t0a$;@PRS)H9i$Uok(B;o-;!|xQd{?G}gA&fHmUIvT34yl5@a`%Mb zYJCO5R~?{XshLCuw+ZA02a8#(p%sjT{p=W3G}Gnet+r!;eMTC9b9}AMJqxZws>$P{ z>KW0>Xd!o0{Kd)<6CYaAUk+MQNDjJJ9ZJ1B{T+^K@{C30XvFTAi7)uh?phep!iUbr z*M0O!m|(x@E`g zFKWbWM4;kna^(RknQU_9h1Au!^CP7DWNeR+Zvg&oh5|E77lvW5^p|ZwR6fR6k!0hi zosI4O-#~N{f?YTuPrQtvT~QiCsK-c(elzVSNLMnBupkmbC2H%ZCQnewKxKIZDKLfJ zjb*wh<;}2aBpET`I#KOSz3#p?L6jY^FG?psBJq7?Lxj40i<}jfA|QjwwqIB_nu3EY zHr#c`){%n7w-0a)aUj#XZ{`v8yc)11+Ad-! zF>Mk_JK(;t^GXe|QxqhewMy%@!YmX+rVXX=jSpu&?$3R`1f2*4ZiPdGbigaD10hYg zvt4;7*MyD!JlgI_nE=Ap1J_`|%QX6OXv!|VgDYhl!a7Cexdw@qt+j}F@Z@mUjrf?hUK@|c8&HE#&<3fr zA;O5Da;EJ0MZE{90ExGC;`5|tcieW1PJZg*iw*U3YJre z3^X^4oEanvoWnT4Q%F}zw9!W>N(|Y@cun)guo42YkrR=7nVE|~tOG?6GOk^Cb--<( zwn79LfXEmUnOF{IZM@*nM6o#f`v_i28UpZ;++!m6d2b)NS0FA=AwQrLJpY;&V_SlZ zc>;=<+|6_k{**AJ|+yj&g9X>a{1Ef4YJ`bPIgQhGD7D2 z;4^ML4?tthxYwa)RSNwLu><)=H;io^ge)DCTQUCwhWK z)1xRnut0nZh@@j|7R{m79N}G1%7p4i?mN!{41&=vH3X4c>$h(k;f3Iw+5yjnWizeR zRCR>aLn$rVB{1Vv$~0wj(qCjM@`SYEqKepNs2f}7M!2ifB9C1#WDC)aTwm;Ql_XPp z*=R|l82xm|=Ok&Ay%INu5p^jVE<|XF-Ffr5bL}lIdcT@c*Q(Ms7W%Na*o)}4hzDyh zEr)C`=HlvWjv9R*PU`=G^u`tCLZ}+810GQ%gdr#iq{{#VKn&1Z4f&>%>WWOb`K0`A z(vSw2sX^V`W*y?+bJ`FYsf|3vCowUgDY_?uw?dW?wYeOe^CCpL9!8(++0~J*!;L+t zDbPktCf9oz9=laX%r~IOYj#p#<(xSI7BFHUI?I>7vO#*|2K$-<(~*z;27y#m@3jPH zLpwjw^F1Z7Z5131{k`RS@Rr}vxnnD=V=Jzs8`SG7#m&3@{%^hyip_3)&UfeFM7p>5ZGLdw-5v`$aLo}>z&RPUTc;IO@U=JobL5SmB25Ki((f5UNL@3h z49cjO0@@)_t?0-)&k9Ck$U{9jWA~*|IKpwKFJm!?35Ttk8vTQ#isluHdu#-9$iOVAgV&w;H@f{pKx~1FkBlU}bDsVA=(7u}t zMUrp##MSdUy3M^rE|l1kPxUO0+Td{eF}ckCL^MHI>T;m9_F*6|nG+QP=*I{3k5 zygN58wNs+kbp8B%!dLKtJbg|{Me4#T#xzj(=om^gucltuC;K*p^ae0;H*WMoQuJl; zlVx8hZC zv!f;-W^;sTjm(3aQz0~rqQx3-SNJE zd~g(WOC4TpF0-Iqzqo(1XoP|77HZSV=*!fRmUPM=cUf%QtZU2hKKz*IKosH|Mfgj{ zcWz7O@|H0CbJ@yO&V^L`W0ZhCovHcG#Wrk+rVL4|{Ez<5M;}ol&DFOjZoa~+fH0fL zZ<0`h2bsUdP#+?>tOkA{6vGxR ztl%blD?a%mKE^M8-h|X^&&1t8gyU%MxO}q0X7VV6T5fq$rEwH-jL*vJBf2Qjh+C8y1G5+%-#R zc-?M518?bvzidLo_%*j$)_uV@|GJE8n4D0^h8ThnB``{VXdSv=NVx2zIeJeqS${qA z%*j3E>x7$YPJ;}%kow$3@&W$$G=GA{pr`TkGPUOCWopj<e_=OQR|orl z4Y5p7IhFq$h4x;uQKyJbH6m6^X`RqS2orv|ku!0DLZ5E`x3_GeFW8>!I39hZ|agSfw&%Y0c8Gu|y-1AYS8jA{!gt;T7WWOI& z#~xF18=j=kGL6r)_n(KHYV{@PYFGF7IK$#O&)=Z1z`A%XS7hq&#KxBxFgz#nm>De< zo4uOvXfiC&4kK+U>q#$09;1Jh_H35;5gSaZ-IXGRH66C*8_WRu`aF7)cG(?L+zO zWYr@1j<3@?lxwr8MJ&Wt5`VO_0WJh}oxdmB0dj-(4<2ngmQ1neTHJons?!zgwm*TC zsEHeQ?IznTmp<7D+qa?Nxj@kGC?4PxT2n!a6PP0`{v{tv zxFcf^W-xpvH-k6CJ$xkT&LgBjVTR;eekevi>!-XXB!PhU#=#;1 zL+zrmO~vVT z%!aw=^KAgKDP&!1FcfSeDqI2hmcidqu&}404f`B~p$7#7#QuLk;h$Bl95p``95ciZ zJ}^$?SYn3aP~s)&pYhZfl!K{;kjTiAIA7$HQGI)5oI}F&FXns#PdH-@J_F)!v0oL% zRU|ClfczRo2slCW(oTrwv2uk0jI*%KdV~8icFfuPLJ6*JhXt zRYI6gnLjXNr>)C^ySP)*+fxUdbGyDhWdcaBv{%^BFraz>=CB@1G7iQ8n3L6^;J}_! z)t58f{c6dtYQ3*BPg$swPkhhTQo4s*+zmnqIiI3$#wu|sQB!$%fSXjZZMNkpSDHm# z-f62s{n!CbFFNHcNidAJHRxe<_2+f{Vs9}KY4d8Be>8xevB+9FQjrOURHex@qGc36 zr}lG+GW&Hl!Ua?r=Z!Nv*(yBLBo2lEY)Qp+VJu3m5h=UMrmFxFi^LQp3RP~o+!Bl4 z-68vHwUiSwU?<3iv!mM1F)OKFte^3>vZCvC6sgT@-9#{<8uJih+Es0|0%A&S1Rd5l z=o>6bf=&=6B?MeDo0UuxnDc2f-$1+aakFt|{y`wX=2__s3VJJ^@(P|+=mQ~PF>$oaXuJi}v!L-6l>Jab?v{`? zSkRIXKy+FjdxXIQE3+*pv#t@ZWBK5lAM~ApuChkBczn%to^D+ZCd9Oj6@amM9^j}` z>|fyAnEr5-dc>4rN}=r^z7q5>w`gmyrkqxw)!A+R*zIpWmz?{hNM27rsO+rD@&Fu_$zjG z(%j&>cC)NC?I8`IeHNws`6gH03E6@S`sC}Chlg*PNtV`*ySu8zM;Nm*Yp;F6k{kiSr4jCxdh=+m7Y&jVPSqtb z_P{H@-=MzEQ7O81DaCi6P1CO&S3`_}2q5E^pyQ@z7I$w)LPneOzz2e!56@w}9^_9$ zaWfvCA^zTwM|ixZVWeHHd$$9~qkq$LAr!a?^ zySLd_qXFmr{@V`W7UOC2F9Ywg2RK>f)a@d4F@r(sWU;e^>MrP`k{K$m-e;yOP^S>m3*JKIeu>| zIO7g?h6FL@vEcEWI(RrZJg#p19FN;F=mKd0SU{1^mhOSQWI2irtHB;ICd?-E<;g>c zMB?yABI#rO|wE+Ty77q!s+Q*qZ_c_k7{YgP5|=b~V*b*;1*ahq`!CRFv&LItLy z=&iIX6DK#sE_kFjm50zwAs8{|b1B}k$Abmq%^UE6I)jr%T~--VLK!%mE7o=LG5M%$ zVl-N{P}gB5TJ_ph)OJP@J^G+Zc)_hR0{JY$Bg##W-nWzhCg7vzXy~+A+lTo#K;&I1ONw(lGYRsv=`S?Gm`|EIZ`>eG_{c1QcpgE z(wJ}sqAth+^11t%8X$z_Z+dE*o6$?KszvR5O(0HH>FUpJFwB*-GJNd%{fCqz-G8_H zseYgl+2F9ep*2?0r8K$M(Mf(QF!N9&oSSV4Uq-u_GqY3B@;ObCo5!1LwTlW6XBH9R z(m9kpAA6a7;1}X<{g6+8HJF7|yKC(a=hsT8+dr`C(SzP{>OmJPfv`tV;l0;&D**h; z6gI(=rYlHa#oH1Y^El;a=OOPODD)%+me&EmX4f9`rT z{5I19Wk+nB#VtTG8z4E;UC6Z?>u%o{zGCuo>{n*u(jK%tZHNmLRDoI0O(w|ekyrq* z`&Rq2v9(LdW=5ugqW5h|r-W#-Y$eQ4y6YQZcwT z#b78I*q8FsQLih;-Rv;p^qiZ)_kQ$ICOq{LY{xNA;VZHxfMGMNwyv(`SXh{U%lX#b z^#Q~fSWKGOk|PZLIfqD)JhZ*VV$hGKP93&{F~kUx1RkIB3NuqqOgw`LaIA)x+F7MX z7LB3CLDHYX&{3Wsw2!9nYcNMJb6Gb6t(8WGcmk;>TXl|>al-sm7<1iFlJ+#w(9$49 zx})6QA<{9&0mAfHbCDl`-IMbCZ6&>ih$Wzxj*_hJAV4C4aNL#;*mP)^GAg!?ah!X` zX!b|AozhjKvF3}1xUWQR-|wAd9NmrG_P0Web1Ah4T0oToDg$%0K5TUUL8p2Nr9c7$ z4P#Mc8}WGXHb=$t-I$5M_o1@dH7*2_^k*2tm+ZMutV z#;&l5$S*HHLdEc$j_9Fn5PL}6=Q zQATBtwpd$ZiQjR}GA)jNALbqkr_uoOlhjR2Ws*HWvm4wM2h2O2s7DW6Jdb9?Wm^UOx^uWf|m)OrZm&j|?OH_wP^L#`%rzGyQ=*8bXe z_&XD+Yqhi;pG=_tCrmK?4<@8##-TJtQ58R#2*SNA07s3CVWT7$d$Vj>Zq(y-AKgHY z?v_T089?x7Vj3ba%cfIg4g4Dw2HoBMpo|d*oVzUvf*>3yn8MV7IxTjCcroL7%;hE*IDtoXj72IVlSv=C19F-};{V5ddnF;{{b_SUkf2bfCCmuoW z>G-6Ad7?N=7<1DweBV`z(X~pNEO)s{nppFY>>KT<+PTx$V92>CglHrjW>C!RAZ6l_ zXI@xvtzVf?gltSgTBJ06`wc&W3pCJl3bw5VYkYmheRc4Ae;*{{>2K`wyyf6rNUJ%~ zeL|sWV2a6ugDLWgQzfg^MPZl`rG!6-X42ueZOe3zq4g_Gb)((a_V&oZPtl@i5DQy(?6)d{1?Q*0lkH>SjyCyev;lIq*k;ce*0RSEg@6!A%zlXbLfyWz&h1CrvnZT@To zeVuy}yPS)Sl&Ls>uvu5$fr;O=SEAAi;1*A64zB`59f7{jJ)d8fThQ~9p}7y~Unnd1 z+K-4@nCl`qF_bZyuBHg*1lV~{KDe)e@DKIyybYJWK(>wJM?b={2Y?`~JZM%cAJudV zzlQKu7p66kuI{dUa5Dm~E#DCSP6ft&QA`9d5YY1{8UI&3`)g%FjQGZXYm_(>CN)A>tmHK@(l?mcY-U`7fo83n$_N^FIzRaBGLL9_b7&Wj|E zYLjdcr4%3F)D-KWR^RfVY0EfXvPC1+fm)zo8!pu5N5=U9(AGAz@;&d#nLW|8jwH~T zQhoNGMBBrle22oaGr&j){@Yl$KLXx|d)(gr`Rh{s2Lk@Dr2~Jdz*1@|KE*;%P(ZkL zBi#tmrM6)Hil)k7Q8>ZmeOp7+GLLg}@sL4rg!nGx*8qVrP9HikWXZhi#GI_0RWEaQ zcXR)b=VzE6Ty~T2ooWcUM^;(l&jDHZlsAeA$;4K0Sh8YFc!PzMuz>JNC;_hV8co;E z^4hOQj#f`GbqsRDyW%3yKRKj_U*`hp_I2iWbaoY0Thhn^)ONnKPSqryKofP2BTluV zO))B>!hfAFOKWX5NwrHPjjT3XYcHW#=%RzIh{x*5!@v#m;re;!C!cs=4msJ4EUxiam#Hj4xmIuUFg4mZn8=4eGtU)^C-?YC z7w&cgAs&!X}S zONes0Fxz}x%Oypc`FFLZ_R70?d~R=NWQE2q0Y=nho8LWdEhM)&%vkc^_^|a< zF|piPpG|3G!Li+N(=J)m&6i?gOJ(1bLtS%?&L&tGTFaJ5`w6W;jikIUBsSUE=n*~g z?bW^H%{GfUX5yT*`BD`QZlC+U9@V#wr=iD;U`|Q{_-j0M*&yU*X&PRb1m`%NU>Y=# z=~(XZXm3F^x*#m7kzxcV^EirW{~=9_9Tw- z(elyY6!7vNWgt~mE;K>>Y$<_qZLyjI(L7KJg+`#Fjk4v#BugqO9JAhy>RN(N2goGR zMNUuqVa-WuyZ?UjHGYd1>HXw_`aj^}UyB6(OOfMHsLKcm8I&8r_v0~yU?@>>Y|8&Q z^0J8)Mx4(72)pu%2zT`To7K~AK*e$#iuFwF6j;V&&K;`E?4?Zkq z!XK^WBY2>3wB_+!FzD4OH1@#wj#j!o5RvUxc!@d3@+8t~am0o_yUK=lLQWVPqb(Wm^ixvVLA6G^jEPhHK z51nxfQp)Lj;9ctv=NRT=88Lj@(vmX(_n%%(!eBsmBVjyS&d*0<3AIlwo?T;&uGT-X zpwvJWVXz`GQUbpr5nyj*K=Sb4qPne|>L}uXy!LKb$6Ap6NOoy*}c^nQJNf!~9!kDf5B427Tjtocyer&vQ`b@BttorfC>uor>M z&T6%#Sxt;oqCP}^#{aZ&S=&IN8zI7#0GiMcu^pp2*JZZiFflN5#^edRZr1v|zhXnV2iQl_@B`Qwwat<9m1=s|2_7~l!c!y|QMV}kXQ)=C2YlPA6*8UqNgFi}7poAtHq4W{*9TEOd{ zrv0e}53shd<4VLWXr<1abp|P%^H!|hhPu|QJRg#aQ`~d?++CS`jw3|otEIgze(6{l=K*vlWr^s1*vQ0$56-r@o8rti1-%oywD0~(D zRg&PP%JKu?wZ=zlh@`-5jvQ_K-*;yH`I(1H)jxXv!vpYN-Da48lFh#82j z7n=yfI&6SLtxe<_t&s#WPyd7j{}O|tp?^*+ZuIw&HRqSKwz08 zg9wmKAChyh5!)(?uyq(wx*JWlQ5hlbdtH~tugxZ{CMjfwmQ<_D^jyW)SjIA8bD-c{ z58MkgyZJ{hDRpls!dlt1aE;c9wx-jRO6;vYuW>ibCi$-TR)*M_cc!r-==NWM&!bm3 zec!R6MT&tPJ#mMQc8JMHOs&ptbSHZnbK=K=aVMD+f$11ILMB;{;c zu1`%m&DJ_@REs8Yq;UdUw@pEtMDeO*bXHi*|pRfQocu$%XDmuaGq`pbuabe&0>ie1gAB*RGD9YjzG(X=i6oU$q`C8831sN zrmP!8%q+ilFeb58bc@&;O+;$$JACSUVAqc-7K{i$9zYSvY1eHKWr?v`P_6_?_nfdp zLIC8hJM|r6Ni;8F`$ZJxcY|<4U&1jtu|Zp2rt`4ANkEErkBZ$Me9f*n(-JgStds1_ zG0M<(7tMbv zv*v)q$$eYXe<}0-4;i@ZB;nitB!js6FET=irQoP!Lz(dYBIAny|9DNhM`vBF#~(5p z3;vChrRZFk|Fa)nFW(u(#Zc(=IkSAqSkT5i59Xc#&it$uSyl@pURAGmpE|q zU&>tmN0|>ll^N?F%3N#@63#G7W^6{!@~O<=6@3-F7Jrm^6odJ35b0Byk4^ojc^N;I zS&!4~AIdC8)<5ywgZaYW5=$FCZ947@tKD1Wg+2|P5)`5GgQd_oPnF+^_UAoS{GqP; zx-#aYTY0<}9yk3FW=~M881EMosbOYyS6)%=;c{Xd$*|h$JtTY;HP;j+KpAv@jhys= zyHlJFb2J>_?$|PD&g{&yWDkZ)*P_tgd(tA@!6_?EPAct!$M~@QOO(;T4QEC-@xD4(`7!%Q2dLGE@qj|x(&1M1dlVbNlC}`+e&mD>cjw# zvP!RmoTrG&$oWCa{1%*E{*@6WDxxTIL}&aDXC~4O%#`hKSrhjR(+4~HN_P)e87K(a z+jtG(Z53)6Dxv~+=XV@nJ%;BK=dW%HqRAEsqa{5mO4Kl8L0n(GjskAGSH>}9id@x>4VedDcV*FF;VSG z)OS{&@7Bs(G<^;RB_G-<`1kANPvKcGWXlfILvss{+?)(QcmLn-*C;)x>bv24;vi7# zvW8#2gW2yip?OqF>M&*Zd=WRnjM}k>r5DNiKElY>%h+BLT-V-M5#rQu&BUtf)mMdm z9A>}csK0Vu?A4p1nbKZI8UzbWD@itq-0#~)6|y4-uvAY26Isqw-Su*7r~I69e>a+_ zJCFa!;YE1<)`QvjCt4n*Aq%RU?pKUAtIhyYzD*Xbqm@;E<)-vRtEKxaZ^F_HQw(_Q zBdr<8XY4f6b&YSe?&PYPEgP@ggfxl)uImGt8oFo4Q1^Xq%)9`iLK>h7`$crUizxG0 z%}k0^1T@pjMBq2F>5=q?7*?AdX7%)U#M42#oea!WEM|&ADeAO#Bu6x9l1A;#J)v`K<%&KGGkeP82NJio zPiywB;30E1&@dL!=p2(?#HUNHyUL11=a49!)@INL=cYLfjhj@$uw2k)PeK!$5m0u)MthU zaI%j2XNCr+*#GYgP2@8}i;ngO#d(fRWoYC(lxpg2%0iG#ywJ?4@peRNg1q0E1MahF zAQt|hAu;HEKw6b>b#f%AVqLQwC@6fj{8$H)TiIKYaIH~b+s<#h1+H17FYHElMh3+! z+CZw)x~yms|Dg2Jm0+-vsvA`L%+O*Znw|*${=5)1yWQ{l52@h#I~C}E1`IcSo$ZrA&yBOCo8h!PV+@CN)&xn~<#@UNH23tk?U*R!{m-+L4RQk4Tp z!;@ghEh#;O%24Y=cr+K<2~Eb7fkx2-jM)91n7V*6s&PiPDaNE_q0x;^mA)1uGn#); zf%%6DOZ}Dme^8O+Q%Cu4DstD$Fcoz;JxWDP)*`@Lf3E2(CTn zGZ~9~x>S;iG*|^cf{0M+syK+`qzdwAB4fqcvQRHg6kft@gRv$T7f}~Y-0Zva80lESIBWuMkfO-o&;)Y(4xh#{V}JiegyYe^H_HvyX*|mc>+FB1x6r zgJhdJS=_p@V>)<^t!OEPL3&+ru4?#171W5yRl_}MzpHuxQ0;k;63L{EPli=NLD{>bUcw>07f|)oHYl~h^>Nbt&VIP(@ zU`_a^;BxroaGT3)e$|%!ksxsxoi4|^HY>CwKUZR9PZzP1 z;9%IlHG5awbVxi(Y1{rBKzbaz2vq@-X5^!YP>oC6Ar6yy{MGJ>MiXsPO%(mL!ZIJJ z7|90jd%?X69;;ED3Bl|T|6%|nLN-ERl{;EzV|>z)h`_l$dDcCCkK2pH$R0$SluROB zZ14{_6U?}w51_we@euhy-u>Cz#|#Sur1*aIW{_KL{hWg>#oE1`{ zqYX_(*sOX^W~HJHEjEB|9YqB$J-#!@zS<-+FDJ*&cO{C{3wphKBVMfBF@wzgzU^=m z{1L+Pz8hT_9Luc&9{1=zAK%~x!Sfd1{LSOc=iB4MImhedmVrNbPuQ$%a^7r=vaRzT z{*xAK?aG-rOB3VTn6VDIc1?~FO(8ov&-zM)p8eTSXGROcWBnsA2mSy)I(5Z4Er>l> zzLO+mp?s5D?TpsOcv+TGxDrAXVkrk^sMcMbXSi61SaPtOIFoo)^o!}J}$YSXHnBoFC;c{qjreLfAN5f=ot~*_wo*hC0*)#!sSw1^kL47Xcn5-6|Kn6>~ z*bjJsNlCz*C8l-}eUW$}_TY1=NQL3a{(^)2h_IVcziNcNsG)uS*B@)8-i!Y8S*$vK zT#dji1sAA@F(4V|`Hp$*Vp|e);X=*;9`1rnF8s!*O3+yNG7_??;{i)-9sjVoSj)Q$iWXnj*xR5tpKqHVK|-M$KF{eC8lSQ^gWsif?K zZ&;qqla~B$-78|Q;k%rUD7NMTv=1wjuO#Tkp4FzdQFdhF zlxR|p&s$_ z9mnDUbB@3}rv8>8MorEibYT$^JN1A)i5)@kUWT1wE4#jJPO=~6ecR@>00wEj<~xM7 z0)indzx0|3=e9D#+KI;@!^zyNS`t+vkG%*vLzQ77yD==jND&xzekB+VnF~^50Djeo zSy>&bTe=4)_+~mQC&7@5BbxvYTVzY4Q|9j!+(9X3b-2NvJ+5%#HHLs3;PG;#)Nln; z;~AS_!_;Rp#-zeo%>z4CK_iWhW%ATsp*Y5*C$X&TgZ$Um!*z5XG{yQ>Q z2;ST2PoSIP2%T~Cwra6-#B6p-_TWv70()X=`X%vH?edjN#QUNC@|~=d!ITs1^%;e=&4yuOMj=X&S#u47+t62P z*6&cy-H?ZG_eIi|_WoR%0pwHqzLKA473;`QQKIg^zUWH-p%W}1ay(sM*kQ>It8@zx zKhkK84N1_)#qoWk`KMVh2>HPV!F~HSMEf73T@-Bp*(Ub)4yr>9Qd99T;S(3F*|sH& zMsV&aOb*xx4oMCH`WGpL{vXu7IZb0~+i_Zk6j1Ke!tvR=bzgdTMQdiU$(F|nT7L$Vln-{Ex6H%zOV3Y-&fARF=NFI3 z4zTR7iM>2nZ<>A{(d#Jrw>Tu5vZKMjSjxx{6J?w?h-6-+J0?#pemccdS5+WSL?2RN z-bp(u@^9+>-dij)FESvX1^O6X6gwXp$)6%&n`BQq$V99(yhZ` zxj2W&lX<0{rG>~dY9+FOFlTk540ST)vihKt ze5V2=6|oxS94B(;u)8uP$IxQ;Kn%sRMB_aEQ>C+*Wn$#kxp8t%c^g?h(GIyBlt5t(Pf7dQfs!RsZVs?uIMLr{$% z?LkpZR(5AD!H+2)+%5u)2;ff@WQC(0Gk0k*4FN_4WZy#wR?+WLVk%lUmp0^^3_-i+ zhY-L5D+)K45U`Kv_*d_6aHAy6pj{m|VYm#%H_;u1UZj}+jD-7mZi`3Ksg0Hwi;-fs z`302d5zJ%Y14#An`SZwTTq3<(XA*9XtVk_cR)gX$F8>%1uIBxlb*-dCl3p zs0rX=;}+mSRS5*nWpl@dsvh>K| zix|7GIicqKNsWlnaCRXriLw)|`H5FGX@(d^O<1f>1G5(z#GmMbAm0{*!?+Ic_0|1j z^F)ABPz@q5klmY@_v-h~emXt2+d*f7$~x#uEvPX0J!*0ZLszN@Hu*#PHhUTi%xX)@ z8X8^C|6UjP=iNI!ew?!6(wLrnj&k4%7y~DsKxFbXrr9Ir>JK@YuHQev`U{4G)(vH@ zN)dtbM8jv`q_>LU=$1FBNZ<}-@-41a1q0uGqurtnf&~hvPy$z4_VUau7V!o!E41Yp zkM>*k^ai?>R`9ju|L~)`LedWmLp4417Ge#vfqNN2(TBEC!9in6&6I1*j2D^tlo)FT zgm6hex<=T#>KPdk<#08;f6molgIIfNPuzZt#4sg}VrYC~Sr7&{Cclx#Y`&N*3#?tx zEzc)_W2(h0siiEHh@F*-pUn|FD@zpV0w?xu-28=KuVOE0!Y^r}FHwn`t79y|CZVSS z_cM>{Beu#TH^WpCTP+q}5muUEE{$!JOQ;8w=36ONh@TK0%O~VZIK@)Wi?u3}9Lrl_ zHZs6LU(Z{M|H_I(35U3b2Q==`0V-p1{n?p3k%Jin;1=Mz#{;Bxzq#q1v%*VOljDxcPXXFoC*g$Y;L`ymZA`6+&K8atNVw7Zu;^=ZSN`2B+XCI?@4kqKxv`_Kg;+6<+ z-nUCc+@5g^5TO>#5}iD_^Lf&URmLz`#T-7s!?af?7b80_=<|uB9oR2Y+G<}Y-&gX)F@^0qDlIB$<9DGC#;3n@MJfaTduAC-0it{uxyCZw4 z7tYGT3FI!DUU!TV4nEcfT;#nny`&?F9C-ysn%{lnDxN+(#tXz*I6~vfoz82=U5n%x z2>p$mL(Y{ojGF495yBv&@F3qM1B-4y3~;D1?|EZ&5@Kc6+TI;)#dod?L++xT08zGW zO?UQ<(MYM%2Xu-Kf+zKtEIT4|EiBi}F!AWbo~i209D%>o3hU&Mh+sEm@`k85vOoh9 zfMS$4l71)wq^A@xxTr|Z&;imji;V7x(q@c=pqKUO4R+_2`>fCAV36{72(eIvkyD0eo9gPF+8#ZcRBDRU7YXup5k0AOIg3-Xuu4` z_)hfEx%95lzV2w#h!ltih~**bcN$W8hrk!xqZwqpHP6}}WO93B*-X?5DAVHC9Qvw( zr_^#S6u#bb2isqx@w|Xx7|gKcK8;OpB8Qfu7Ky2{1)7YX2ml3r8ICnY|6z=DuZb%@ zeX+d^w|mb_Ov#eeSe9@}((ZcdHgT7$@8ZkLSz|$8@Ci+j!J7Zc4DoXA9^v|FLnpRy zCh0-Z$B$4R8L-tmGz|@2EVBSNJM#lWdI>@BaM4Hc+G0njNkaU5d#K1cG%)m4w-6dG zH(_!^hwx378{m2Dn|X#{%)&y0;{JW=w zeCGB;M~HhnQN~dHbJ28vs98roh`{sm#yM6qB}|%1yId#Vg^EE-PD(ZPc51r&$_ioTwM(m&nxw`z z8bsKiU%Gv`y6FE2q@fX}tku>?-QYKCHyd8U)en0qH>G1`&t%DWnwNmKm~Jh ze*yUR)e*c_HDv`Z6g;fZk=Nv>$Yzej{8s)YGbC>??PYIiCV?`GL?R!XN{C| z#ejejJPYjBpSQ1OxP$J7eO^&<&XLL9=Q5cq4-EJLb73b3la(gbJU=*;Nk97&}g z8Uj4WM552eJ(Xp@xEQHaA>q~)-ak_DeHCqisjpCBoEEkYwDD?crbhGNfUlP=clHHq zOz7Nrg4Bo_?C8(^AG$+yF#l4{tuC4@arrEQ4h} z9#^E%V_?058wi4Soo7O`vJQ~H}H?18VN2|v%sk5>H;E3r?t~q z?&VqadLti&3gOVC?=Wu+6;GB0)Y7dBaM)n#i~%eP16$YmK8eeNt>+S}_XTn+60)-G z#>oZ&Ia9PA%kI+mFXccdGB7juW0R=0aYQ7GS`h>B==aHm6G)NS{1GeQeIY!`-I&(Ww+^)rcmqBekqW$}n;P2OJ;sPv%?g$c4lsc}20gTW{CwAcrEubw(2hc7WNuu(_kMdnu)v)@I8SNK+87zvp%CgxWG~OqAxCw3&V$AqH(-0ph zaUSAp3(NXJ&vz`~@&!;k#8E;w@j9bfCRwV|#gR;*2R2elRVtofM5BEHQr19AZK+ds z0C-V!FB03b2`wF@bQ$eNDw2&C8F|-~ttd4OVn?Kv~vQclc1BQc)9?s+8HN%PvMP0)@M5sgIl#Vzam?Xuj?M+&5%_) zdEgbC&Jw|L@R6UB(ES*$ldl&vJiFr8`p zw^ZdVmU^H|S(c3gF4xJM^u=emjvg;Z5}2Ayn`}Q7?!L?$l#ypvtRCRR&TqK83xW$d z$he1zBQuNJh&|o46yXoVeM9 zZ*%fmEKunOio{vGbqj&B!^1sunXBC0t9EI?RX<%v&-VuO;d4^%VuudTq8e`C+6SIn z=c}E_?xpVky;LBivffhD`1E`$YtofFY|vGut|ol?^~dg|FklY;d_IE?GiFjsf7EwLZ#F<^Cl=QmVKZk z2t|kp$}?f024CNm9$u|M-eEcyAD4nMMjSl#9?A7S;pb6Gn&o9a?FHY&x@Lf0RVWmBp#bI@q2(w zq3ucrzg=X|^CCk$Ncvic5D!$o7AnNYH(_ENXKKWTuFx*=Zcg^Xe7z54Vv4RzaNW&` zfM<>rT5lG_gG(d*!%LH%H-AaV`^A*A=isj|i~+xm`uZUT#DgY!y7^7R+MB4s4*JQ@ z3Z)Nh65FlG5Abx8d%JUf@H3qbg({a5fON-fNn5&mlftE)`FaVLwAB(aSCFtfC(CEl zKa(4=F+cn-z6wOAU)k{g^m?zOz1i1gcay)swf};?B`At1{B_Tr9TJh>5F8Co)7GDm z_b1%qmf!a>eIfqu2Vrsf0RP@G)?@H16;9XtGY~4+M3%BQsl=DoUg_#;^5aFD*UrVu zj=jUns?Beb2Gn7sGw=~YbdjN?^iu@M@%G}q_3=%NW2VjHQ`+fSI-|&t{YF8qdh4cW ztwu{szlB^2wMOaFN7Bh66DQGgAqxWgJ0cp@W|{j5f^_MX^uhMi$pamcCDUkL zFpVxMFpR<_42$$tiFz3dIxV0=S&TFETDM%8es}0OiEqZTSHsysNVMM{8l z#2c5AYaaHvpa;d49#D03ifO;QO)T4Dr>)|bos>k6(Aug)2?*NurnxX%1qE!kE;Qor z%ohpoTa7z-wvEs_kc)ii?42iYC75!WFxaR(qX3OcB*g95MX{?YOG2%WA7G~OPqHQM z4lh)J*>}=v&eKA>%pFn#q6eyXp0opb7>r1Q)gQ?S;0=!WSp@968WOMB4OaX-8ug4$ z+OEUsdokA*Y-xgCU3oR>4CzK`-4hjy)B)RgrpWA3odiLHu06ERT>^!XSe6Dg?GqGp zgMz1CxS>|o)V*`)Xi9;x6G+4)Bb^wiRLr_(chI64SQ=5M;ps-P9>Wfr7ok=sdbPH1 zOv`a7EzDesJ=bS3D9a^r#4BhoYFO0mEN<=Xir^~K(%!JV-~5kwq2decX^%64@4oRn z7M7d|0?9*iyk5#8BfHuz}x2YnrWV7i^od!e^? zsMkQlU}CVOVFTA6L;8Sl;Uj}xrXH|YcKTrXak7^91b0A@z5KKx+w&e5z@=o(xGS@B zTxX;xHRU;PoKrj{*Mo*pvddvG2AO(VE6cn6f-t>F35&Oh^Jsn;PSM^#Vq*vo$0*WB zy#F^=1f@$tmc$qJ*_`}8R*<5RtK)yeK98$`yK2lQaFZn76F&EcB65U^o<;Newf8fM z0WDc>AW33zgl6>PMGxK7RR|_V+!>O@C!&ah2lA>xNQsWlB*tU^U=5N@q@I#DH92-% zIj)~Qc4W_(a5QGO;K(odY`HuZt2G*QEZki5%&NL*8*MRppKM{V`FQA03N>Z&9u@h0 zR~XgFXJdBP7}Y6;_Kf(VfcuXA-Vz0Iv^w(^nA9oYO*Zbbf9t{hLh;hc=uMTyGj$Y< z@eVl6eQ4Tn*1B8J_{EUqwU@_s*F^traQvPT<;Cw!lf{#8fV+2VGV>||@VdzJ&h<__ zK;>5F|HSY8JjtVdPrLIv&hsw%jNb4Tztz#Ee6}(B7!>Ks)fsL5Oqg`>bPV&_?c7@& z-8i-`(IV98O1O4eugVWjPOix`G1J^KKt*+*ZpNdrm~l1qRWZmK5Yk?7Yb+;AWOB%7 zSsWzdlzEs;Dx4cMy0ZeHKDpx2+|*`GUR~)!-5}s{j})kU$G(;~n}|0~Nw3u;oD(MV zeQL+&&Z3!W*53VD*iwPrJwY{I(dK{Z!s62CVy&0D*vZ0(P#PYj59Fj}jE{i%r*(P! zT6G4hf6OY!bVS!)2Q5@+EIb9`N5X2d=J+*t#DrN?Uqs}bY*ow=%)Kx)9tv!5?kaz1 zi07(5wF7Oeq53+G4Ak5?b||{B7X3WMUazp$NQ7XVlh*O2wLw=4vH(1TK4JGz&$cX~ z@yO9b2-{L@2&@Zq(92GqQrF71b~bKCtSEH4x^4tgM)QRVnSdZrf^EYE zSqDxG8Ai#(7U)kwMi>UF)G+!&(By+dwr?XxQ6v$*f}F^w3MRbEh%(4ZyayhE zjxswoL*tK!E)N12yQJh?bpmqqkVSa)3;n&ZFpv`xNCj*d5R8HGY|!5hcwio!$v^Oi zb@939kXXi_WL?@hU?{Gnn{7n#DUBmW+yOL(Ctm}00K7%O`UPYl`ZX!`)SAs6^C*Qx zv+#!EZ`z#shvhYZZ~I3cdX=`K&a}@(gh5Pyj1ZIIhQc>;wnZ}xrm59Re*Myma8z3j zqkP89>-EP2(CE8A!EWO-7+Mvc`sHHTuyT=3Lq00gf7QQ1Ej_bXbd$S7v%QZP&B)TO zKfOCiOww~Ve02#iq>2a`HZXvO0sz@Wfdi-}Bx-m|z*9AX`s(-EkW;*r0R$ACLvMhK3D__4uA z%of#kzq6AU@Bs+eFZX}5i@1p%q7Cjls2-N7S<6IUHf93@i00R$nG6)Gxu!Z87I9s zG{l!-a}YI}8f+R&S%DoFCAH}a9&kDPOzN$!>ZVvka!iKIBvEU| zh&g?P0#qQ}BWelJpPe;%leP6|o){B;NM9whi7LlI3`0ViJ zmVtXNI8ng4*~p*WdS2YXD5!`TP}Uei0uYBLuY@H@gsIZ=b-B7O$jYi z=a7Z*BX#0yVfqM~u(@8Hy@}%~g-b%0y*OJhBk#H~D`O~3U=T1U+|d*T5|o5cMVfiO zo{Id_t{WHW+3)0lbXwt|Y)9Sq?Y#$Fz)l{ecnqjt^aNdQi>o>QSKcy2T|10Pc!>Be)_kdx{ns^@4yZ?fPH8CF`G%35+?f8iM|ZAk%?^}TY@35Y|!^}Z-;}2mTpt! zXGI|P0Pj#l1e)^@WmdbbJz!UC1$2)Hs*#Uqkokjd*<5&fWf`?G8BgK3S&1Cbei@|aA}ZtUAG2z{iHRe# zw6NERb`-v?KdAW6B1)>dZwif)F)J+2^fi{BX=-byq{rHRC{(7MxYyR%A3W-~7&y4B zG9w)svDzbE^dLg|7m{6uTyDqDh|cJ@_oBt@$clGy%k{+9yNIL6+KD#5`tq+#072w)XfB$U1}Xh~=4GfUrO&8xI8-wqq?`U^I+Uy%M_V znD!myqsurxl+E~*;Bh<`*BqBpS6VAYYE^Ch!xqXQ73uu{(D-+Q0=`{)`5H{Fo= zOO7}Kwc2vZ2m7S3AimwqEwRvpAYijLf)>QcWQbiFH*jeN0~$V)YL}>Sv6YC2nWD80 ztd0$Di&EoIoLZUOXIQfAx`+2`CNX4@=5@@fj|llbPuvD=_d1xBylJeib^{lf0`%HT zxPUSjJ6(_P1mW4H)En?8uIoUdk=}{;l!!aFMKN&U*FQuf3h=No)gYkF?0=5;y)ykY zEsV2&!X?EgA^Y`@fW#i7uc<|!_^Yv`Q1@DzrX|lTV6w6ztpodZKY)Bq(4?`3o7nla zYXmXK&_wNG-YioPVK!q^DK^)Z0_kKr*E;HW9^O|-o>Mq58eyW#VW>)%7wF?wBQn6Z z`11zWE>)$i9kuuP;Tzjatw1j|OOaPcdUlB8bE9i2Bs^6f?L9pF2_bzkZWqu~s?cc( z*gIcX_Ih{>`y0I%WSKM^PhR4gz^StTDQTE;6Ur1^|J7*$E3`)1bJAX({+su)_$qXvzjMC4^7i* z^%>@7pcyi4NBXT0%u52nx>;Y~s>xpF$v-$W-S}1hJ*%?M9F9zknX)5Yu3Xre;31$3FX6@MU^;u0 z_h@cEI$YK_dMz22KQb`e`B5_fTc0K~s^1aTxy#8sqAaTiI#8wDv<-C+PB-(B(`q6^ z_mTW%Tql1Km|Vbh52k$2alw=(SL~4CowS~B1L9zuZ;QL|`xq%sxCmNk-wOJZRu&>X zZ4bC0>zU$fU4*H{yx#A&5mR!4?z=~QS@!}AmeB9AaQ6>GUZuo^T~aOl48BD8|DQA) zn%@vBwU#b;onf>|BaPUL9;2KhrY%-crCcnbO4b-f=5!`x^AXdf2K9=C^H3ir4~B)4 z{q=&SdoTJ@X$YF#o8N1%!jDo|5VrqJ(bIX8$W z`C0NbSo8T=6!TCT5gesrZ2$j5EY%%);XiYzyD5jZ7|w9mn_?YkRvXbKpEpUVJkYVp zY>f*BKD|?F{%6aa?uxY{#dKLABx95GVNtyd`yqV01eW|E{OiNlWA(7#7i_tj;4ejU z@UWn$(j{y$c>I2E-Sx^^;eob&z%7h%b=K}~Hp#;u{$~y(xCEHuG%6aF2Rit>ld9J? znwDd-F>X=#>H3W6{F2=;tCl-AT+IS37^*+jU4(+cfG)+pA$0-1HZL--kGr;bg(tDr z#AtDxiY#oF0DPrl>_u&}<5w9`v^9xaB1<9mLWv%=ICJPszC!?_EzFeV>RRup$#3Nt z%^hQ>HK6m`*RbKdF_J|x_55jq@h1+UeN%~qQk(|BtxrWM1Q@U#iuvxG;$=+_T$tH| z2VBr7{Q$W#?TTPsOTviT??g1@NHpZTCX2eO14a_WzvsK>l{Q9af^kUP3oiYbN7U0A`hAE$ zxDKks_@gdMHiu+EgEtdjThW#*3*ong;~P?jFABL^Vx|Msk-Xw)Ss%yh^`f2Nap7%9 zg^%4zyqyfPr6=|mM+WH>vV1)9e8j3edRL=lOUq}R5|FuQ8Uew`o-@sg=8D>P1Bhif zu@^=c;f7pmgnGiiBiM4J&j8WVb*)P_O>e{^FQ|NCwd%0SzM|nnei$%=yaMrhp%x{63)G~NHVxVZgZRIX~wVJ(O%YS` zp`T)FTNqhvSAA+i{cB3BijkDUg6_AVw4B%1)kHrOaK-0hi(!9{33w|g-KRAel=~<) zsg6y!q&Q4?-j2ULKVEu&YxWmL*cFY^he{!YUWQ-8>Q7Rg3S#opc=6CUToc=&?iAm_ zxgfdz1}kz67XCA_K4x}c@n@%=Xn?&|yM8k1Qvy4- zv<*Ywt+oQKCaHvqV$VDFHp^2a0b{y}gGt(}{Hm6TW=Hh*-iq48rt%IT6;cW?mmmFF z8mc+5(z^4TtI#D_H3;PUErf=GKj)c0$q1uW$=@k4LcREZ3QfZJ2Tj5T;5w>G>d5M6 z=YsY2C(4dCQu*=9vtG7{w<|&&E3&W5NQAri&%~T0IFTnT1vih=^4PvSx9&VdVYXvi zt^R4s=P}_}mnS~eK3dHsZCFUDduYoJmDKD*Mnp_zyha;^TJ$Kef4bmD3mJf{p-C;% zPYRACU(UotQ>BX;EDik;1~rAIKwP<#>dS;EBa2T*oT)$Zr!|zG8A?%7v1YjXYICBm z&!sq}__QD{qX#&64tZf#I(>V9cV8b3I>6n#@p_Koclj6Z`lCt;0;$fn}x4an}GQ@Ye2RQufoqYyLN%|JdR{c zS1TQ%TNqfsBhNyQFmbmTg|fua`E!2g#iI($B9$2H;!aXV22*J+nO#OTo?pW7Tk;3c zs>H9DLG(2See{Uei=tQtPa*mOPssyjgr=T8tT_B#00UJ*Z~Q5kjw-bFj2Hj-(KrWK4tCNgyCA7K;My}Y6f8>ElYk~=@3 zj)dILHwhbL$YSoT;y-Ub&bu^@#%5nSc}jEYL^J((K&8fP=BsPTJQE2h{WRX_@dVt) zp>YfZntsTccp(kX_Zi5Q3gtJ2o>99U=2aAaeE+BD!60;AEx)Qd2>*Fi=f6b%7uk@I z?%zqi9LPX^;Sx&qVJRVN`;9gV3RrbC`&!PwjacjXg!>)RoHJ%J5Qo7uG5u2sEN&q zj=>TQr%$je%C&zOr!{#r4~Lq5Q*v@QHDoY zV(1F}5q%)Hbz`L)-p-(F?cxR8?%?vC9*Q|&1ztqyA}Anvcz?7@I!=}zHHSg+%6XNm zGejn+Wuy3`k5vky&JmpOm;^h3jy@L_j+Y{XxRn&jT_h%Fy)3^X20M>QNtF|Xf-<9r zv|Z#(3yD?O-sgv2xn8=X#HnMMW-ss^Hf?AL&X`5mf(K+EVl`r)jO{T4@g($21Ot?( zpIgu<1}BOy?CIJ7dr$D}xmHmcDIw=>igSM?l>YuD0gptvlh@s6 z=+=iH>b2TvfUatMdQl(p*_Wl4tIK!|`ji*pvXYy7Jx!dE!RB$8&hWUgOryi&^^-OV z^!L$V{ddF?(n^fxpwpi-LujJ-m_pKn5x%6>Xvu*E2GSzhgY7}uEu;Q(=|O6%w-yUu zE@TD*u>XZEr>87n&r&U3bZSMd)wmC)oSi|TY1>kYmvv!nVJsq$f25QWgqH@{IL%7R z;Jr%L7SLx^wbRTIIXT}7BpfdWJ*CTy;`c1H2>wHONK<8`gmW3E{8c;S`KGw}Gz23? zrs$lj=vdY0Amq;q`>k`uaDXK`OkLp|?R}LjG!W6T;=^Kw`(T^g4Te`B*N%D2)B0Sw ze!gURXxJ%;=G;Qc+I=azb*k#0+)zHKln}j`a$I}4dzi%za_?^Rz%_b1ObPZxsWrat zzOXQi5?4?sndmgBtl1;c3vh8ImlW~+gd;8NGUAJE?t2lJSEfGo5_>Y11!K1;CDPx+ zJjRm;zJ`iw&ZqlBXuj7K?N~J=974E*%9fv{lhW9HjPP-5Zexgml zV-zj_s6f^?bhykhl7Vwy4MQ)iNz#W)?E@P}h7{66I?SOy2Z?Y&(wQ+Ku;a8H3g5$G1}wrPdrdfYsxDz zMzsr7q?t`;3`Xpuo3`f=BT-UCP>Ie~ORx5-_nv;(#r&rLoLlfutG_rWlwUiy|FHo6 z1wBiU*RuFa0Ci$@=dCkKG7ajhXm}Mf75yyXzjFMd!=h&%hYw<ik zbap?q$7gunFk!^ot=qNrLekw=wEYBp?tu~h)<9wFkncWu*|d7}OE%%6Z)ucHnWlSY z;E1S6(8sJmg6<_Vo!u{}E%_ zD8a%16MBO04xDV4QCE3QkU_DRic*RKOWI9}=F%vl zvuk364zRZ|gLaBgoJ}O*6;+xS7tN^`zoFP5y3Og;Ef)U zpmZ~Na6K4XUcR2x+4TOl#HZTJdEs8XqYcfp_IULTR;#>K)!{lM$9zKR!lq5t?7&nM{J%Ug*@!=5Mips(9rCre14W z3;WZEoZ74h!d`g|GdD%3HhK=^^?+z$4uFt7F}=|vVzvG}!`YbX@FsDNw6du>kjDIJ zz7Wc&fRUI=WuYZ>pJ;R`5H^WfrQ>G>^M1+;<)b5xwrXg>Dh3ub&hy?JzEDecERB(s7m<; zZe74YgSh{Z-~4G~9b>=49rX@-j>H~UQHN0b)iG-I6~zH}5}lK}6>+*0W!z*1EG+bz z5B7PQsWh5)bi<~rE4VZGAtw1{5mu&=i@K_9kGJbnz+iU;y*)_Nu<}t-t3SvMM!-C+ z*TLWc%Rj?LAiH^v^2<5(zL5R@;}^%jSb7NxS~jz^NL<$9bp?9oVWxVPmb`>ntwh+u?X-*_PGGEl5$;N%JVA6GgLpENg5zYwCI zz}5a4ZcC~Ry#$~Ru9mx@{*&+2``od5!6kAqI{RW z>7ud!MtqIiNVHY(Zv?d?Q6iW)IT=BccGUb@fh^D>&RAn^tuc&cC|%pf1O&O%!t8_v zN%hjUcv0V1^`H|~!K@xr!WXErhEQRz94CB z84s*4zeJc@$Vx1dwHd$hek&@A3(>T=|6(j;)ZT5ug{jy<_&%7aY9x-TtRmCTUgq0toR~|CHhAV59 z&<pzZM&!L zcQOzps;DXRIU2*(jQBvKpfhQqk9avh@wcrn+d{uY0+x$jSjs+h7$WpyTl+L_Urui3uSm*X1?DCH*HM~k)hlPQF~FV zipWqI3xz0R<6GqcO524*)J9M72JL+sfSF0j{<9YhArUkx?nae1NL4xEhl-?!ab1Ns z!X;B#jJm?iy^^TJ1Vl$U1jsG%;pU zgf{T8QyYhO{LTz4eylZ75uASOXlLU?e6LjfTo2LbARd!E@PXpS)^-x(E5b3_46`{U ztzJ<tt*oCn!EigNP+yg+wSdAv*4H+e!}SUmi~n5k z?(x0d1EJ$}RZrb_xs>1oSGvRZBn|i6QKtWhkp~1NDy=uXvI^rRQy9@`7YTa0Zn&@2 zgWJ!^TX;P9CY|9Vu_y(WpIfJ(Y_SF=G$}qpH9E=1rnm@)N#QwQ2`T2-TD@Y<-f9^{9%4#Rm2Q zkoEcBRP?Fo8gu`pqSXJ5ivC5ntN6Ey5()wxY=|`J6_WF6?AD83UzFabTUvt5 zFa8T(BU{*1p0Fz**oH^rDE>^I?2^=K-;5cjeGqRLC=)ag7o3(wC#IvgtL;~khEHX$$W@0)a!BK^%oDDcTPw6zTj(U7et8F%c9Y?gN ze7oB3NjXJaL~&`Hq~bVPaGgUAQm+-<&rs>Yk_UKHPHepPRY7)ngueQ@yAi+<_Zbfu$Y)brnprtJpR*~-@ z^6rZfJglXK;g1l&vC#+gxdnGZn(M85+|hf~t9EDxZcGvN*!}$_NCCATw`V~pF4Aks>z~B^+Z+ilVZ98C6JjFPz(m9b#nvgAcX#BkAx7YF z7m@o?5OdWnPw<33rp$|0fFHk*=MxnLXv-5p0x?$_Oa%dyF|E+*ZF>i#)@tb@R#9e{ zg=x+8#s;w08lr1rgeH2L0pOAd(*tt`rhoepE)_MTibnHb^akbtfmyo#AEP5Pnc*>Z z*wR>%fk2uO%~>xEub>XVm7b{+5TDa>*n)U0W@;OtLHI$h&fm~g(q5%Zmq2ePIFk}S zLu*^{K+KE$)6!4xj7E6%FDXfUNhx>zIou6r%o=to|AYM@OTpJwl5A$y(MQNRQ{#H5 zH*Z}@Gq}ovq)2%&9!Wk<;qg9~tf)WOLP~S@FDZ%tEhY3#a0WteJA-k@^D#>=a)wvO zugVGog z4zzlYgt4Pyf=#kZF4g}a=_q@NnNAP8n=Y9m7g1{!3`DRLOzUzgUAz<2BWj2krd{BU zpj@iH{TcdF3HfqKd7L>jG;$Xhz_M%T^g)(h_?MPU?Ba6~84-FH4u4^3hNq6Q1m?62 zb^-nKSdsA^nhp5tB-;JIv7~tSt0{ zuGd)}B@w-rjqR0i%eLLIjTPIrla6h(W81cE+jhscZD++DqvK9)_C4p^=f3;f zKL24>%^Ijt;2u;(V#&{gkT<$A-XI4Vj_UL^4oNv&PF%a*CsSNzJ)f_y@O|GLkwxrP zIaUk9iSY$7YsDQvBcM7Gq6;Cr6}Lq4pf^Q&Bff*Kpxgs{k}Wf#ZSzS4MpM_cc{E%_ zhkcdSG$gRh6`O34t~ut?(tL+=wNZ4|1zpG$WH`5KsaIhyfX8iz)Nyu}2<-!^BoO4N zF%?&XC2u7G_F}0Kw%R-B@0uJgD2lFysdfZc9AI*=Wr%{VkD|0Wf^j`H?O&!qSK}e3GKP*(nF{jC9uc4T2G})itubh(6U? zv@?_ARULeS6Z|?x(Z?3ssITfGn)a_Mth8XKaIACD2|?+=;|`v~NH1mX$0hrl(w3Un zQ7F^4S*SUNAw3JL2}%MPys@9}JpR`Oke0yjC#ZZ#i?>5QZ0WF5@(oXJiFn3za$;sI zM3kyc0WCBPB2%qw5b|lGZA_=2%`UB-#HaLn6n__Gk>9K&MKmXIF=R`n}F0u>*xL*m2UWl zT34-lrW@q)95=9>3HVu13D26l)g~jakzDx)nRVE(gZ}%Hazde5ZNvv4cF~eYGKdvH zaX0lsGbG_cS5)~9R*1k7M_yr52nYE!Ac<64i#%SL6Z9`2Tl54%24NrjrXmjNiBzD# z0)Coc{toLHTWk08`(qP?tEa93sEqW9eeQ~Io5H3aa#}fJ5}o>-pb|xmNc{(1Ki!t? z{Or9fTx{;&f1|nS0)G;Md{x!J|E8+`C#+EQObJyG>4SZUHlj)d4f&eH9BPc%-QXMa zcV{+2QR0&KhR|sh4Gq)sZRk^JO-m1jkDKq_l#{vsP!kCnw#zdQxPPZt`L_9X{k;D| zwQxa5+?EJ}Y7>K@NF^erCLjF%tVelxBm z0YkjwhZUA%@qtH{+NQA5qR}}jVF)Vh98+&QkTTG>wwqk5e8MpeQ);nFv%nU9qpGI6 zI@$N>ha-*r%K7$QSR85jl~ZNZXmOk3hxkyR z=y-pu48?~SM5nu(8=!Ha8e!Z4IG79!P~yVPjdob#mqe`d66R+yQroIzc-iB(2}Vd( z*Gl{&=9F{M+FdY~baJsz`2ST??4KB3*!#knMCzidi@b@h$1XZ-B`!S9Pz5%OvL=b` zQV@1ZTE4#{nD?)c${ZQ8smy!_`o_LDxN=f&JO0F5IWpbx?%*@xxW2XIQG38;>|i>+p=?{b@2`TC?rFXiR~ z{Mx)HFbjL}>a$9YF9k)LV>vCOpZzGU{>GSb&@bYo<~#bJB^WDVlKXpBDm~1Ip2`Ek zYFZLmB@W1cYcp@>=^K0U6D7U`mOlN8p{R(N7ZWk!6m2Xq0kIgwI$g~NHEY$!6|w5G zAwasE@fI-#73U{>#5#t^-2M9<_t4`DJgo^pf~^DvdeC8Ewr_ z!wcRp9o*2vn>T7u5uU)mfhXN}uz|dH2$b_YKw^LliEpP{LrMkJXe|0;ern zldYjJeXvVVFY33`aG$ET9bqg1++FWi5PX2*7Gr&I7Psx$bHaZ5mSf-{?x6L~m$npz zr!GNbZUd3n*;22yPywm-qOa#*tc%u8lWKkI(mRG{gx2TU=Al^ol4Vyt#REn#u>o>{BN3_%m#xayNhH7PR{TtJ zhi2OLZr#0UMhU!DtmwwoI~#{pMZq`%RlX_(8Pc1O*gP5I`f3s@Ac7je@F*<+Ehf-j zyQu|6Zd4al;2<{w_v+kTpExcsRuvUdk@Xfz6pswmL`B9sVw8NPe#ZVd$bZ9e&_8(- zb-}_AR359=$F_%uv{&nUNtvn1*lO830d1^LJay;;p$r`I?!B=WXYRFW$Isui3XdnR zeN&!2?lR=!+?4}BHX>6hmtH5DQHThQtCoH z?zWDTv`e~qLe-hkD6vID?j_nY25ws1`vt=0K`uoG< z>%UD|y~OVn*@8Ue@hXjnCH8fGD+Y-FRpDW6vxy>wG;CODv|tVut+giknp>FRFNUG-;CYN#f0m&R z*ci1pG)C0&^1g68^$K^EFMMOvJ9xGuTI2MQ*9Xka2rnjT%q?)rvL``7Vf-{unm@4e zUMxr!k^D%{_62W2Y>NMYjClA7*p?W*y|&6;8%!U-M`%C=5Lv?_+u)bB_(NY>hWpjV z%=fDoH5nK6i1+(MT}!NcG>Y|o3!rw*D?*^~{JR$!%q)s}gmnwY$ zKC&;>SoA+FeNlI3M}x0BP4;%SCbrJf7PiL!)d6ahb>&eNk@(W+t+g@CVW|my^ULW7 zY0UFB^sOpN9h9TBCBo%fkF?UP?WSGRo}2Okw^^W>M>5^xu^nyx9AX=F z8>XQj9$1g%3N^oUX)p{)ejRX~-=N-vo88e7I!W-kf{;2E<95RO+pOfJ&M2c1i?*Dv zim4Z~s{2|PCX!``)v~aHzk5F1idCCiRGzp_-uyXJusvj5M%7N>zC@L%7Gd7A|JdhB&_Wxe_AyXYoz&8{jnEb9 zepOCXn=@QPsRT;pVom{HZ74fx6k3LP$j%r;0b#pmIvY)7Ko|iw_`H`6Hwd3*52t)4 zvkSw1?p3(I2sZgi5<;~3i8wHs#B-ev7deKmcBY2yoI(0et)%(DRf8pt@+{|?s$zlkx8@6k4MmA~EHa-E zEgVn_5RKqhM!8UO-%;ekWJwT!_mN}Ei*}pP@(=<*q~tbfj|!RF9Sq)pRka$^?_zxV zH>EegL;W{C%(rhvsNcQ`{ilys!oQ~+i*rF5adc#~sK7`VrSkx- zSX)r^YD}0ycV$IIWOLD5%0i)#*PV-Fz4`%yx9PW@YoFat-)kQ`0^g$^$Zxc$%4kal zanVoIlzq8`JJB>~IuTXr9hqU>Fs6GxU2nc2rK^CfC;oAbwrn_z(O8NWUyc5H;-7l48e7J*W_tfxhlWsLroq3wB5ciy55cckQ zUqBFlCf|~Q-)k)LpwafFfj&n@*Ga{6eg}tipkUY;#&x46_|M-T#cfAVAIkDTBae%|zQ<0Cc3*6uQ?kzszX5uZM&zb6){UJb+oxdesxo>QIjI%6$BaPK(&47>u05ZuPaj-gNOd(}O9?Q7sBoONN8A z(_$=6J3L-lT7Xj23hMSX^j+bh%QRrMzN-t&<~qN+Cd8m^9r=8?$UKv;QXae>b{ur znGKbClVNC?KJ^AWrya+3aR13kOnYpz%A%yMQ_Mx7Kf}V(&<2L4*eAH~2N4JRf}Ro! zU78O1ICk})PQ|#<=n}PCB0mC_I*OT|iwY2@+`eLDIV(qaaVMKFurQ_VmV?@+9KC51 z3b?oWX%`t9Ia*@5hDj1>LZsPwko{Y@N$mB%6&kJc(o(cD=frdt2t4Kea%*x~qqBx@ zXRESIYYh!mQPC0W7VMq*Rc=t^v^F_5?Q{@lzb%SMt!enprb zY-W6=s26T@*|i@DGii9#D~37I1m*5%0!oT;5a=p%8l!75h;FXkUD8riQ z{QK%5GLPZk5CwUuU`5f13MvaF(3GP`s*K2;6KSP}zy<;+QYcWN7wG;}QXb98`q8Px zFBHn4CyAsZwK$I_4%2i?reZ7LKAZ9Rn<5Zv>_xh=m!M& zz&Yn`P3iWjd0q?^y^K^m67})FOdTt1>A#5Wa&#RbUfI`T9gyiVYR4H8W!PK)q+@V7 z5An?FKatx^)=LC^>V74ZLI2E%n_t|rFYG{WqRK6`5yc4`<7O`NF-rvPwQy3F-aek0 z+{oIF=6lYW|Gjb377g!H_=NXP^6Y)%AJFVBA-X=(^LozJXcS!u~rQH@iqZd+VFa*#3ytpb3!X#Kl6{dJG*Sm99)|Bzr) zVQgEga(Qjv^Q$Y7PT!FeZBIt)5D06>a9y?|lN`oX^J237GRHvYrGPb}M+9-YFPT4O z_b(}fc#$SCVqgDCiaigloL-U`uKI;?L;}7-mK0iYUv<5$%-q#PZ(x=Cxf0`?-#T$A zuU?B;5fg1!L+_y)HS&k(`|1onHcmwWJzer$Ij+Qj$B@Hk|6YakFx+GOKp(4PlF}?o zEV5hqGAw z7ABxMNDnzG9)Q9-C>U zIWg1bliP3fz(4bDYDdk&H|lZ%U>>hK7G9U|DNjEt0Y3Z6aAJnS z3)xWO@-OUE$QG2eS}ybw>{fw5l}uZ(j2LOO{HbbSppp1cFTcQ&KE!JfS0kQle( z)6Aa%Kdui`_obd)SX+(;EY60OY^BnlE&KB8UEwiQr#9i3ErU&fJ{e~AO_!TkcJwJu zjqP2e^j8S>_}b07EEiPP3((q`&*#BmA?)R}Db7y_vP~4074az%P3tLxhL;N* zBW04q$h50e)qE{hT<W8J6HRn4q&_v?oyO;_s3H0U8WG3N=2msJlw?UV6Ge zMY#<>{e*pD2e4@ft>K3Z`ecL_U1Kesyxb~2aL#qZQLR5Iz7!M;d zBom$;*+WP@0qnfwDJ)Pc^Jla)64Dz~x7}a~rQtg~aawun0ke?V58NR&^WZJ!27*l_ z5}uPtoPtFUXmp?_K%@ch&nfYQd}?+Sr{Y5|bX*Y*`3sQq@Au7E{6sGlMB)HFO2hBA z{=-@kM{O|diqwguo_z0R4amM&*YW#f665yZ9yY&eNYi;!e4+o8IiN<0vD~QTMf+m$ zq`xJr^SK(T)34f*;c=~|5eV9pk-i`pxv-FJW~S1bi+%s)qIj0YxrY+QPP@&N{NXf) z7EV@t$1F8|luoOrPoBXeuTmtH9YzN9o;{;!EOeZKBMNj=YAC49$-l9k&A2ZYX|RG( z6pi(aJDCE}xsu$7k=5g($#;Aq^dJtWIeQZZ`-J@`WJ-iQka_rGN^-seOoadU)2E8L zqlv+P1EyaZ9`0yISf4)axVy#Wl zvowKKr|31it9emLTwC&1qQoDC!?dtB@Ic?GiZYKx$-m(Z!6Od0-&mCLd!owW5bX?xr2v25%Z{vYWcmBAK zr4qoO)Q|gu;BTtlkh{}^Pd7g8uK}#D!ssQ>36a~+4S`{3yw!!+f2k{P!UM%sX%oxb zWrhvUj3DsSlJgFM&|Cr;QDu$}KjPPkHK8@gTm;<`<*KN*hx7eSTk{sHdRwTZEuUT${ z>!d2=i4}CPDs43hZVWB{YGr$STIhVbB470|SRj*G#LlQ-`pr(zE-AnldYG5rC1d zh;OHJy`JY`8d)h4bUq$mvu?9=t1Mj8Hf}ur*bT?_{FDf%vXbFN27D{5rRA(4xd3GI zl>MwZXTm~wxx_>apN%JV>DT*$3X_I|RiamhNMc_$tf2G&J6h`^3Klu41~Wot%~ENn zVwSfFs&Fq$D#GV90i`Q=Hr4w}{<&yB@`@xc2D$UmeX04DV?@K2a~PqudSm&KYlsa% zQmGWL)flP08gQatC0cjs9&K*7gUoDLi}lM`bm7*ybc)hMDv8;2X}80Z*GR0|?tPH0 z#iAX@I!Ws6#Mjl}QPb6|j;gT$@5oOrD5siH)4Ev|GqRXk243vIbxgxxVr!aL06(e( z58lQcGyU&QiOjnF+V0Bn?s#5gYHCS$w=|xa10x{0ag?>$uq0F!YVMCB2|BYLdMu_j z{3zKbOfw|_t!+OsQgx8Ud{rS1A^=hM8}>r089Hy-KA4=PJHCKPDcd_7gZVR8C@Y+i zME;f1P0_w+GtF~Is4{2GK3P}wewt(3_er*`@FN)ClKoY8QT?kBroz4GP(nS`8yxuF z!E@}LzH7GNBgx$%0@inAGjLOx09f`3R@GxJ$z(G>X#_vRs}WjA-3b?tk!cAH7>ro- zESZ+6gFLpb7$*_$5S{lBJ}XtDklw&Po#pcVI?k$nJLVL>wD=4r@KEs5I18Kk9Q+-3 zkYyvq*i&5})AYYQ=tl@yKC4zN6>k;K?-=pyM|gqW^F78q)HN_N{MoDK=%eGYB_q}Cb_|1c?9m8_(2 zvt_o)11yzd*V#)hBo!&D0TFbD>&aS94;oYTPzjk8zi)Y!DnAwKyDI+(#W`)8Ck`=3 zjK^Xcc#R{779tp(bv{cN;va?~#t+(ox0u#48@nA>Pk4cW#NgLtc}opAM#AoU0uJ7bvP3$7R#zcC|{jH*|Y#`Ek&)a`3P_}+&zHUhL?5zoc3I`b zjJkz(_N2GPU3QJkW{oCWa*ck6qU8-W4CpRDGz{&NL~Egw%0DEP+Vo*V6eeqz(a-lg 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ⅈ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%0A{a6j`#3_?wr6$x7MO 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

      _+>Ffhr%QBN4Z^w;T>l79 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�dD$rws?YVk$70Z@PB#U`mGK~c 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.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

    (H>r|Sz$es;n6q4t!9osGU^)b#AiEhi^s}TD` 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