Here's an sample run on my win box where I launched & ran the test suite once (note that for more interesting stats, forcing a low memory condition would be more interesting so that it'll thrash more): ------------------- File Usage Statistics ../../../wagic_res/graphics/simon.dat -- 1 ../../wagic_res/graphics/simon.dat -- 1 ../wagic_res/graphics/simon.dat -- 1 22222220.jpg -- 1 42187t.jpg -- 1 4514111t.jpg -- 1 4838511t.jpg -- 1 4838512t.jpg -- 1 51613t.jpg -- 1 89069t.jpg -- 1 Advisor.wav -- 1 Ally.wav -- 1 Angel Token.jpg -- 1 Angel.wav -- 1 Ape.wav -- 1 Archer.wav -- 1 Assassin.wav -- 1 Atog.wav -- 1 Aura.wav -- 1 Barbarian.wav -- 1 Basic.wav -- 1 Bat.wav -- 1 Bear.jpg -- 1 Beast Token.jpg -- 1 Berserker.wav -- 1 Bird.wav -- 1 Centaur.wav -- 1 Cleric.wav -- 1 Cockatrice.wav -- 1 Construct.wav -- 1 Crocodile.wav -- 1 Cyclops.wav -- 1 Dauthi.wav -- 1 Demon.wav -- 1 Dragon.jpg -- 1 Drake.wav -- 1 Druid.wav -- 1 Dryad.wav -- 1 Dwarf.wav -- 1 Efreet.wav -- 1 Elemental.wav -- 1 Elephant.wav -- 1 Elf.wav -- 1 Elk.wav -- 1 Equipment.wav -- 1 Forest.wav -- 1 Frog.wav -- 1 Fungus.wav -- 1 Giant.wav -- 1 Gnome.wav -- 1 Golem.wav -- 1 Horror.wav -- 1 Horse.wav -- 1 Hydra.wav -- 1 Illusion.wav -- 1 Insect Token.jpg -- 1 Insect.jpg -- 1 Insect.wav -- 1 Island.wav -- 1 Juggernaut.wav -- 1 Kithkin.wav -- 1 Kobold.wav -- 1 Kor.wav -- 1 Kraken.wav -- 1 Lair.wav -- 1 Land.wav -- 1 Leech.wav -- 1 Legendary.wav -- 1 Leviathan.wav -- 1 Lhurgoyf.wav -- 1 Lizard.wav -- 1 Masticore.wav -- 1 Mercenary.wav -- 1 Merfolk.wav -- 1 Metathran.wav -- 1 Minion.wav -- 1 Minotaur.wav -- 1 Monk.wav -- 1 Mountain.wav -- 1 Mutant.wav -- 1 Myr.wav -- 1 Nightmare.wav -- 1 Nothing.wav -- 1 Ogre.wav -- 1 Ooze.wav -- 1 Orc.wav -- 1 Orgg.wav -- 1 Ouphe.wav -- 1 Pirate.wav -- 1 Plains.wav -- 1 Plant.wav -- 1 Rat.wav -- 1 Rebel.wav -- 1 Res.txt -- 1 Res/../../../wagic_res/graphics/simon.dat -- 1 Res/../../wagic_res/graphics/simon.dat -- 1 Res/../wagic_res/graphics/simon.dat -- 1 Res//test/Amugaba.txt -- 1 Res//test/Auriok_Sunchaser_ASLONGAS_1.txt -- 1 Res//test/Auriok_Sunchaser_ASLONGAS_2.txt -- 1 Res//test/Call_to_Heel_1.txt -- 1 Res//test/Call_to_Heel_2.txt -- 1 Res//test/Covetous_Dragon_ASLONGAS_3.txt -- 1 Res//test/Covetous_Dragon_ASLONGAS_4.txt -- 1 Res//test/Glimmervoid_ASLONGAS&TRIGGER.txt -- 1 Res//test/Nevinyrrals_Disk.txt -- 1 Res//test/Nevinyrrals_Disk2.txt -- 1 Res//test/Nyxathid.txt -- 1 Res//test/OneDozenEyes.txt -- 1 Res//test/Zombie_Infestation.txt -- 1 Res//test/act_of_treason.txt -- 1 Res//test/aegis_of_the_meek.txt -- 1 Res//test/aether_flash.txt -- 1 Res//test/aether_mutation.txt -- 1 Res//test/afflict.txt -- 1 Res//test/akron_legionnaire.txt -- 1 Res//test/alabaster_dragon.txt -- 1 Res//test/alabaster_leech.txt -- 1 Res//test/alabaster_leech2.txt -- 1 Res//test/alluring_siren.txt -- 1 Res//test/anarchy.txt -- 1 Res//test/ancestors_chosen.txt -- 1 Res//test/angry_mob1.txt -- 1 Res//test/angry_mob2.txt -- 1 Res//test/angry_mob3.txt -- 1 Res//test/angry_mob4.txt -- 1 Res//test/angry_mob4b.txt -- 1 Res//test/angry_mob5.txt -- 1 Res//test/angry_mob7.txt -- 1 Res//test/animate_artifact.txt -- 1 Res//test/animate_artifact2.txt -- 1 Res//test/animate_dead.txt -- 1 Res//test/animate_dead2.txt -- 1 Res//test/animate_dead3.txt -- 1 Res//test/animated_legendaries1_i221.txt -- 1 Res//test/animated_legendaries2_i221.txt -- 1 Res//test/animated_legendaries3_i221.txt -- 1 Res//test/ankh_of_mishra.txt -- 1 Res//test/arcanis_the_omnipotent.txt -- 1 Res//test/arcanis_the_omnipotent2.txt -- 1 Res//test/arcbound.txt -- 1 Res//test/ardakar_wastes.txt -- 1 Res//test/ardent_soldier.txt -- 1 Res//test/argothian_enchantress.txt -- 1 Res//test/armadillo_cloak.txt -- 1 Res//test/ascendant_evincar.txt -- 1 Res//test/ascendant_evincar2.txt -- 1 Res//test/ascendant_evincar3.txt -- 1 Res//test/ashen_firebeast.txt -- 1 Res//test/ashen_firebeast2.txt -- 1 Res//test/aura_mutation.txt -- 1 Res//test/avarice_totem.txt -- 1 Res//test/aven_riftwatcher.txt -- 1 Res//test/aven_riftwatcher2.txt -- 1 Res//test/aysen_bureaucrats.txt -- 1 Res//test/balduvian_conjurer.txt -- 1 Res//test/baneslayer_angel.txt -- 1 Res//test/baneslayer_angel2.txt -- 1 Res//test/barbed_sliver.txt -- 1 Res//test/basal_sliver.txt -- 1 Res//test/beacon_of_creation.txt -- 1 Res//test/beacon_of_destruction.txt -- 1 Res//test/beacon_of_unrest.txt -- 1 Res//test/behemoth_sledge.txt -- 1 Res//test/behemoth_sledge2.txt -- 1 Res//test/behemoth_sledge3.txt -- 1 Res//test/behemoth_sledge4.txt -- 1 Res//test/behemoth_sledge5.txt -- 1 Res//test/belligerent_hatchling.txt -- 1 Res//test/benalish_knight.txt -- 1 Res//test/biorhythm.txt -- 1 Res//test/black_market.txt -- 1 Res//test/black_vise.txt -- 1 Res//test/blessed_wind.txt -- 1 Res//test/blessed_wine.txt -- 1 Res//test/blinking_spirit.txt -- 1 Res//test/blinkmoth_nexus.txt -- 1 Res//test/bloated_toad1.txt -- 1 Res//test/bloated_toad2.txt -- 1 Res//test/bloodfire_colossus.txt -- 1 Res//test/bloodhall_ooze.txt -- 1 Res//test/bloodscale_prowler.txt -- 1 Res//test/body_double.txt -- 1 Res//test/boggart_arsonists.txt -- 1 Res//test/borderland_behemoth.txt -- 1 Res//test/bottle_gnomes.txt -- 1 Res//test/bottle_gnomes2.txt -- 1 Res//test/brainstorm.txt -- 1 Res//test/bramblewood_paragon.txt -- 1 Res//test/brass_man.txt -- 1 Res//test/brass_man_i161.txt -- 1 Res//test/briarhorn.txt -- 1 Res//test/cage_of_hands.txt -- 1 Res//test/castle.txt -- 1 Res//test/cathodion.txt -- 1 Res//test/celestial_purge.txt -- 1 Res//test/chainbreaker.txt -- 1 Res//test/circle_of_protection.txt -- 1 Res//test/circle_of_protection_i211.txt -- 1 Res//test/civic_wayfinder.txt -- 1 Res//test/clone.txt -- 1 Res//test/clone2.txt -- 1 Res//test/clone3.txt -- 1 Res//test/cockatrice.txt -- 1 Res//test/cockatrice_i228.txt -- 1 Res//test/colossus_of_sardia1.txt -- 1 Res//test/colossus_of_sardia2.txt -- 1 Res//test/composite_golem.txt -- 1 Res//test/conservator.txt -- 1 Res//test/control_magic.txt -- 1 Res//test/control_magic2.txt -- 1 Res//test/control_magic3.txt -- 1 Res//test/control_magic4.txt -- 1 Res//test/corrupt.txt -- 1 Res//test/counsel_of_the_soratami.txt -- 1 Res//test/counterspell.txt -- 1 Res//test/counterspell2.txt -- 1 Res//test/counterspell3.txt -- 1 Res//test/counterspell4.txt -- 1 Res//test/cranial_plating.txt -- 1 Res//test/creature_bond.txt -- 1 Res//test/crimson_kobolds.txt -- 1 Res//test/crosis_s_catacombs_1.txt -- 1 Res//test/crosis_s_catacombs_2.txt -- 1 Res//test/crumble.txt -- 1 Res//test/crystal_rod_i172.txt -- 1 Res//test/curiosity1_i217.txt -- 1 Res//test/curiosity2_i217.txt -- 1 Res//test/dark_banishing.txt -- 1 Res//test/dauntless_escort.txt -- 1 Res//test/dauthi_embrace.txt -- 1 Res//test/death_grasp.txt -- 1 Res//test/death_ward.txt -- 1 Res//test/decree_of_justice.txt -- 1 Res//test/deja_vu.txt -- 1 Res//test/delusions_of_mediocrity.txt -- 1 Res//test/dematerialize_flashback.txt -- 1 Res//test/dingus_egg.txt -- 1 Res//test/dingus_staff_i153.txt -- 1 Res//test/divergent_growth.txt -- 1 Res//test/doomed_necromancer.txt -- 1 Res//test/double_strike2_i145.txt -- 1 Res//test/double_strike_i145.txt -- 1 Res//test/dragon_broodmother_i491.txt -- 1 Res//test/dragon_fodder.txt -- 1 Res//test/dragon_fodder2.txt -- 1 Res//test/dragon_whelp_i154.txt -- 1 Res//test/drain_life.txt -- 1 Res//test/dream_fracture_i142.txt -- 1 Res//test/drift_of_the_dead.txt -- 1 Res//test/dromad_purebred.txt -- 1 Res//test/dross_golem.txt -- 1 Res//test/dross_harvester.txt -- 1 Res//test/duskwalker.txt -- 1 Res//test/dust_corona.txt -- 1 Res//test/dwarven_warriors.txt -- 1 Res//test/ebony_horse.txt -- 1 Res//test/ekundu_cyclops1_i218.txt -- 1 Res//test/ekundu_cyclops2_i218.txt -- 1 Res//test/elvish_piper.txt -- 1 Res//test/elvish_promenade.txt -- 1 Res//test/emblem_of_the_warmind.txt -- 1 Res//test/enchanted evening.txt -- 1 Res//test/enchantress_s_presence.txt -- 1 Res//test/enervate.txt -- 1 Res//test/erg_raiders_i157.txt -- 1 Res//test/explore.txt -- 1 Res//test/fangren_pathcutter.txt -- 1 Res//test/farhaven_elf.txt -- 1 Res//test/farmstead.txt -- 1 Res//test/fastbond.txt -- 1 Res//test/fastbond2.txt -- 1 Res//test/fault_line.txt -- 1 Res//test/feral_hydra.txt -- 1 Res//test/fieldmist_borderpost.txt -- 1 Res//test/fire_tempest.txt -- 1 Res//test/firebreathing.txt -- 1 Res//test/fists_of_ironwood.txt -- 1 Res//test/flagstones.txt -- 1 Res//test/flame_fusillade_i265.txt -- 1 Res//test/flare.txt -- 1 Res//test/fledgling_imp.txt -- 1 Res//test/fledgling_imp2.txt -- 1 Res//test/fleshformer.txt -- 1 Res//test/flowstone_hellion.txt -- 1 Res//test/flowstone_slide.txt -- 1 Res//test/fog.txt -- 1 Res//test/fog_bank.txt -- 1 Res//test/foratog.txt -- 1 Res//test/force_of_nature.txt -- 1 Res//test/force_of_nature2.txt -- 1 Res//test/force_of_nature3.txt -- 1 Res//test/fountain_of_youth.txt -- 1 Res//test/frogmite.txt -- 1 Res//test/fungus_sliver.txt -- 1 Res//test/gamble.txt -- 1 Res//test/gelatinous_generation.txt -- 1 Res//test/gempalm_avenger.txt -- 1 Res//test/generic/attacks_each_turn.txt -- 1 Res//test/generic/becomes_transform_i559.txt -- 1 Res//test/generic/becomes_transform_i559_2.txt -- 1 Res//test/generic/bushido_1.txt -- 1 Res//test/generic/bushido_2.txt -- 1 Res//test/generic/cycling.txt -- 1 Res//test/generic/cycling2.txt -- 1 Res//test/generic/deathtouch.txt -- 1 Res//test/generic/doesnotuntap.txt -- 1 Res//test/generic/doesnotuntap2.txt -- 1 Res//test/generic/double_strike.txt -- 1 Res//test/generic/equip_landfall_buff.txt -- 1 Res//test/generic/equip_reach.txt -- 1 Res//test/generic/equip_shroud.txt -- 1 Res//test/generic/equip_shroud2.txt -- 1 Res//test/generic/equip_wither.txt -- 1 Res//test/generic/equipment_i252.txt -- 1 Res//test/generic/exalted.txt -- 1 Res//test/generic/exalted_i143.txt -- 1 Res//test/generic/exalted_i310.txt -- 1 Res//test/generic/fear.txt -- 1 Res//test/generic/fear_i147.txt -- 1 Res//test/generic/first_and_double_strike1_i187.txt -- 1 Res//test/generic/first_and_double_strike2_i187.txt -- 1 Res//test/generic/first_strike.txt -- 1 Res//test/generic/first_strike2.txt -- 1 Res//test/generic/first_strike3.txt -- 1 Res//test/generic/flanking.txt -- 1 Res//test/generic/fresh.txt -- 1 Res//test/generic/hybrid_mana.txt -- 1 Res//test/generic/hybrid_mana_2.txt -- 1 Res//test/generic/hybrid_mana_3.txt -- 1 Res//test/generic/indestructible.txt -- 1 Res//test/generic/kicker.txt -- 1 Res//test/generic/kicker2.txt -- 1 Res//test/generic/landwalk.txt -- 1 Res//test/generic/legendary.txt -- 1 Res//test/generic/level_up.txt -- 1 Res//test/generic/level_up2.txt -- 1 Res//test/generic/lifelink.txt -- 1 Res//test/generic/lord_counter.txt -- 1 Res//test/generic/lord_counter_any.txt -- 1 Res//test/generic/m10_blockers.txt -- 1 Res//test/generic/m10_blockers2.txt -- 1 Res//test/generic/must1.txt -- 1 Res//test/generic/must2.txt -- 1 Res//test/generic/nofizzle.txt -- 1 Res//test/generic/oneblocker.txt -- 1 Res//test/generic/persist.txt -- 1 Res//test/generic/persist2.txt -- 1 Res//test/generic/persist3.txt -- 1 Res//test/generic/phases.txt -- 1 Res//test/generic/preventalldamage.txt -- 1 Res//test/generic/rampage.txt -- 1 Res//test/generic/rampage2.txt -- 1 Res//test/generic/rampage3.txt -- 1 Res//test/generic/rampage_vs_first_strike.txt -- 1 Res//test/generic/regenerate.txt -- 1 Res//test/generic/regenerate_wither_i146.txt -- 1 Res//test/generic/sacrifice.txt -- 1 Res//test/generic/summoning_sickness.txt -- 1 Res//test/generic/sunburst.txt -- 1 Res//test/generic/tap_other_card_as_cost.txt -- 1 Res//test/generic/targetController_damage.txt -- 1 Res//test/generic/targetController_life.txt -- 1 Res//test/generic/targetController_life2.txt -- 1 Res//test/generic/thisforeach.txt -- 1 Res//test/generic/tokens.txt -- 1 Res//test/generic/tokens2.txt -- 1 Res//test/generic/trample.txt -- 1 Res//test/generic/trample_vs_indestructible.txt -- 1 Res//test/generic/trample_vs_multiblock.txt -- 1 Res//test/generic/triggers_at_movedto_i179.txt -- 1 Res//test/generic/triggers_attacking.txt -- 1 Res//test/generic/triggers_blocking.txt -- 1 Res//test/generic/triggers_combatdamaged_1.txt -- 1 Res//test/generic/triggers_combatdamaged_2.txt -- 1 Res//test/generic/triggers_drawn.txt -- 1 Res//test/generic/triggers_noncombatdamaged.txt -- 1 Res//test/generic/triggers_untapped.txt -- 1 Res//test/generic/wither.txt -- 1 Res//test/ghost_warden.txt -- 1 Res//test/giant_growth.txt -- 1 Res//test/giant_growth2.txt -- 1 Res//test/glen_elendra_archmage_i222.txt -- 1 Res//test/glimpse_the_unthinkable.txt -- 1 Res//test/gnarled_effigy.txt -- 1 Res//test/gnat_alley_creeper1.txt -- 1 Res//test/gnat_alley_creeper2.txt -- 1 Res//test/goblin_balloon_brigade.txt -- 1 Res//test/goblin_balloon_brigade2.txt -- 1 Res//test/goblin_gardener.txt -- 1 Res//test/goblin_king.txt -- 1 Res//test/goblin_lackey1.txt -- 1 Res//test/goblin_lackey2.txt -- 1 Res//test/goblin_lackey3.txt -- 1 Res//test/goblin_lackey4.txt -- 1 Res//test/goblin_offensive.txt -- 1 Res//test/goblin_razerunners.txt -- 1 Res//test/golgari_germination_i153.txt -- 1 Res//test/gravedigger.txt -- 1 Res//test/gravity_well.txt -- 1 Res//test/gravity_well2.txt -- 1 Res//test/great_defender.txt -- 1 Res//test/hannas_custody.txt -- 1 Res//test/harpoon_sniper.txt -- 1 Res//test/hellfire.txt -- 1 Res//test/helm_of_kaldra1.txt -- 1 Res//test/holy_day_i226.txt -- 1 Res//test/hope_charm_i267.txt -- 1 Res//test/hopping_automaton_i232.txt -- 1 Res//test/horned_helm.txt -- 1 Res//test/howl_from_beyond.txt -- 1 Res//test/howl_of_the_night_pack.txt -- 1 Res//test/hunted_dragon.txt -- 1 Res//test/hunting_pack.txt -- 1 Res//test/hurricane.txt -- 1 Res//test/hyalopterous_lemure.txt -- 1 Res//test/hymn_of_rebirth.txt -- 1 Res//test/hypnotic_specter.txt -- 1 Res//test/icatian_priest.txt -- 1 Res//test/imaginary_pet.txt -- 1 Res//test/immaculate_magistrate.txt -- 1 Res//test/incinerate.txt -- 1 Res//test/instill_energy_i166.txt -- 1 Res//test/iron_will_i270.txt -- 1 Res//test/ivy_elemental.txt -- 1 Res//test/jodahs_avenger.txt -- 1 Res//test/juggernaut.txt -- 1 Res//test/jump.txt -- 1 Res//test/juniper_order_ranger.txt -- 1 Res//test/karns_touch_i233.txt -- 1 Res//test/keldon_warlord.txt -- 1 Res//test/keldon_warlord2.txt -- 1 Res//test/khalni_hydra.txt -- 1 Res//test/kird_ape.txt -- 1 Res//test/kjeldoran_frostbeast1.txt -- 1 Res//test/kjeldoran_frostbeast2_i167.txt -- 1 Res//test/knight_captain_of_eos_i294.txt -- 1 Res//test/knight_captain_of_eos_i294_2.txt -- 1 Res//test/kormus_bell_i301.txt -- 1 Res//test/kraken_eye.txt -- 1 Res//test/kraken_eye2.txt -- 1 Res//test/kraken_eye3.txt -- 1 Res//test/kraken_eye4.txt -- 1 Res//test/krosan_beast.txt -- 1 Res//test/krosan_beast2.txt -- 1 Res//test/kudzu.txt -- 1 Res//test/kudzu2.txt -- 1 Res//test/kudzu_i168.txt -- 1 Res//test/leveler.txt -- 1 Res//test/lhurgoyf.txt -- 1 Res//test/liability.txt -- 1 Res//test/lifeforce.txt -- 1 Res//test/lifetap.txt -- 1 Res//test/lightmine_field1.txt -- 1 Res//test/lightmine_field2.txt -- 1 Res//test/living_artifact_i169.txt -- 1 Res//test/living_lands.txt -- 1 Res//test/lord_of_the_pit.txt -- 1 Res//test/lord_of_the_pit2.txt -- 1 Res//test/magma_spray.txt -- 1 Res//test/martial_coup.txt -- 1 Res//test/martial_coup2.txt -- 1 Res//test/master_decoy.txt -- 1 Res//test/master_of_etherium.txt -- 1 Res//test/masticore.txt -- 1 Res//test/masticore2.txt -- 1 Res//test/maze_of_ith.txt -- 1 Res//test/meekstone.txt -- 1 Res//test/memnarch.txt -- 1 Res//test/memory_erosion.txt -- 1 Res//test/mephidross_vampire.txt -- 1 Res//test/millstone.txt -- 1 Res//test/mirri_the_cursed.txt -- 1 Res//test/mirri_the_cursed2_i284.txt -- 1 Res//test/misc01.txt -- 1 Res//test/moat.txt -- 1 Res//test/mobile_fort.txt -- 1 Res//test/momir/keldon_warlord.txt -- 1 Res//test/momir/overcost.txt -- 1 Res//test/momir/persist_i304.txt -- 1 Res//test/mortuary.txt -- 1 Res//test/nantuko_husk.txt -- 1 Res//test/natural_order.txt -- 1 Res//test/necrogenesis.txt -- 1 Res//test/nightmare.txt -- 1 Res//test/northern_paladin.txt -- 1 Res//test/northern_paladin2.txt -- 1 Res//test/ondu_cleric.txt -- 1 Res//test/orcish_artillery.txt -- 1 Res//test/orcish_lumberjack.txt -- 1 Res//test/overrun.txt -- 1 Res//test/paradise_mantle.txt -- 1 Res//test/paralysis.txt -- 1 Res//test/paralysis2.txt -- 1 Res//test/persuasion.txt -- 1 Res//test/phytohydra.txt -- 1 Res//test/plague_rats.txt -- 1 Res//test/plumes_of_peace_i260.txt -- 1 Res//test/pouncing_jaguar_i425.txt -- 1 Res//test/promise_of_bunrei_i305.txt -- 1 Res//test/prosperity.txt -- 1 Res//test/protomatter_powder.txt -- 1 Res//test/prowess_of_the_fair.txt -- 1 Res//test/prowess_of_the_fair2.txt -- 1 Res//test/prowess_of_the_fair3.txt -- 1 Res//test/pygmy_troll.txt -- 1 Res//test/pyknite_i426.txt -- 1 Res//test/pyroclasm.txt -- 1 Res//test/quilled_sliver.txt -- 1 Res//test/rain_of_filth_i206.txt -- 1 Res//test/rain_of_filth_i283.txt -- 1 Res//test/rampant_growth.txt -- 1 Res//test/rancid_earth_with_threshold.txt -- 1 Res//test/rancid_earth_without_threshold.txt -- 1 Res//test/rancor.txt -- 1 Res//test/ray_of_command.txt -- 1 Res//test/ray_of_command_i176.txt -- 1 Res//test/razor_golem.txt -- 1 Res//test/reclusive_wight.txt -- 1 Res//test/reclusive_wight2.txt -- 1 Res//test/recover.txt -- 1 Res//test/regal_force.txt -- 1 Res//test/reinforcements_1.txt -- 1 Res//test/resounding_roar.txt -- 1 Res//test/resurrection.txt -- 1 Res//test/resuscitate_i210.txt -- 1 Res//test/righteous_cause.txt -- 1 Res//test/river_kelpie2_i335.txt -- 1 Res//test/rockslide_elemental.txt -- 1 Res//test/rootwalla.txt -- 1 Res//test/royal_assassin.txt -- 1 Res//test/sacred_foundry_i275.txt -- 1 Res//test/safe_passage.txt -- 1 Res//test/safehold_duo.txt -- 1 Res//test/samite_healer.txt -- 1 Res//test/scourge_of_kher_ridges.txt -- 1 Res//test/scourge_of_kher_ridges2.txt -- 1 Res//test/scourglass.txt -- 1 Res//test/scouts_warning.txt -- 1 Res//test/scute_mob.txt -- 1 Res//test/sedge_sliver.txt -- 1 Res//test/seedcradle_witch.txt -- 1 Res//test/seismic_assault.txt -- 1 Res//test/seismic_spike_i191.txt -- 1 Res//test/selesnya_guildmage.txt -- 1 Res//test/shard_volley.txt -- 1 Res//test/shepherd_of_rot.txt -- 1 Res//test/shivan_hellkite.txt -- 1 Res//test/shock.txt -- 1 Res//test/shock2.txt -- 1 Res//test/siege_gang_commander.txt -- 1 Res//test/sigil_captain_i467.txt -- 1 Res//test/silver_seraph_i300.txt -- 1 Res//test/simic_initiate.txt -- 1 Res//test/skullcage0_i239.txt -- 1 Res//test/skullcage1_i239.txt -- 1 Res//test/skullcage2_i239.txt -- 1 Res//test/skullcage3_i239.txt -- 1 Res//test/skullcage4_i239.txt -- 1 Res//test/skullcage5_i239.txt -- 1 Res//test/skullcage6_i239.txt -- 1 Res//test/skullcage7_i239.txt -- 1 Res//test/skullclamp.txt -- 1 Res//test/skullclamp2_i439.txt -- 1 Res//test/slate_of_ancestry.txt -- 1 Res//test/sleeper_agent.txt -- 1 Res//test/slith_bloodletter.txt -- 1 Res//test/sneak_attack.txt -- 1 Res//test/soulblast.txt -- 1 Res//test/souls_attendant_i489.txt -- 1 Res//test/spark_elemental.txt -- 1 Res//test/sphinx_summoner.txt -- 1 Res//test/spirit_link.txt -- 1 Res//test/spitting_earth.txt -- 1 Res//test/spoils_of_evil.txt -- 1 Res//test/spore_frog.txt -- 1 Res//test/stasis.txt -- 1 Res//test/steelclad_serpent1.txt -- 1 Res//test/steelclad_serpent2.txt -- 1 Res//test/stillmoon_cavalier.txt -- 1 Res//test/stonebrow2.txt -- 1 Res//test/stonebrow_i159.txt -- 1 Res//test/stronghold_discipline.txt -- 1 Res//test/sword_to_plowshares.txt -- 1 Res//test/sylvan_scrying_i195.txt -- 1 Res//test/symbiotic_wurm.txt -- 1 Res//test/tangle_golem.txt -- 1 Res//test/tanglesap.txt -- 1 Res//test/telekinetic_sliver.txt -- 1 Res//test/terror.txt -- 1 Res//test/terror2.txt -- 1 Res//test/thallid.txt -- 1 Res//test/thellon_of_havenwood.txt -- 1 Res//test/threaten.txt -- 1 Res//test/throne_of_bone.txt -- 1 Res//test/thunder-thrash_elder.txt -- 1 Res//test/titanic_ultimatum.txt -- 1 Res//test/tolsimir_wolfblood.txt -- 1 Res//test/torture.txt -- 1 Res//test/tranquil_domain.txt -- 1 Res//test/twinstrike.txt -- 1 Res//test/twinstrike2.txt -- 1 Res//test/twinstrike3.txt -- 1 Res//test/twitch.txt -- 1 Res//test/uncle_istvan.txt -- 1 Res//test/undermine_i408.txt -- 1 Res//test/underworld_dreams.txt -- 1 Res//test/unearth1.txt -- 1 Res//test/unearth2.txt -- 1 Res//test/unearth3.txt -- 1 Res//test/unstable_mutation.txt -- 1 Res//test/unstable_mutation2.txt -- 1 Res//test/unwilling_recruit.txt -- 1 Res//test/urzas_lands.txt -- 1 Res//test/urzas_lands2.txt -- 1 Res//test/urzas_mine_i287.txt -- 1 Res//test/vampire_bats.txt -- 1 Res//test/vampiric_link.txt -- 1 Res//test/vine_dryad.txt -- 1 Res//test/volcanic_eruption.txt -- 1 Res//test/walking_wall.txt -- 1 Res//test/wall_of_diffusion.txt -- 1 Res//test/wall_of_diffusion2.txt -- 1 Res//test/warren_instigator.txt -- 1 Res//test/welkin_hawk.txt -- 1 Res//test/whispers_of_the_muse.txt -- 1 Res//test/white_knight1.txt -- 1 Res//test/windswept_heath.txt -- 1 Res//test/wrath_of_god.txt -- 1 Res//test/wrath_of_god2.txt -- 1 Res//test/wreak_havoc.txt -- 1 Res//test/zombie_master.txt -- 1 Res//test/zombify.txt -- 1 Res/22222220.jpg -- 1 Res/42187t.jpg -- 1 Res/4514111t.jpg -- 1 Res/4838511t.jpg -- 1 Res/4838512t.jpg -- 1 Res/51613t.jpg -- 1 Res/89069t.jpg -- 1 Res/Advisor.wav -- 1 Res/Ally.wav -- 1 Res/Angel Token.jpg -- 1 Res/Angel.wav -- 1 Res/Ape.wav -- 1 Res/Archer.wav -- 1 Res/Assassin.wav -- 1 Res/Atog.wav -- 1 Res/Aura.wav -- 1 Res/Barbarian.wav -- 1 Res/Basic.wav -- 1 Res/Bat.wav -- 1 Res/Bear.jpg -- 1 Res/Beast Token.jpg -- 1 Res/Berserker.wav -- 1 Res/Bird.wav -- 1 Res/Centaur.wav -- 1 Res/Cleric.wav -- 1 Res/Cockatrice.wav -- 1 Res/Construct.wav -- 1 Res/Crocodile.wav -- 1 Res/Cyclops.wav -- 1 Res/Dauthi.wav -- 1 Res/Demon.wav -- 1 Res/Dragon.jpg -- 1 Res/Drake.wav -- 1 Res/Druid.wav -- 1 Res/Dryad.wav -- 1 Res/Dwarf.wav -- 1 Res/Efreet.wav -- 1 Res/Elemental.wav -- 1 Res/Elephant.wav -- 1 Res/Elf.wav -- 1 Res/Elk.wav -- 1 Res/Equipment.wav -- 1 Res/Forest.wav -- 1 Res/Frog.wav -- 1 Res/Fungus.wav -- 1 Res/Giant.wav -- 1 Res/Gnome.wav -- 1 Res/Golem.wav -- 1 Res/Horror.wav -- 1 Res/Horse.wav -- 1 Res/Hydra.wav -- 1 Res/Illusion.wav -- 1 Res/Insect Token.jpg -- 1 Res/Insect.jpg -- 1 Res/Insect.wav -- 1 Res/Island.wav -- 1 Res/Juggernaut.wav -- 1 Res/Kithkin.wav -- 1 Res/Kobold.wav -- 1 Res/Kor.wav -- 1 Res/Kraken.wav -- 1 Res/Lair.wav -- 1 Res/Land.wav -- 1 Res/Leech.wav -- 1 Res/Legendary.wav -- 1 Res/Leviathan.wav -- 1 Res/Lhurgoyf.wav -- 1 Res/Lizard.wav -- 1 Res/Masticore.wav -- 1 Res/Mercenary.wav -- 1 Res/Merfolk.wav -- 1 Res/Metathran.wav -- 1 Res/Minion.wav -- 1 Res/Minotaur.wav -- 1 Res/Monk.wav -- 1 Res/Mountain.wav -- 1 Res/Mutant.wav -- 1 Res/Myr.wav -- 1 Res/Nightmare.wav -- 1 Res/Nothing.wav -- 1 Res/Ogre.wav -- 1 Res/Ooze.wav -- 1 Res/Orc.wav -- 1 Res/Orgg.wav -- 1 Res/Ouphe.wav -- 1 Res/Pirate.wav -- 1 Res/Plains.wav -- 1 Res/Plant.wav -- 1 Res/Rat.wav -- 1 Res/Rebel.wav -- 1 Res/Res/ai/baka/deck107.txt -- 1 Res/Rhino.wav -- 1 Res/Rogue.wav -- 1 Res/Samurai.wav -- 1 Res/Saproling.jpg -- 1 Res/Saproling.wav -- 1 Res/Scarecrow.wav -- 1 Res/Scout.wav -- 1 Res/Serpent.wav -- 1 Res/Shade.wav -- 1 Res/Shaman.wav -- 1 Res/Shapeshifter.wav -- 1 Res/Siren.wav -- 1 Res/Skeleton.wav -- 1 Res/Slith.wav -- 1 Res/Sliver.wav -- 1 Res/Snake.wav -- 1 Res/Snow.wav -- 1 Res/Soldier.wav -- 1 Res/Specter.wav -- 1 Res/Sphinx.wav -- 1 Res/Spider.wav -- 1 Res/Spirit.wav -- 1 Res/Swamp.wav -- 1 Res/Thopter.wav -- 1 Res/Treefolk.wav -- 1 Res/Vedalken.wav -- 1 Res/Viashino.wav -- 1 Res/Wall.wav -- 1 Res/Warrior.wav -- 1 Res/Wizard.wav -- 1 Res/Wolf.wav -- 1 Res/Wraith.wav -- 1 Res/affinitygreencreatures.wav -- 1 Res/ai/baka/avatars/baka.jpg -- 521 Res/ai/baka/deck1.txt -- 2 Res/ai/baka/deck10.txt -- 2 Res/ai/baka/deck100.txt -- 2 Res/ai/baka/deck101.txt -- 2 Res/ai/baka/deck102.txt -- 2 Res/ai/baka/deck103.txt -- 2 Res/ai/baka/deck104.txt -- 2 Res/ai/baka/deck105.txt -- 2 Res/ai/baka/deck106.txt -- 2 Res/ai/baka/deck107.txt -- 1 Res/ai/baka/deck11.txt -- 2 Res/ai/baka/deck12.txt -- 2 Res/ai/baka/deck13.txt -- 2 Res/ai/baka/deck14.txt -- 2 Res/ai/baka/deck15.txt -- 2 Res/ai/baka/deck16.txt -- 2 Res/ai/baka/deck17.txt -- 2 Res/ai/baka/deck18.txt -- 2 Res/ai/baka/deck19.txt -- 2 Res/ai/baka/deck2.txt -- 2 Res/ai/baka/deck20.txt -- 2 Res/ai/baka/deck21.txt -- 2 Res/ai/baka/deck22.txt -- 2 Res/ai/baka/deck23.txt -- 2 Res/ai/baka/deck24.txt -- 2 Res/ai/baka/deck25.txt -- 2 Res/ai/baka/deck26.txt -- 2 Res/ai/baka/deck27.txt -- 2 Res/ai/baka/deck28.txt -- 2 Res/ai/baka/deck29.txt -- 2 Res/ai/baka/deck3.txt -- 2 Res/ai/baka/deck30.txt -- 2 Res/ai/baka/deck31.txt -- 2 Res/ai/baka/deck32.txt -- 2 Res/ai/baka/deck33.txt -- 2 Res/ai/baka/deck34.txt -- 2 Res/ai/baka/deck35.txt -- 2 Res/ai/baka/deck36.txt -- 2 Res/ai/baka/deck37.txt -- 2 Res/ai/baka/deck38.txt -- 2 Res/ai/baka/deck39.txt -- 2 Res/ai/baka/deck4.txt -- 2 Res/ai/baka/deck40.txt -- 2 Res/ai/baka/deck41.txt -- 2 Res/ai/baka/deck42.txt -- 2 Res/ai/baka/deck43.txt -- 2 Res/ai/baka/deck44.txt -- 2 Res/ai/baka/deck45.txt -- 2 Res/ai/baka/deck46.txt -- 2 Res/ai/baka/deck47.txt -- 2 Res/ai/baka/deck48.txt -- 2 Res/ai/baka/deck49.txt -- 2 Res/ai/baka/deck5.txt -- 2 Res/ai/baka/deck50.txt -- 2 Res/ai/baka/deck51.txt -- 2 Res/ai/baka/deck52.txt -- 2 Res/ai/baka/deck53.txt -- 2 Res/ai/baka/deck54.txt -- 2 Res/ai/baka/deck55.txt -- 2 Res/ai/baka/deck56.txt -- 2 Res/ai/baka/deck57.txt -- 2 Res/ai/baka/deck58.txt -- 2 Res/ai/baka/deck59.txt -- 2 Res/ai/baka/deck6.txt -- 2 Res/ai/baka/deck60.txt -- 2 Res/ai/baka/deck61.txt -- 2 Res/ai/baka/deck62.txt -- 2 Res/ai/baka/deck63.txt -- 2 Res/ai/baka/deck64.txt -- 2 Res/ai/baka/deck65.txt -- 2 Res/ai/baka/deck66.txt -- 2 Res/ai/baka/deck67.txt -- 2 Res/ai/baka/deck68.txt -- 2 Res/ai/baka/deck69.txt -- 2 Res/ai/baka/deck7.txt -- 2 Res/ai/baka/deck70.txt -- 2 Res/ai/baka/deck71.txt -- 2 Res/ai/baka/deck72.txt -- 2 Res/ai/baka/deck73.txt -- 2 Res/ai/baka/deck74.txt -- 2 Res/ai/baka/deck75.txt -- 2 Res/ai/baka/deck76.txt -- 2 Res/ai/baka/deck77.txt -- 2 Res/ai/baka/deck78.txt -- 2 Res/ai/baka/deck79.txt -- 2 Res/ai/baka/deck8.txt -- 2 Res/ai/baka/deck80.txt -- 2 Res/ai/baka/deck81.txt -- 2 Res/ai/baka/deck82.txt -- 2 Res/ai/baka/deck83.txt -- 2 Res/ai/baka/deck84.txt -- 2 Res/ai/baka/deck85.txt -- 2 Res/ai/baka/deck86.txt -- 2 Res/ai/baka/deck87.txt -- 2 Res/ai/baka/deck88.txt -- 2 Res/ai/baka/deck89.txt -- 2 Res/ai/baka/deck9.txt -- 2 Res/ai/baka/deck90.txt -- 2 Res/ai/baka/deck91.txt -- 2 Res/ai/baka/deck92.txt -- 2 Res/ai/baka/deck93.txt -- 2 Res/ai/baka/deck94.txt -- 2 Res/ai/baka/deck95.txt -- 2 Res/ai/baka/deck96.txt -- 2 Res/ai/baka/deck97.txt -- 2 Res/ai/baka/deck98.txt -- 2 Res/ai/baka/deck99.txt -- 2 Res/ai/baka/stats/testsuite.stats -- 1042 Res/defender.wav -- 1 Res/fear.wav -- 1 Res/first strike.wav -- 1 Res/flash.wav -- 1 Res/forestwalk.wav -- 1 Res/graphics/BattleIcon.png -- 1 Res/graphics/DefenderIcon.png -- 1 Res/graphics/Ok.png -- 521 Res/graphics/artifact_thumb.jpg -- 34 Res/graphics/black_thumb.jpg -- 1 Res/graphics/button_shoulder.png -- 2 Res/graphics/f3.png -- 1 Res/graphics/gold.png -- 1 Res/graphics/gold_thumb.jpg -- 1 Res/graphics/goldglow.png -- 1 Res/graphics/green.jpg -- 1 Res/graphics/green_thumb.jpg -- 5 Res/graphics/magic.png -- 1 Res/graphics/mana.psi -- 1 Res/graphics/manablack.psi -- 1 Res/graphics/manablue.psi -- 1 Res/graphics/managreen.psi -- 1 Res/graphics/manared.psi -- 1 Res/graphics/manawhite.psi -- 1 Res/graphics/menuicons.png -- 1 Res/graphics/menuside.png -- 1 Res/graphics/menutitle.png -- 2 Res/graphics/particle1.psi -- 1 Res/graphics/particle2.psi -- 1 Res/graphics/particle3.psi -- 1 Res/graphics/particle4.psi -- 1 Res/graphics/particle5.psi -- 1 Res/graphics/particles.png -- 1 Res/graphics/phasebar.png -- 1 Res/graphics/shadow.png -- 1 Res/graphics/simon.png -- 1 Res/graphics/smallface.png -- 1 Res/graphics/spade_ul.png -- 1 Res/graphics/spade_ur.png -- 1 Res/graphics/splash.jpg -- 2 Res/graphics/stars.psi -- 1 Res/graphics/style.txt -- 1 Res/graphics/wallpapers.txt -- 1 Res/graphics/wallpapers/final_saga2.jpg -- 1 Res/graphics/white_thumb.jpg -- 1 Res/haste.wav -- 1 Res/lang/dontcare.txt -- 2 Res/lang/en.txt -- 3 Res/lang/en_cards.txt -- 1 Res/lang/en_decks.txt -- 1 Res/lifelink.wav -- 1 Res/ms0:/PSP/wagic_res/graphics/simon.dat -- 1 Res/ms0:/wagic_res/graphics/simon.dat -- 1 Res/mustattack.wav -- 1 Res/nofizzle.wav -- 1 Res/none -- 1 Res/persist.wav -- 1 Res/player/baka.jpg -- 521 Res/player/collection.dat -- 4 Res/player/data.dat -- 2 Res/player/deck1.txt -- 2 Res/player/deck2.txt -- 2 Res/player/deck3.txt -- 2 Res/player/deck4.txt -- 2 Res/player/deck5.txt -- 2 Res/player/deck6.txt -- 2 Res/player/options.txt -- 2 Res/player/stats/player_deck1.txt -- 4 Res/player/stats/player_deck2.txt -- 4 Res/player/stats/player_deck3.txt -- 4 Res/player/stats/player_deck4.txt -- 4 Res/player/stats/player_deck5.txt -- 4 Res/player/stats/player_deck6.txt -- 4 Res/player/tasks.dat -- 2 Res/protection from black.wav -- 1 Res/protection from blue.wav -- 1 Res/protection from white.wav -- 1 Res/reach.wav -- 1 Res/reachshadow.wav -- 1 Res/rules/testsuite.txt -- 1 Res/sets//../_cards.dat -- 1 Res/sets//./_cards.dat -- 1 Res/sets//.svn/_cards.dat -- 1 Res/sets//10E/_cards.dat -- 2 Res/sets//1111114t.jpg -- 1 Res/sets//1924t.jpg -- 1 Res/sets//220579112.jpg -- 1 Res/sets//2ED/_cards.dat -- 2 Res/sets//483851111t.jpg -- 1 Res/sets//4ED/_cards.dat -- 2 Res/sets//5DN/_cards.dat -- 2 Res/sets//5ED/_cards.dat -- 2 Res/sets//6ED/_cards.dat -- 2 Res/sets//7ED/_cards.dat -- 2 Res/sets//8ED/_cards.dat -- 2 Res/sets//9ED/_cards.dat -- 2 Res/sets//ALA/_cards.dat -- 2 Res/sets//ALL/_cards.dat -- 2 Res/sets//APC/_cards.dat -- 2 Res/sets//ARB/_cards.dat -- 2 Res/sets//ARC/_cards.dat -- 2 Res/sets//ARN/_cards.dat -- 2 Res/sets//ATQ/_cards.dat -- 2 Res/sets//BOK/_cards.dat -- 2 Res/sets//BRB/_cards.dat -- 2 Res/sets//BTD/_cards.dat -- 2 Res/sets//Brainstorm's 2nd MoveToTop.jpg -- 1 Res/sets//CFX/_cards.dat -- 2 Res/sets//CHK/_cards.dat -- 2 Res/sets//CHR/_cards.dat -- 2 Res/sets//CSP/_cards.dat -- 2 Res/sets//DIS/_cards.dat -- 2 Res/sets//DRK/_cards.dat -- 2 Res/sets//DST/_cards.dat -- 2 Res/sets//DVD/_cards.dat -- 2 Res/sets//EVE/_cards.dat -- 2 Res/sets//EVG/_cards.dat -- 2 Res/sets//EVT/_cards.dat -- 2 Res/sets//EXO/_cards.dat -- 2 Res/sets//FEM/_cards.dat -- 2 Res/sets//FUT/_cards.dat -- 2 Res/sets//FVD/_cards.dat -- 2 Res/sets//FVE/_cards.dat -- 2 Res/sets//FVR/_cards.dat -- 2 Res/sets//GPT/_cards.dat -- 2 Res/sets//GVL/_cards.dat -- 2 Res/sets//HML/_cards.dat -- 2 Res/sets//HOP/_cards.dat -- 2 Res/sets//ICE/_cards.dat -- 2 Res/sets//INV/_cards.dat -- 2 Res/sets//JUD/_cards.dat -- 2 Res/sets//JVC/_cards.dat -- 2 Res/sets//LEA/_cards.dat -- 2 Res/sets//LEB/_cards.dat -- 2 Res/sets//LEG/_cards.dat -- 2 Res/sets//LGN/_cards.dat -- 2 Res/sets//LRW/_cards.dat -- 2 Res/sets//M10/_cards.dat -- 2 Res/sets//M11/_cards.dat -- 2 Res/sets//ME2/_cards.dat -- 2 Res/sets//ME3/_cards.dat -- 2 Res/sets//ME4/_cards.dat -- 2 Res/sets//MED/_cards.dat -- 2 Res/sets//MIR/_cards.dat -- 2 Res/sets//MOR/_cards.dat -- 2 Res/sets//MRD/_cards.dat -- 2 Res/sets//MRQ/_cards.dat -- 2 Res/sets//NMS/_cards.dat -- 2 Res/sets//ODY/_cards.dat -- 2 Res/sets//ONS/_cards.dat -- 2 Res/sets//One Dozen Eyes Entwine.jpg -- 1 Res/sets//P02/_cards.dat -- 2 Res/sets//PCY/_cards.dat -- 2 Res/sets//PD2/_cards.dat -- 2 Res/sets//PDS/_cards.dat -- 2 Res/sets//PLC/_cards.dat -- 2 Res/sets//PLS/_cards.dat -- 2 Res/sets//POR/_cards.dat -- 2 Res/sets//PPR/_cards.dat -- 2 Res/sets//PTK/_cards.dat -- 2 Res/sets//PVC/_cards.dat -- 2 Res/sets//RAV/_cards.dat -- 2 Res/sets//ROE/_cards.dat -- 2 Res/sets//RV/_cards.dat -- 2 Res/sets//S00/_cards.dat -- 2 Res/sets//S99/_cards.dat -- 2 Res/sets//SCG/_cards.dat -- 2 Res/sets//SHM/_cards.dat -- 2 Res/sets//SOK/_cards.dat -- 2 Res/sets//SOM/_cards.dat -- 2 Res/sets//STH/_cards.dat -- 2 Res/sets//Saproling.jpg -- 1 Res/sets//TMP/_cards.dat -- 2 Res/sets//TOR/_cards.dat -- 2 Res/sets//TSB/_cards.dat -- 2 Res/sets//TSP/_cards.dat -- 2 Res/sets//UDS/_cards.dat -- 2 Res/sets//UGL/_cards.dat -- 2 Res/sets//ULG/_cards.dat -- 2 Res/sets//UNH/_cards.dat -- 2 Res/sets//USG/_cards.dat -- 2 Res/sets//VIS/_cards.dat -- 2 Res/sets//WTH/_cards.dat -- 2 Res/sets//WWK/_cards.dat -- 2 Res/sets//ZEN/_cards.dat -- 2 Res/sets//Zombie.jpg -- 1 Res/sets//artifact.jpg/_cards.dat -- 1 Res/sets//artifact_thumb.jpg/_cards.dat -- 1 Res/sets//back.jpg/_cards.dat -- 1 Res/sets//back_thumb.jpg/_cards.dat -- 1 Res/sets//black.jpg/_cards.dat -- 1 Res/sets//black_thumb.jpg/_cards.dat -- 1 Res/sets//blue.jpg/_cards.dat -- 1 Res/sets//blue_thumb.jpg/_cards.dat -- 1 Res/sets//gold.jpg/_cards.dat -- 1 Res/sets//gold_thumb.jpg/_cards.dat -- 1 Res/sets//green.jpg/_cards.dat -- 1 Res/sets//green_thumb.jpg/_cards.dat -- 1 Res/sets//land.jpg/_cards.dat -- 1 Res/sets//land_thumb.jpg/_cards.dat -- 1 Res/sets//mtg_todo.dat/_cards.dat -- 1 Res/sets//primitives/_cards.dat -- 1 Res/sets//red.jpg/_cards.dat -- 1 Res/sets//red_thumb.jpg/_cards.dat -- 1 Res/sets//scheme_todo.dat/_cards.dat -- 1 Res/sets//thumbnails/1111114t.jpg -- 1 Res/sets//thumbnails/1111135t.jpg -- 1 Res/sets//thumbnails/1924t.jpg -- 1 Res/sets//thumbnails/220579111t.jpg -- 1 Res/sets//thumbnails/220579112.jpg -- 1 Res/sets//thumbnails/220579112t.jpg -- 1 Res/sets//thumbnails/22222223.jpg -- 1 Res/sets//thumbnails/22222226.jpg -- 1 Res/sets//thumbnails/483851111t.jpg -- 1 Res/sets//thumbnails/Brainstorm's 2nd MoveToTop.jpg -- 1 Res/sets//thumbnails/Devour 3 (Mechanic).jpg -- 1 Res/sets//thumbnails/Devour Sac 3.jpg -- 1 Res/sets//thumbnails/One Dozen Eyes Entwine.jpg -- 1 Res/sets//thumbnails/Reinforcements' 3rd Return.jpg -- 1 Res/sets//thumbnails/Saproling.jpg -- 1 Res/sets//thumbnails/ZombInfs First Discard.jpg -- 1 Res/sets//thumbnails/ZombInfs Second Discard.jpg -- 1 Res/sets//thumbnails/Zombie.jpg -- 1 Res/sets//white.jpg/_cards.dat -- 1 Res/sets//white_thumb.jpg/_cards.dat -- 1 Res/sets/artifact_thumb.jpg -- 34 Res/sets/black_thumb.jpg -- 1 Res/sets/gold_thumb.jpg -- 1 Res/sets/green.jpg -- 1 Res/sets/green_thumb.jpg -- 5 Res/sets/primitives/. -- 1 Res/sets/primitives/.. -- 1 Res/sets/primitives/.svn -- 1 Res/sets/primitives/borderline.txt -- 2 Res/sets/primitives/mtg.txt -- 2 Res/sets/splash.jpg -- 1 Res/sets/style.txt -- 1 Res/sets/white_thumb.jpg -- 1 Res/settings/options.txt -- 1 Res/settings/prices.dat -- 1 Res/shadow.wav -- 1 Res/sound/Track0.mp3 -- 3 Res/sound/Track1.mp3 -- 2 Res/sound/none -- 1 Res/sound/sfx/Advisor.wav -- 1 Res/sound/sfx/Ally.wav -- 1 Res/sound/sfx/Angel.wav -- 1 Res/sound/sfx/Ape.wav -- 1 Res/sound/sfx/Archer.wav -- 1 Res/sound/sfx/Artifact.wav -- 1 Res/sound/sfx/Assassin.wav -- 1 Res/sound/sfx/Atog.wav -- 1 Res/sound/sfx/Aura.wav -- 1 Res/sound/sfx/Barbarian.wav -- 1 Res/sound/sfx/Basic.wav -- 1 Res/sound/sfx/Bat.wav -- 1 Res/sound/sfx/Bear.wav -- 1 Res/sound/sfx/Beast.wav -- 1 Res/sound/sfx/Berserker.wav -- 1 Res/sound/sfx/Bird.wav -- 1 Res/sound/sfx/Cat.wav -- 1 Res/sound/sfx/Centaur.wav -- 1 Res/sound/sfx/Cleric.wav -- 1 Res/sound/sfx/Cockatrice.wav -- 1 Res/sound/sfx/Construct.wav -- 1 Res/sound/sfx/Creature.wav -- 1 Res/sound/sfx/Crocodile.wav -- 1 Res/sound/sfx/Cyclops.wav -- 1 Res/sound/sfx/Dauthi.wav -- 1 Res/sound/sfx/Demon.wav -- 1 Res/sound/sfx/Dragon.wav -- 1 Res/sound/sfx/Drake.wav -- 1 Res/sound/sfx/Druid.wav -- 1 Res/sound/sfx/Dryad.wav -- 1 Res/sound/sfx/Dwarf.wav -- 1 Res/sound/sfx/Efreet.wav -- 1 Res/sound/sfx/Elemental.wav -- 1 Res/sound/sfx/Elephant.wav -- 1 Res/sound/sfx/Elf.wav -- 1 Res/sound/sfx/Elk.wav -- 1 Res/sound/sfx/Enchantment.wav -- 1 Res/sound/sfx/Equipment.wav -- 1 Res/sound/sfx/Faerie.wav -- 1 Res/sound/sfx/Forest.wav -- 1 Res/sound/sfx/Frog.wav -- 1 Res/sound/sfx/Fungus.wav -- 1 Res/sound/sfx/Giant.wav -- 1 Res/sound/sfx/Gnome.wav -- 1 Res/sound/sfx/Goblin.wav -- 1 Res/sound/sfx/Golem.wav -- 1 Res/sound/sfx/Horror.wav -- 1 Res/sound/sfx/Horse.wav -- 1 Res/sound/sfx/Human.wav -- 1 Res/sound/sfx/Hydra.wav -- 1 Res/sound/sfx/Illusion.wav -- 1 Res/sound/sfx/Imp.wav -- 1 Res/sound/sfx/Insect.wav -- 1 Res/sound/sfx/Instant.wav -- 1 Res/sound/sfx/Island.wav -- 1 Res/sound/sfx/Juggernaut.wav -- 1 Res/sound/sfx/Kithkin.wav -- 1 Res/sound/sfx/Knight.wav -- 1 Res/sound/sfx/Kobold.wav -- 1 Res/sound/sfx/Kor.wav -- 1 Res/sound/sfx/Kraken.wav -- 1 Res/sound/sfx/Lair.wav -- 1 Res/sound/sfx/Land.wav -- 1 Res/sound/sfx/Leech.wav -- 1 Res/sound/sfx/Legendary.wav -- 1 Res/sound/sfx/Leviathan.wav -- 1 Res/sound/sfx/Lhurgoyf.wav -- 1 Res/sound/sfx/Lizard.wav -- 1 Res/sound/sfx/Masticore.wav -- 1 Res/sound/sfx/Mercenary.wav -- 1 Res/sound/sfx/Merfolk.wav -- 1 Res/sound/sfx/Metathran.wav -- 1 Res/sound/sfx/Minion.wav -- 1 Res/sound/sfx/Minotaur.wav -- 1 Res/sound/sfx/Monk.wav -- 1 Res/sound/sfx/Mountain.wav -- 1 Res/sound/sfx/Mutant.wav -- 1 Res/sound/sfx/Myr.wav -- 1 Res/sound/sfx/Nightmare.wav -- 1 Res/sound/sfx/Nothing.wav -- 1 Res/sound/sfx/Ogre.wav -- 1 Res/sound/sfx/Ooze.wav -- 1 Res/sound/sfx/Orc.wav -- 1 Res/sound/sfx/Orgg.wav -- 1 Res/sound/sfx/Ouphe.wav -- 1 Res/sound/sfx/Pirate.wav -- 1 Res/sound/sfx/Plains.wav -- 1 Res/sound/sfx/Plant.wav -- 1 Res/sound/sfx/Rat.wav -- 1 Res/sound/sfx/Rebel.wav -- 1 Res/sound/sfx/Rhino.wav -- 1 Res/sound/sfx/Rogue.wav -- 1 Res/sound/sfx/Samurai.wav -- 1 Res/sound/sfx/Saproling.wav -- 1 Res/sound/sfx/Scarecrow.wav -- 1 Res/sound/sfx/Scout.wav -- 1 Res/sound/sfx/Serpent.wav -- 1 Res/sound/sfx/Shade.wav -- 1 Res/sound/sfx/Shaman.wav -- 1 Res/sound/sfx/Shapeshifter.wav -- 1 Res/sound/sfx/Siren.wav -- 1 Res/sound/sfx/Skeleton.wav -- 1 Res/sound/sfx/Slith.wav -- 1 Res/sound/sfx/Sliver.wav -- 1 Res/sound/sfx/Snake.wav -- 1 Res/sound/sfx/Snow.wav -- 1 Res/sound/sfx/Soldier.wav -- 1 Res/sound/sfx/Sorcery.wav -- 1 Res/sound/sfx/Specter.wav -- 1 Res/sound/sfx/Sphinx.wav -- 1 Res/sound/sfx/Spider.wav -- 1 Res/sound/sfx/Spirit.wav -- 1 Res/sound/sfx/Swamp.wav -- 1 Res/sound/sfx/Thopter.wav -- 1 Res/sound/sfx/Treefolk.wav -- 1 Res/sound/sfx/Troll.wav -- 1 Res/sound/sfx/Vampire.wav -- 1 Res/sound/sfx/Vedalken.wav -- 1 Res/sound/sfx/Viashino.wav -- 1 Res/sound/sfx/Wall.wav -- 1 Res/sound/sfx/Warrior.wav -- 1 Res/sound/sfx/Wizard.wav -- 1 Res/sound/sfx/Wolf.wav -- 1 Res/sound/sfx/Wraith.wav -- 1 Res/sound/sfx/Wurm.wav -- 1 Res/sound/sfx/Zombie.wav -- 1 Res/sound/sfx/affinitygreencreatures.wav -- 1 Res/sound/sfx/defender.wav -- 1 Res/sound/sfx/fear.wav -- 1 Res/sound/sfx/first strike.wav -- 1 Res/sound/sfx/flash.wav -- 1 Res/sound/sfx/flying.wav -- 1 Res/sound/sfx/forestwalk.wav -- 1 Res/sound/sfx/graveyard.wav -- 1 Res/sound/sfx/haste.wav -- 1 Res/sound/sfx/lifelink.wav -- 1 Res/sound/sfx/mana.wav -- 1 Res/sound/sfx/mustattack.wav -- 1 Res/sound/sfx/nofizzle.wav -- 1 Res/sound/sfx/persist.wav -- 1 Res/sound/sfx/protection from black.wav -- 1 Res/sound/sfx/protection from blue.wav -- 1 Res/sound/sfx/protection from white.wav -- 1 Res/sound/sfx/reach.wav -- 1 Res/sound/sfx/reachshadow.wav -- 1 Res/sound/sfx/shadow.wav -- 1 Res/sound/sfx/storm.wav -- 1 Res/sound/sfx/swampwalk.wav -- 1 Res/sound/sfx/trample.wav -- 1 Res/sound/sfx/vigor.wav -- 1 Res/sound/sfx/wither.wav -- 1 Res/splash.jpg -- 1 Res/storm.wav -- 1 Res/style.txt -- 1 Res/swampwalk.wav -- 1 Res/test/_tests.txt -- 1 Res/testsuite.txt -- 1 Res/themes/White Shrine/BattleIcon.png -- 1 Res/themes/White Shrine/DefenderIcon.png -- 1 Res/themes/White Shrine/Ok.png -- 521 Res/themes/White Shrine/artifact_thumb.jpg -- 34 Res/themes/White Shrine/back.jpg -- 1 Res/themes/White Shrine/back_thumb.jpg -- 1 Res/themes/White Shrine/backdrop.jpg -- 1 Res/themes/White Shrine/baka.jpg -- 521 Res/themes/White Shrine/black_thumb.jpg -- 1 Res/themes/White Shrine/button_shoulder.png -- 2 Res/themes/White Shrine/f3.png -- 1 Res/themes/White Shrine/gold.png -- 1 Res/themes/White Shrine/gold_thumb.jpg -- 1 Res/themes/White Shrine/goldglow.png -- 1 Res/themes/White Shrine/green.jpg -- 1 Res/themes/White Shrine/green_thumb.jpg -- 5 Res/themes/White Shrine/handback.png -- 1 Res/themes/White Shrine/magic.png -- 1 Res/themes/White Shrine/mana.psi -- 1 Res/themes/White Shrine/manablack.psi -- 1 Res/themes/White Shrine/manablue.psi -- 1 Res/themes/White Shrine/managreen.psi -- 1 Res/themes/White Shrine/manared.psi -- 1 Res/themes/White Shrine/manawhite.psi -- 1 Res/themes/White Shrine/menuicons.png -- 1 Res/themes/White Shrine/menuside.png -- 1 Res/themes/White Shrine/menutitle.png -- 2 Res/themes/White Shrine/particle1.psi -- 1 Res/themes/White Shrine/particle2.psi -- 1 Res/themes/White Shrine/particle3.psi -- 1 Res/themes/White Shrine/particle4.psi -- 1 Res/themes/White Shrine/particle5.psi -- 1 Res/themes/White Shrine/particles.png -- 1 Res/themes/White Shrine/phasebar.png -- 1 Res/themes/White Shrine/shadow.png -- 1 Res/themes/White Shrine/simon.png -- 1 Res/themes/White Shrine/smallface.png -- 1 Res/themes/White Shrine/sound/Track0.mp3 -- 2 Res/themes/White Shrine/sound/Track1.mp3 -- 1 Res/themes/White Shrine/sound/none -- 1 Res/themes/White Shrine/sound/sfx/Advisor.wav -- 1 Res/themes/White Shrine/sound/sfx/Ally.wav -- 1 Res/themes/White Shrine/sound/sfx/Angel.wav -- 1 Res/themes/White Shrine/sound/sfx/Ape.wav -- 1 Res/themes/White Shrine/sound/sfx/Archer.wav -- 1 Res/themes/White Shrine/sound/sfx/Artifact.wav -- 1 Res/themes/White Shrine/sound/sfx/Assassin.wav -- 1 Res/themes/White Shrine/sound/sfx/Atog.wav -- 1 Res/themes/White Shrine/sound/sfx/Aura.wav -- 1 Res/themes/White Shrine/sound/sfx/Barbarian.wav -- 1 Res/themes/White Shrine/sound/sfx/Basic.wav -- 1 Res/themes/White Shrine/sound/sfx/Bat.wav -- 1 Res/themes/White Shrine/sound/sfx/Bear.wav -- 1 Res/themes/White Shrine/sound/sfx/Beast.wav -- 1 Res/themes/White Shrine/sound/sfx/Berserker.wav -- 1 Res/themes/White Shrine/sound/sfx/Bird.wav -- 1 Res/themes/White Shrine/sound/sfx/Cat.wav -- 1 Res/themes/White Shrine/sound/sfx/Centaur.wav -- 1 Res/themes/White Shrine/sound/sfx/Cleric.wav -- 1 Res/themes/White Shrine/sound/sfx/Cockatrice.wav -- 1 Res/themes/White Shrine/sound/sfx/Construct.wav -- 1 Res/themes/White Shrine/sound/sfx/Creature.wav -- 1 Res/themes/White Shrine/sound/sfx/Crocodile.wav -- 1 Res/themes/White Shrine/sound/sfx/Cyclops.wav -- 1 Res/themes/White Shrine/sound/sfx/Dauthi.wav -- 1 Res/themes/White Shrine/sound/sfx/Demon.wav -- 1 Res/themes/White Shrine/sound/sfx/Dragon.wav -- 1 Res/themes/White Shrine/sound/sfx/Drake.wav -- 1 Res/themes/White Shrine/sound/sfx/Druid.wav -- 1 Res/themes/White Shrine/sound/sfx/Dryad.wav -- 1 Res/themes/White Shrine/sound/sfx/Dwarf.wav -- 1 Res/themes/White Shrine/sound/sfx/Efreet.wav -- 1 Res/themes/White Shrine/sound/sfx/Elemental.wav -- 1 Res/themes/White Shrine/sound/sfx/Elephant.wav -- 1 Res/themes/White Shrine/sound/sfx/Elf.wav -- 1 Res/themes/White Shrine/sound/sfx/Elk.wav -- 1 Res/themes/White Shrine/sound/sfx/Enchantment.wav -- 1 Res/themes/White Shrine/sound/sfx/Equipment.wav -- 1 Res/themes/White Shrine/sound/sfx/Faerie.wav -- 1 Res/themes/White Shrine/sound/sfx/Forest.wav -- 1 Res/themes/White Shrine/sound/sfx/Frog.wav -- 1 Res/themes/White Shrine/sound/sfx/Fungus.wav -- 1 Res/themes/White Shrine/sound/sfx/Giant.wav -- 1 Res/themes/White Shrine/sound/sfx/Gnome.wav -- 1 Res/themes/White Shrine/sound/sfx/Goblin.wav -- 1 Res/themes/White Shrine/sound/sfx/Golem.wav -- 1 Res/themes/White Shrine/sound/sfx/Horror.wav -- 1 Res/themes/White Shrine/sound/sfx/Horse.wav -- 1 Res/themes/White Shrine/sound/sfx/Human.wav -- 1 Res/themes/White Shrine/sound/sfx/Hydra.wav -- 1 Res/themes/White Shrine/sound/sfx/Illusion.wav -- 1 Res/themes/White Shrine/sound/sfx/Imp.wav -- 1 Res/themes/White Shrine/sound/sfx/Insect.wav -- 1 Res/themes/White Shrine/sound/sfx/Instant.wav -- 1 Res/themes/White Shrine/sound/sfx/Island.wav -- 1 Res/themes/White Shrine/sound/sfx/Juggernaut.wav -- 1 Res/themes/White Shrine/sound/sfx/Kithkin.wav -- 1 Res/themes/White Shrine/sound/sfx/Knight.wav -- 1 Res/themes/White Shrine/sound/sfx/Kobold.wav -- 1 Res/themes/White Shrine/sound/sfx/Kor.wav -- 1 Res/themes/White Shrine/sound/sfx/Kraken.wav -- 1 Res/themes/White Shrine/sound/sfx/Lair.wav -- 1 Res/themes/White Shrine/sound/sfx/Land.wav -- 1 Res/themes/White Shrine/sound/sfx/Leech.wav -- 1 Res/themes/White Shrine/sound/sfx/Legendary.wav -- 1 Res/themes/White Shrine/sound/sfx/Leviathan.wav -- 1 Res/themes/White Shrine/sound/sfx/Lhurgoyf.wav -- 1 Res/themes/White Shrine/sound/sfx/Lizard.wav -- 1 Res/themes/White Shrine/sound/sfx/Masticore.wav -- 1 Res/themes/White Shrine/sound/sfx/Mercenary.wav -- 1 Res/themes/White Shrine/sound/sfx/Merfolk.wav -- 1 Res/themes/White Shrine/sound/sfx/Metathran.wav -- 1 Res/themes/White Shrine/sound/sfx/Minion.wav -- 1 Res/themes/White Shrine/sound/sfx/Minotaur.wav -- 1 Res/themes/White Shrine/sound/sfx/Monk.wav -- 1 Res/themes/White Shrine/sound/sfx/Mountain.wav -- 1 Res/themes/White Shrine/sound/sfx/Mutant.wav -- 1 Res/themes/White Shrine/sound/sfx/Myr.wav -- 1 Res/themes/White Shrine/sound/sfx/Nightmare.wav -- 1 Res/themes/White Shrine/sound/sfx/Nothing.wav -- 1 Res/themes/White Shrine/sound/sfx/Ogre.wav -- 1 Res/themes/White Shrine/sound/sfx/Ooze.wav -- 1 Res/themes/White Shrine/sound/sfx/Orc.wav -- 1 Res/themes/White Shrine/sound/sfx/Orgg.wav -- 1 Res/themes/White Shrine/sound/sfx/Ouphe.wav -- 1 Res/themes/White Shrine/sound/sfx/Pirate.wav -- 1 Res/themes/White Shrine/sound/sfx/Plains.wav -- 1 Res/themes/White Shrine/sound/sfx/Plant.wav -- 1 Res/themes/White Shrine/sound/sfx/Rat.wav -- 1 Res/themes/White Shrine/sound/sfx/Rebel.wav -- 1 Res/themes/White Shrine/sound/sfx/Rhino.wav -- 1 Res/themes/White Shrine/sound/sfx/Rogue.wav -- 1 Res/themes/White Shrine/sound/sfx/Samurai.wav -- 1 Res/themes/White Shrine/sound/sfx/Saproling.wav -- 1 Res/themes/White Shrine/sound/sfx/Scarecrow.wav -- 1 Res/themes/White Shrine/sound/sfx/Scout.wav -- 1 Res/themes/White Shrine/sound/sfx/Serpent.wav -- 1 Res/themes/White Shrine/sound/sfx/Shade.wav -- 1 Res/themes/White Shrine/sound/sfx/Shaman.wav -- 1 Res/themes/White Shrine/sound/sfx/Shapeshifter.wav -- 1 Res/themes/White Shrine/sound/sfx/Siren.wav -- 1 Res/themes/White Shrine/sound/sfx/Skeleton.wav -- 1 Res/themes/White Shrine/sound/sfx/Slith.wav -- 1 Res/themes/White Shrine/sound/sfx/Sliver.wav -- 1 Res/themes/White Shrine/sound/sfx/Snake.wav -- 1 Res/themes/White Shrine/sound/sfx/Snow.wav -- 1 Res/themes/White Shrine/sound/sfx/Soldier.wav -- 1 Res/themes/White Shrine/sound/sfx/Sorcery.wav -- 1 Res/themes/White Shrine/sound/sfx/Specter.wav -- 1 Res/themes/White Shrine/sound/sfx/Sphinx.wav -- 1 Res/themes/White Shrine/sound/sfx/Spider.wav -- 1 Res/themes/White Shrine/sound/sfx/Spirit.wav -- 1 Res/themes/White Shrine/sound/sfx/Swamp.wav -- 1 Res/themes/White Shrine/sound/sfx/Thopter.wav -- 1 Res/themes/White Shrine/sound/sfx/Treefolk.wav -- 1 Res/themes/White Shrine/sound/sfx/Troll.wav -- 1 Res/themes/White Shrine/sound/sfx/Vampire.wav -- 1 Res/themes/White Shrine/sound/sfx/Vedalken.wav -- 1 Res/themes/White Shrine/sound/sfx/Viashino.wav -- 1 Res/themes/White Shrine/sound/sfx/Wall.wav -- 1 Res/themes/White Shrine/sound/sfx/Warrior.wav -- 1 Res/themes/White Shrine/sound/sfx/Wizard.wav -- 1 Res/themes/White Shrine/sound/sfx/Wolf.wav -- 1 Res/themes/White Shrine/sound/sfx/Wraith.wav -- 1 Res/themes/White Shrine/sound/sfx/Wurm.wav -- 1 Res/themes/White Shrine/sound/sfx/Zombie.wav -- 1 Res/themes/White Shrine/sound/sfx/affinitygreencreatures.wav -- 1 Res/themes/White Shrine/sound/sfx/defender.wav -- 1 Res/themes/White Shrine/sound/sfx/fear.wav -- 1 Res/themes/White Shrine/sound/sfx/first strike.wav -- 1 Res/themes/White Shrine/sound/sfx/flash.wav -- 1 Res/themes/White Shrine/sound/sfx/flying.wav -- 1 Res/themes/White Shrine/sound/sfx/forestwalk.wav -- 1 Res/themes/White Shrine/sound/sfx/graveyard.wav -- 1 Res/themes/White Shrine/sound/sfx/haste.wav -- 1 Res/themes/White Shrine/sound/sfx/lifelink.wav -- 1 Res/themes/White Shrine/sound/sfx/mana.wav -- 1 Res/themes/White Shrine/sound/sfx/mustattack.wav -- 1 Res/themes/White Shrine/sound/sfx/nofizzle.wav -- 1 Res/themes/White Shrine/sound/sfx/persist.wav -- 1 Res/themes/White Shrine/sound/sfx/protection from black.wav -- 1 Res/themes/White Shrine/sound/sfx/protection from blue.wav -- 1 Res/themes/White Shrine/sound/sfx/protection from white.wav -- 1 Res/themes/White Shrine/sound/sfx/reach.wav -- 1 Res/themes/White Shrine/sound/sfx/reachshadow.wav -- 1 Res/themes/White Shrine/sound/sfx/shadow.wav -- 1 Res/themes/White Shrine/sound/sfx/storm.wav -- 1 Res/themes/White Shrine/sound/sfx/swampwalk.wav -- 1 Res/themes/White Shrine/sound/sfx/trample.wav -- 1 Res/themes/White Shrine/sound/sfx/vigor.wav -- 1 Res/themes/White Shrine/sound/sfx/wither.wav -- 1 Res/themes/White Shrine/spade_ul.png -- 1 Res/themes/White Shrine/spade_ur.png -- 1 Res/themes/White Shrine/splash.jpg -- 1 Res/themes/White Shrine/stars.psi -- 1 Res/themes/White Shrine/style.txt -- 1 Res/themes/White Shrine/wallpapers/final_saga2.jpg -- 1 Res/themes/White Shrine/white_thumb.jpg -- 1 Res/themes/White Shrine/wood.png -- 1 Res/thumbnails/ -- 1 Res/thumbnails/.jpg -- 1 Res/thumbnails/194078.jpg -- 1 Res/thumbnails/208249.jpg -- 1 Res/thumbnails/209000.jpg -- 1 Res/thumbnails/22222220.jpg -- 1 Res/thumbnails/42187t.jpg -- 1 Res/thumbnails/4514111t.jpg -- 1 Res/thumbnails/4838511t.jpg -- 1 Res/thumbnails/4838512t.jpg -- 1 Res/thumbnails/51613t.jpg -- 1 Res/thumbnails/89069t.jpg -- 1 Res/thumbnails/Angel Token.jpg -- 1 Res/thumbnails/Auriok Sunchaser.jpg -- 1 Res/thumbnails/Bear.jpg -- 1 Res/thumbnails/Beast Token.jpg -- 1 Res/thumbnails/Darksteel Myr.jpg -- 1 Res/thumbnails/Dragon.jpg -- 1 Res/thumbnails/Insect Token.jpg -- 1 Res/thumbnails/Insect.jpg -- 1 Res/thumbnails/Memnite.jpg -- 1 Res/thumbnails/Saproling.jpg -- 1 Res/trample.wav -- 1 Res/vigor.wav -- 1 Res/wagic_res/graphics/simon.dat -- 1 Res/wither.wav -- 1 Rhino.wav -- 1 Rogue.wav -- 1 Samurai.wav -- 1 Saproling.jpg -- 1 Saproling.wav -- 1 Scarecrow.wav -- 1 Scout.wav -- 1 Serpent.wav -- 1 Shade.wav -- 1 Shaman.wav -- 1 Shapeshifter.wav -- 1 Siren.wav -- 1 Skeleton.wav -- 1 Slith.wav -- 1 Sliver.wav -- 1 Snake.wav -- 1 Snow.wav -- 1 Soldier.wav -- 1 Specter.wav -- 1 Sphinx.wav -- 1 Spider.wav -- 1 Spirit.wav -- 1 Swamp.wav -- 1 Thopter.wav -- 1 Treefolk.wav -- 1 Vedalken.wav -- 1 Viashino.wav -- 1 Wall.wav -- 1 Warrior.wav -- 1 Wizard.wav -- 1 Wolf.wav -- 1 Wraith.wav -- 1 affinitygreencreatures.wav -- 1 defender.wav -- 1 fear.wav -- 1 first strike.wav -- 1 flash.wav -- 1 forestwalk.wav -- 1 graphics/splash.jpg -- 1 haste.wav -- 1 lifelink.wav -- 1 ms0:/PSP/wagic_res/graphics/simon.dat -- 1 ms0:/wagic_res/graphics/simon.dat -- 1 mustattack.wav -- 1 nofizzle.wav -- 1 persist.wav -- 1 protection from black.wav -- 1 protection from blue.wav -- 1 protection from white.wav -- 1 reach.wav -- 1 reachshadow.wav -- 1 shadow.wav -- 1 storm.wav -- 1 swampwalk.wav -- 1 testsuite.txt -- 1 thumbnails/ -- 1 thumbnails/.jpg -- 1 thumbnails/194078.jpg -- 1 thumbnails/208249.jpg -- 1 thumbnails/209000.jpg -- 1 thumbnails/22222220.jpg -- 1 thumbnails/42187t.jpg -- 1 thumbnails/4514111t.jpg -- 1 thumbnails/4838511t.jpg -- 1 thumbnails/4838512t.jpg -- 1 thumbnails/51613t.jpg -- 1 thumbnails/89069t.jpg -- 1 thumbnails/Angel Token.jpg -- 1 thumbnails/Auriok Sunchaser.jpg -- 1 thumbnails/Bear.jpg -- 1 thumbnails/Beast Token.jpg -- 1 thumbnails/Darksteel Myr.jpg -- 1 thumbnails/Dragon.jpg -- 1 thumbnails/Insect Token.jpg -- 1 thumbnails/Insect.jpg -- 1 thumbnails/Memnite.jpg -- 1 thumbnails/Saproling.jpg -- 1 trample.wav -- 1 vigor.wav -- 1 wagic_res/graphics/simon.dat -- 1 wither.wav -- 1 End File Usage Statistics -------------------
1228 lines
30 KiB
C++
1228 lines
30 KiB
C++
#include "PrecompiledHeader.h"
|
|
|
|
#include "GameApp.h"
|
|
#include "Player.h"
|
|
#include "Tasks.h"
|
|
#include "AIPlayer.h"
|
|
#include "Translate.h"
|
|
#include "MTGDefinitions.h"
|
|
#include <JRenderer.h>
|
|
#include <math.h>
|
|
|
|
vector<string> Task::sAIDeckNames;
|
|
|
|
/*---------------- Utils -----------------*/
|
|
// TODO: Move to dedicated file
|
|
|
|
//!! Copypaste from GameStateDeckViewer.cpp StringExplode. Move and #include here and there
|
|
void ExplodeStr(string str, string separator, vector<string>* results)
|
|
{
|
|
int found;
|
|
results->clear();
|
|
found = str.find_first_of(separator);
|
|
while (found != (int) string::npos)
|
|
{
|
|
if (found > 0)
|
|
{
|
|
results->push_back(str.substr(0, found));
|
|
}
|
|
else
|
|
{
|
|
results->push_back(" ");
|
|
}
|
|
str = str.substr(found + 1);
|
|
found = str.find_first_of(separator);
|
|
}
|
|
if (str.length() > 0)
|
|
{
|
|
results->push_back(str);
|
|
}
|
|
}
|
|
|
|
string ImplodeStr(string separator, vector<string> strs)
|
|
{
|
|
string result = "";
|
|
for (vector<string>::iterator it = strs.begin(); it != strs.end(); it++)
|
|
{
|
|
result += (it == strs.begin() ? "" : separator) + (*it);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/*---------------- Task -----------------*/
|
|
|
|
Task::Task(char _type)
|
|
{
|
|
reward = 0;
|
|
expiresIn = 1;
|
|
accepted = false;
|
|
if (_type == ' ')
|
|
{
|
|
type = TASK_BASIC;
|
|
}
|
|
else
|
|
{
|
|
type = _type;
|
|
}
|
|
}
|
|
|
|
int Task::getReward()
|
|
{
|
|
if (reward == 0)
|
|
{
|
|
reward = computeReward();
|
|
}
|
|
|
|
return reward;
|
|
}
|
|
|
|
string Task::toString()
|
|
{
|
|
storeCommonAttribs();
|
|
storeCustomAttribs();
|
|
return ImplodeStr(ITEM_SEPARATOR, persistentAttribs);
|
|
}
|
|
|
|
// Store basic attributes to vector, for saving
|
|
void Task::storeCommonAttribs()
|
|
{
|
|
char buff[256];
|
|
|
|
persistentAttribs.clear();
|
|
persistentAttribs.push_back(string(1, type));
|
|
|
|
sprintf(buff, "%i", expiresIn);
|
|
persistentAttribs.push_back(string(buff));
|
|
|
|
sprintf(buff, "%i", accepted ? 1 : 0);
|
|
persistentAttribs.push_back(string(buff));
|
|
|
|
sprintf(buff, "%i", opponent);
|
|
persistentAttribs.push_back(string(buff));
|
|
|
|
sprintf(buff, "%i", reward);
|
|
persistentAttribs.push_back(string(buff));
|
|
|
|
persistentAttribs.push_back(getDesc());
|
|
|
|
persistentAttribs.push_back(getOpponentName());
|
|
}
|
|
|
|
int Task::restoreCommonAttribs()
|
|
{
|
|
if (persistentAttribs.size() < COMMON_ATTRIBS_COUNT)
|
|
{
|
|
#if defined (WIN32) || defined (LINUX)
|
|
DebugTrace("\nTasks.cpp::restoreCommonAttribs: Not enough attributes loaded\n");
|
|
#endif
|
|
|
|
return -1;
|
|
}
|
|
expiresIn = atoi(persistentAttribs[1].c_str());
|
|
accepted = (persistentAttribs[2].compare("1") == 0);
|
|
opponent = atoi(persistentAttribs[3].c_str());
|
|
reward = atoi(persistentAttribs[4].c_str());
|
|
description = persistentAttribs[5];
|
|
opponentName = persistentAttribs[6];
|
|
return 1;
|
|
}
|
|
|
|
void Task::storeCustomAttribs()
|
|
{
|
|
// To be extended in child class
|
|
}
|
|
|
|
void Task::restoreCustomAttribs()
|
|
{
|
|
// To be extended in child class
|
|
}
|
|
|
|
string Task::getOpponentName()
|
|
{
|
|
if (opponentName == "")
|
|
{
|
|
opponentName = Task::getAIDeckName(opponent);
|
|
}
|
|
|
|
return opponentName;
|
|
}
|
|
|
|
string Task::getDesc()
|
|
{
|
|
return (description == "") ? (description = createDesc()) : description;
|
|
}
|
|
|
|
void Task::randomize()
|
|
{
|
|
opponent = rand() % getAIDeckCount() + 1;
|
|
opponentName = "";
|
|
setExpiration((rand() % 3) + 1);
|
|
reward = computeReward();
|
|
}
|
|
|
|
bool Task::isExpired()
|
|
{
|
|
return (expiresIn <= 0);
|
|
}
|
|
|
|
int Task::getExpiration()
|
|
{
|
|
return expiresIn;
|
|
}
|
|
|
|
void Task::setExpiration(int _expiresIn)
|
|
{
|
|
expiresIn = _expiresIn;
|
|
}
|
|
|
|
void Task::passOneDay()
|
|
{
|
|
expiresIn--;
|
|
reward = (int) (getReward() * 0.9); // Todo: degradation and minreward constants
|
|
if (reward < 33)
|
|
{
|
|
reward = 33;
|
|
}
|
|
}
|
|
|
|
// AI deck buffering code
|
|
|
|
void Task::LoadAIDeckNames()
|
|
{
|
|
if (sAIDeckNames.empty())
|
|
{
|
|
int found = 1;
|
|
int nbDecks = 0;
|
|
while (found)
|
|
{
|
|
found = 0;
|
|
std::ostringstream stream;
|
|
stream << JGE_GET_RES("ai/baka") << "/deck" << nbDecks + 1 << ".txt";
|
|
if (fileExists(stream.str().c_str()))
|
|
{
|
|
found = 1;
|
|
nbDecks++;
|
|
// TODO: Creating MTGDeck only for getting decks name. Find an easier way.
|
|
MTGDeck * mtgd = NEW MTGDeck(stream.str().c_str(), NULL, 1);
|
|
sAIDeckNames.push_back(mtgd->meta_name);
|
|
delete mtgd;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
int Task::getAIDeckCount()
|
|
{
|
|
LoadAIDeckNames();
|
|
return MIN((size_t) options[Options::AIDECKS_UNLOCKED].number, sAIDeckNames.size());
|
|
}
|
|
|
|
string Task::getAIDeckName(int id)
|
|
{
|
|
LoadAIDeckNames();
|
|
return ((unsigned int) id <= sAIDeckNames.size()) ? sAIDeckNames.at(id - 1) : "<Undefined>";
|
|
}
|
|
|
|
// End of AI deck buffering code
|
|
|
|
// Each child class has to be added to the switch in this function (clumsy..)
|
|
Task* Task::createFromStr(string params, bool rand)
|
|
{
|
|
vector<string> exploded;
|
|
Task *result;
|
|
|
|
ExplodeStr(params, ITEM_SEPARATOR, &exploded);
|
|
|
|
switch (exploded[0][0])
|
|
{
|
|
case TASK_WIN_AGAINST:
|
|
result = NEW TaskWinAgainst();
|
|
break;
|
|
case TASK_SLAUGHTER:
|
|
result = NEW TaskSlaughter();
|
|
break;
|
|
case TASK_DELAY:
|
|
result = NEW TaskDelay();
|
|
break;
|
|
case TASK_IMMORTAL:
|
|
result = NEW TaskImmortal();
|
|
break;
|
|
case TASK_MASSIVE_BURIAL:
|
|
result = NEW TaskMassiveBurial();
|
|
break;
|
|
case TASK_WISDOM:
|
|
result = NEW TaskWisdom();
|
|
break;
|
|
case TASK_PACIFISM:
|
|
result = NEW TaskPacifism();
|
|
break;
|
|
default:
|
|
#if defined (WIN32) || defined (LINUX)
|
|
DebugTrace("\nTasks.cpp::createFromStr: Undefined class type\n");
|
|
#endif
|
|
result = NEW TaskWinAgainst();
|
|
}
|
|
|
|
if (!result)
|
|
{
|
|
#if defined (WIN32) || defined (LINUX)
|
|
DebugTrace("\nTask::createFromStr: Failed to create task\n");
|
|
#endif
|
|
return NULL;
|
|
}
|
|
|
|
result->persistentAttribs = exploded;
|
|
|
|
if (exploded.size() >= COMMON_ATTRIBS_COUNT)
|
|
{
|
|
result->restoreCommonAttribs();
|
|
if (exploded.size() > COMMON_ATTRIBS_COUNT)
|
|
{
|
|
result->restoreCustomAttribs();
|
|
}
|
|
}
|
|
else if (rand)
|
|
{
|
|
result->randomize();
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
/*---------------- TaskList -----------------*/
|
|
|
|
TaskList::TaskList(string _fileName)
|
|
{
|
|
fileName = _fileName;
|
|
if (fileName == "")
|
|
{
|
|
fileName = options.profileFile(PLAYER_TASKS).c_str();
|
|
}
|
|
load(fileName);
|
|
for (int i = 0; i < 9; i++)
|
|
mBg[i] = NULL;
|
|
mBgTex = NULL; //We only load the background if we use the task screen.
|
|
}
|
|
|
|
int TaskList::save(string _fileName)
|
|
{
|
|
if (_fileName != "")
|
|
{
|
|
fileName = _fileName;
|
|
}
|
|
if (fileName == "")
|
|
{
|
|
#if defined (WIN32) || defined (LINUX)
|
|
DebugTrace("\nTaskList::save: No filename specified\n");
|
|
#endif
|
|
return -1;
|
|
}
|
|
|
|
std::ofstream file(fileName.c_str());
|
|
if (file)
|
|
{
|
|
#if defined (WIN32) || defined (LINUX)
|
|
DebugTrace("\nsaving tasks\n");
|
|
#endif
|
|
|
|
file << "# Format: <Type>|<Expiration>|<Accepted>|<Opponent>|<Reward>|<Description>[|Additional attributes]\n";
|
|
|
|
for (vector<Task*>::iterator it = tasks.begin(); it != tasks.end(); it++)
|
|
{
|
|
file << (*it)->toString() << "\n";
|
|
}
|
|
file.close();
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
int TaskList::load(string _fileName)
|
|
{
|
|
Task *task;
|
|
if (_fileName != "")
|
|
{
|
|
fileName = _fileName;
|
|
}
|
|
if (fileName == "")
|
|
{
|
|
#if defined (WIN32) || defined (LINUX)
|
|
DebugTrace("\nTaskList::load: No filename specified\n");
|
|
#endif
|
|
return -1;
|
|
}
|
|
|
|
wagic::ifstream file(fileName.c_str());
|
|
std::string s;
|
|
|
|
if (file)
|
|
{
|
|
while (std::getline(file, s))
|
|
{
|
|
if (!s.size()) continue;
|
|
if (s[s.size() - 1] == '\r') s.erase(s.size() - 1); //Handle DOS files
|
|
if (s[0] == '#')
|
|
{
|
|
continue;
|
|
}
|
|
|
|
task = Task::createFromStr(s);
|
|
if (task)
|
|
{
|
|
this->addTask(task);
|
|
}
|
|
else
|
|
{
|
|
#if defined (WIN32) || defined (LINUX)
|
|
DebugTrace("\nTaskList::load: error creating task\n");
|
|
#endif
|
|
}
|
|
}
|
|
file.close();
|
|
}
|
|
else
|
|
{
|
|
#if defined (WIN32) || defined (LINUX)
|
|
DebugTrace("\nTaskList::load: Failed to open file\n");
|
|
#endif
|
|
return -1;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
void TaskList::addTask(Task *task)
|
|
{
|
|
tasks.push_back(task);
|
|
}
|
|
|
|
void TaskList::addTask(string params, bool rand)
|
|
{
|
|
addTask(Task::createFromStr(params, rand));
|
|
}
|
|
|
|
void TaskList::removeTask(Task *task)
|
|
{
|
|
vector<Task*>::iterator it;
|
|
|
|
it = find(tasks.begin(), tasks.end(), task);
|
|
|
|
if (it != tasks.end())
|
|
{
|
|
SAFE_DELETE(*it);
|
|
tasks.erase(it);
|
|
}
|
|
else
|
|
{
|
|
// TODO: task not found handling.
|
|
}
|
|
}
|
|
|
|
void TaskList::Start()
|
|
{
|
|
vPos = -SCREEN_HEIGHT; //Offscreen
|
|
mElapsed = 0;
|
|
mState = TASKS_IN;
|
|
if (!mBgTex)
|
|
{
|
|
mBgTex = WResourceManager::Instance()->RetrieveTexture("taskboard.png", RETRIEVE_LOCK);
|
|
float unitH = static_cast<float> (mBgTex->mHeight / 4);
|
|
float unitW = static_cast<float> (mBgTex->mWidth / 4);
|
|
if (unitH == 0 || unitW == 0) return;
|
|
|
|
for (int i = 0; i < 9; i++)
|
|
SAFE_DELETE(mBg[i]);
|
|
if (mBgTex)
|
|
{
|
|
mBg[0] = NEW JQuad(mBgTex, 0, 0, unitW, unitH);
|
|
mBg[1] = NEW JQuad(mBgTex, unitW, 0, unitW * 2, unitH);
|
|
mBg[2] = NEW JQuad(mBgTex, unitW * 3, 0, unitW, unitH);
|
|
mBg[3] = NEW JQuad(mBgTex, 0, unitH, unitW, unitH * 2);
|
|
mBg[4] = NEW JQuad(mBgTex, unitW, unitH, unitW * 2, unitH * 2);
|
|
mBg[5] = NEW JQuad(mBgTex, unitW * 3, unitH, unitW, unitH * 2);
|
|
mBg[6] = NEW JQuad(mBgTex, 0, unitH * 3, unitW, unitH);
|
|
mBg[7] = NEW JQuad(mBgTex, unitW, unitH * 3, unitW * 2, unitH);
|
|
mBg[8] = NEW JQuad(mBgTex, unitW * 3, unitH * 3, unitW, unitH);
|
|
}
|
|
|
|
sH = 64 / unitH;
|
|
sW = 64 / unitW;
|
|
}
|
|
}
|
|
void TaskList::End()
|
|
{
|
|
mState = TASKS_OUT;
|
|
mElapsed = 0;
|
|
}
|
|
|
|
void TaskList::passOneDay()
|
|
{
|
|
// TODO: "You have failed the task" message to the user when accepted task expires
|
|
for (vector<Task*>::iterator it = tasks.begin(); it != tasks.end();)
|
|
{
|
|
(*it)->passOneDay();
|
|
if ((*it)->isExpired())
|
|
{
|
|
SAFE_DELETE(*it);
|
|
it = tasks.erase(it);
|
|
}
|
|
else
|
|
{
|
|
it++;
|
|
}
|
|
}
|
|
}
|
|
|
|
void TaskList::getDoneTasks(Player * _p1, Player * _p2, GameApp * _app, vector<Task*>* result)
|
|
{
|
|
result->clear();
|
|
// TODO: Return only accepted tasks
|
|
for (vector<Task*>::iterator it = tasks.begin(); it != tasks.end(); it++)
|
|
{
|
|
if ((*it)->isDone(_p1, _p2, _app))
|
|
{
|
|
result->push_back(*it);
|
|
}
|
|
}
|
|
}
|
|
|
|
int TaskList::getTaskCount()
|
|
{
|
|
return tasks.size();
|
|
}
|
|
|
|
void TaskList::Update(float dt)
|
|
{
|
|
mElapsed += dt;
|
|
|
|
if (mState == TASKS_IN && vPos < 0)
|
|
{
|
|
vPos = -SCREEN_HEIGHT + (SCREEN_HEIGHT * mElapsed / 0.75f); //Todo: more physical drop-in.
|
|
if (vPos >= 0)
|
|
{
|
|
vPos = 0;
|
|
mState = TaskList::TASKS_ACTIVE;
|
|
}
|
|
}
|
|
else if (mState == TASKS_OUT && vPos > -SCREEN_HEIGHT)
|
|
{
|
|
vPos = -(SCREEN_HEIGHT * mElapsed / 0.75f);
|
|
if (vPos <= -SCREEN_HEIGHT) mState = TASKS_INACTIVE;
|
|
}
|
|
}
|
|
|
|
void TaskList::Render()
|
|
{
|
|
JRenderer * r = JRenderer::GetInstance();
|
|
//Setup fonts.
|
|
WFont * f = WResourceManager::Instance()->GetWFont(Fonts::MAIN_FONT);
|
|
WFont * f2 = WResourceManager::Instance()->GetWFont(Fonts::MAGIC_FONT);
|
|
WFont * f3 = WResourceManager::Instance()->GetWFont(Fonts::MENU_FONT); //OPTION_FONT
|
|
f2->SetColor(ARGB(255, 205, 237, 240));
|
|
f3->SetColor(ARGB(255, 219, 206, 151));
|
|
|
|
//Render background board
|
|
if (mBgTex)
|
|
{
|
|
r->FillRect(0, vPos, SCREEN_WIDTH, SCREEN_HEIGHT, ARGB(128,0,0,0));
|
|
r->RenderQuad(mBg[0], 0, vPos, 0, sW, sH); //TL
|
|
r->RenderQuad(mBg[2], SCREEN_WIDTH - 64, vPos, 0, sW, sH); //TR
|
|
r->RenderQuad(mBg[6], 0, vPos + SCREEN_HEIGHT - 64, 0, sW, sH); //BL
|
|
r->RenderQuad(mBg[8], SCREEN_WIDTH - 64, vPos + SCREEN_HEIGHT - 64, 0, sW, sH); //BR
|
|
|
|
//Stretch the sides
|
|
float stretchV = (144.0f / 128.0f) * sH;
|
|
float stretchH = (176.0f / 128.0f) * sW;
|
|
r->RenderQuad(mBg[3], 0, vPos + 64, 0, sW, stretchV); //L
|
|
r->RenderQuad(mBg[5], SCREEN_WIDTH - 64, vPos + 64, 0, sW, stretchV); //R
|
|
r->RenderQuad(mBg[1], 64, vPos, 0, stretchH, sH); //T1
|
|
r->RenderQuad(mBg[1], 240, vPos, 0, stretchH, sH); //T1
|
|
r->RenderQuad(mBg[7], 64, vPos + 208, 0, stretchH, sH); //B1
|
|
r->RenderQuad(mBg[7], 240, vPos + 208, 0, stretchH, sH); //B1
|
|
r->RenderQuad(mBg[4], 64, vPos + 64, 0, stretchH, stretchV); //Center1
|
|
r->RenderQuad(mBg[4], 240, vPos + 64, 0, stretchH, stretchV); //Center2
|
|
|
|
f2->SetColor(ARGB(255, 55, 46, 34));
|
|
f = f2;
|
|
}
|
|
else
|
|
{
|
|
r->FillRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, ARGB(128,0,0,0));
|
|
r->FillRect(10, 10 + vPos, SCREEN_WIDTH - 10, SCREEN_HEIGHT - 10, ARGB(128,0,0,0));
|
|
}
|
|
|
|
float posX = 40, posY = vPos + 20;
|
|
char buffer[300];
|
|
string title = _("Task Board");
|
|
|
|
f3->DrawString(title.c_str(), static_cast<float> ((SCREEN_WIDTH - 20) / 2 - title.length() * 4), posY);
|
|
posY += 30;
|
|
|
|
if (0 == tasks.size())
|
|
{
|
|
f->DrawString(_("There are no tasks that need to be done. Come again tomorrow.").c_str(), posX, posY);
|
|
posY += 20;
|
|
return;
|
|
}
|
|
|
|
for (vector<Task*>::iterator it = tasks.begin(); it != tasks.end(); it++)
|
|
{
|
|
sprintf(buffer, "%s", (*it)->getShortDesc().c_str());
|
|
f2->DrawString(buffer, posX, posY);
|
|
if (mBgTex)
|
|
{
|
|
f->SetScale(.8f);
|
|
}
|
|
sprintf(buffer, _("Days left: %i").c_str(), (*it)->getExpiration());
|
|
f->DrawString(buffer, SCREEN_WIDTH - 190, posY);
|
|
sprintf(buffer, _("Reward: %i").c_str(), (*it)->getReward());
|
|
f->DrawString(buffer, SCREEN_WIDTH - 100, posY);
|
|
posY += 15;
|
|
|
|
sprintf(buffer, "%s", (*it)->getDesc().c_str());
|
|
f->DrawString(buffer, posX + 10, posY);
|
|
posY += 15;
|
|
if (mBgTex)
|
|
{
|
|
f->SetScale(1);
|
|
}
|
|
//r->DrawLine((SCREEN_WIDTH)/2 - 200, posY, (SCREEN_WIDTH)/2 + 200, posY, ARGB(128, 255, 255, 255));
|
|
}
|
|
f->SetScale(1);
|
|
}
|
|
|
|
void TaskList::addRandomTask(int diff)
|
|
{
|
|
// TODO: Weighted random (rarity of tasks)
|
|
// - based on counts of finished tasks?
|
|
// Winning a task several times may slightly lessen the probability of it being generated
|
|
string s(TASKS_ALL);
|
|
char taskType[2];
|
|
sprintf(taskType, "%c", s[rand() % s.length()]);
|
|
addTask(string(taskType), true);
|
|
}
|
|
|
|
TaskList::~TaskList()
|
|
{
|
|
|
|
for (unsigned int i = 0; i < tasks.size(); i++)
|
|
{
|
|
SAFE_DELETE(tasks[i]);
|
|
}
|
|
if (mBgTex) WResourceManager::Instance()->Release(mBgTex);
|
|
for (int i = 0; i < 9; i++)
|
|
SAFE_DELETE(mBg[i]);
|
|
}
|
|
|
|
/*----------------------------------------*/
|
|
/*---------------- Tasks -----------------*/
|
|
/*----------------------------------------*/
|
|
|
|
/*----------- TaskWinAgainst -------------*/
|
|
|
|
TaskWinAgainst::TaskWinAgainst(int _opponent) :
|
|
Task(TASK_WIN_AGAINST)
|
|
{
|
|
opponent = _opponent;
|
|
}
|
|
|
|
int TaskWinAgainst::computeReward()
|
|
{
|
|
return 75 + rand() % 75;
|
|
}
|
|
|
|
string TaskWinAgainst::createDesc()
|
|
{
|
|
char buffer[4096];
|
|
switch (rand() % 2)
|
|
{
|
|
case 0:
|
|
sprintf(buffer, _("You have to defeat %s before it causes too much harm.").c_str(), getOpponentName().c_str());
|
|
break;
|
|
case 1:
|
|
sprintf(buffer, _("Please defeat %s as soon as possible.").c_str(), getOpponentName().c_str());
|
|
break;
|
|
}
|
|
return buffer;
|
|
}
|
|
|
|
string TaskWinAgainst::getShortDesc()
|
|
{
|
|
char buffer[4096];
|
|
string result;
|
|
|
|
sprintf(buffer, _("Defeat %s").c_str(), getOpponentName().c_str());
|
|
result = buffer;
|
|
|
|
return result;
|
|
}
|
|
|
|
bool TaskWinAgainst::isDone(Player * _p1, Player * _p2, GameApp * _app)
|
|
{
|
|
GameObserver * g = GameObserver::GetInstance();
|
|
AIPlayerBaka * baka = (AIPlayerBaka*) _p2;
|
|
return ((baka) && (!_p1->isAI()) && (_p2->isAI()) && (g->gameOver != _p1) // Human player wins
|
|
&& (baka->deckId == opponent));
|
|
}
|
|
|
|
/*----------- TaskSlaughter -------------*/
|
|
|
|
TaskSlaughter::TaskSlaughter(int _opponent, int _targetLife) :
|
|
TaskWinAgainst(_opponent)
|
|
{
|
|
type = TASK_SLAUGHTER;
|
|
targetLife = _targetLife;
|
|
}
|
|
|
|
int TaskSlaughter::computeReward()
|
|
{
|
|
return 2 * TaskWinAgainst::computeReward() - 9 * targetLife * (targetLife < -50 ? 2 : 1);
|
|
}
|
|
|
|
void TaskSlaughter::randomize()
|
|
{
|
|
targetLife = -15 - rand() % 10;
|
|
if (!(rand() % 7))
|
|
{
|
|
targetLife *= 5;
|
|
}
|
|
Task::randomize();
|
|
}
|
|
|
|
string TaskSlaughter::createDesc()
|
|
{
|
|
char buffer[4096];
|
|
switch (rand() % 2)
|
|
{
|
|
case 0:
|
|
sprintf(buffer, _("Defeat %s in a way it won't forget. Bring it to %i life.").c_str(), getOpponentName().c_str(),
|
|
targetLife);
|
|
break;
|
|
case 1:
|
|
sprintf(buffer, _("Slaughter %s! Beat it to %i life or less.").c_str(), getOpponentName().c_str(), targetLife);
|
|
break;
|
|
}
|
|
return buffer;
|
|
}
|
|
|
|
string TaskSlaughter::getShortDesc()
|
|
{
|
|
char buffer[4096];
|
|
sprintf(buffer, _("Slaughter %s (%i life)").c_str(), getOpponentName().c_str(), targetLife);
|
|
return buffer;
|
|
}
|
|
|
|
bool TaskSlaughter::isDone(Player * _p1, Player * _p2, GameApp * _app)
|
|
{
|
|
return TaskWinAgainst::isDone(_p1, _p2, _app) && (_p2->life <= targetLife);
|
|
}
|
|
|
|
void TaskSlaughter::storeCustomAttribs()
|
|
{
|
|
char buff[256];
|
|
|
|
sprintf(buff, "%i", targetLife);
|
|
persistentAttribs.push_back(buff);
|
|
}
|
|
|
|
void TaskSlaughter::restoreCustomAttribs()
|
|
{
|
|
targetLife = atoi(persistentAttribs[COMMON_ATTRIBS_COUNT].c_str());
|
|
}
|
|
|
|
/*----------- TaskDelay -------------*/
|
|
// Now serves as both 'Delay' and 'Fast defeat' task.
|
|
|
|
TaskDelay::TaskDelay(int _opponent, int _turn) :
|
|
TaskWinAgainst(_opponent)
|
|
{
|
|
type = TASK_DELAY;
|
|
turn = _turn;
|
|
afterTurn = true;
|
|
}
|
|
|
|
int TaskDelay::computeReward()
|
|
{
|
|
return TaskWinAgainst::computeReward() + (afterTurn ? turn * 33 : (17 - turn) * (17 - turn) * 17);
|
|
}
|
|
|
|
void TaskDelay::randomize()
|
|
{
|
|
afterTurn = rand() % 2 == 1;
|
|
turn = afterTurn ? rand() % 15 + 20 : 15 - rand() % 9;
|
|
Task::randomize();
|
|
}
|
|
|
|
string TaskDelay::createDesc()
|
|
{
|
|
char buffer[4096];
|
|
if (afterTurn)
|
|
{
|
|
switch (rand() % 2)
|
|
{
|
|
case 0:
|
|
sprintf(buffer, _("Defeat %s after keeping it occupied for %i turns.").c_str(), getOpponentName().c_str(), turn);
|
|
break;
|
|
case 1:
|
|
sprintf(buffer, _("Defeat %s, but play with it for %i turns first.").c_str(), getOpponentName().c_str(), turn);
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
switch (rand() % 2)
|
|
{
|
|
case 0:
|
|
sprintf(buffer, _("Defeat %s and make sure it doesn't take more than %i turns.").c_str(), getOpponentName().c_str(),
|
|
turn);
|
|
break;
|
|
case 1:
|
|
sprintf(buffer, _("Defeat %s, in a duel no longer than %i turns.").c_str(), getOpponentName().c_str(), turn);
|
|
break;
|
|
}
|
|
}
|
|
return buffer;
|
|
}
|
|
|
|
string TaskDelay::getShortDesc()
|
|
{
|
|
char buffer[4096];
|
|
if (afterTurn)
|
|
{
|
|
sprintf(buffer, _("Delay %s for %i turns").c_str(), getOpponentName().c_str(), turn);
|
|
}
|
|
else
|
|
{
|
|
sprintf(buffer, _("Defeat %s before turn %i").c_str(), getOpponentName().c_str(), turn + 1);
|
|
}
|
|
return buffer;
|
|
}
|
|
|
|
bool TaskDelay::isDone(Player * _p1, Player * _p2, GameApp * _app)
|
|
{
|
|
GameObserver * g = GameObserver::GetInstance();
|
|
return TaskWinAgainst::isDone(_p1, _p2, _app) && (afterTurn ? (g->turn >= turn) : (g->turn <= turn));
|
|
}
|
|
|
|
void TaskDelay::storeCustomAttribs()
|
|
{
|
|
char buff[256];
|
|
|
|
sprintf(buff, "%i", turn);
|
|
persistentAttribs.push_back(buff);
|
|
sprintf(buff, "%i", afterTurn);
|
|
persistentAttribs.push_back(buff);
|
|
}
|
|
|
|
void TaskDelay::restoreCustomAttribs()
|
|
{
|
|
turn = atoi(persistentAttribs[COMMON_ATTRIBS_COUNT].c_str());
|
|
if (persistentAttribs.size() > COMMON_ATTRIBS_COUNT + 1)
|
|
{
|
|
afterTurn = static_cast<bool> (atoi(persistentAttribs[COMMON_ATTRIBS_COUNT + 1].c_str()));
|
|
}
|
|
}
|
|
|
|
/* ------------ TaskImmortal ------------ */
|
|
|
|
TaskImmortal::TaskImmortal(int _targetLife) :
|
|
Task(TASK_IMMORTAL)
|
|
{
|
|
targetLife = _targetLife;
|
|
level = (targetLife < 100) ? 0 : ((targetLife < 1000) ? 1 : 2);
|
|
}
|
|
|
|
int TaskImmortal::computeReward()
|
|
{
|
|
return targetLife * 2 + 150 + rand() % 50;
|
|
}
|
|
|
|
string TaskImmortal::createDesc()
|
|
{
|
|
char buffer[4096];
|
|
|
|
sprintf(buffer, _("Defeat any opponent, having at least %i life in the end.").c_str(), targetLife);
|
|
|
|
return buffer;
|
|
}
|
|
|
|
string TaskImmortal::getShortDesc()
|
|
{
|
|
char buffer[4096];
|
|
|
|
switch (level)
|
|
{
|
|
case 0:
|
|
sprintf(buffer, _("Win flawlessly (%i life)").c_str(), targetLife);
|
|
break;
|
|
case 1:
|
|
sprintf(buffer, _("Reach Invulnerability (%i life)").c_str(), targetLife);
|
|
break;
|
|
case 2:
|
|
sprintf(buffer, _("Reach Immortality! (%i life)").c_str(), targetLife);
|
|
break;
|
|
}
|
|
|
|
return buffer;
|
|
}
|
|
|
|
bool TaskImmortal::isDone(Player * _p1, Player * _p2, GameApp * _app)
|
|
{
|
|
GameObserver * g = GameObserver::GetInstance();
|
|
return (!_p1->isAI()) && (_p2->isAI()) && (g->gameOver != _p1) // Human player wins
|
|
&& (_p1->life >= targetLife);
|
|
}
|
|
|
|
void TaskImmortal::storeCustomAttribs()
|
|
{
|
|
char buff[256];
|
|
|
|
sprintf(buff, "%i", targetLife);
|
|
persistentAttribs.push_back(buff);
|
|
|
|
sprintf(buff, "%i", level);
|
|
persistentAttribs.push_back(buff);
|
|
}
|
|
|
|
void TaskImmortal::restoreCustomAttribs()
|
|
{
|
|
targetLife = atoi(persistentAttribs[COMMON_ATTRIBS_COUNT].c_str());
|
|
level = atoi(persistentAttribs[COMMON_ATTRIBS_COUNT + 1].c_str());
|
|
}
|
|
|
|
void TaskImmortal::randomize()
|
|
{
|
|
level = rand() % 3;
|
|
switch (level)
|
|
{
|
|
case 0:
|
|
targetLife = 20 + rand() % 10;
|
|
break;
|
|
case 1:
|
|
targetLife = 100 + 5 * (rand() % 5);
|
|
break;
|
|
case 2:
|
|
targetLife = 1000 + 50 * (rand() % 10);
|
|
break;
|
|
}
|
|
Task::randomize();
|
|
}
|
|
/* ------------ TaskMassiveBurial ------------ */
|
|
|
|
TaskMassiveBurial::TaskMassiveBurial(int _color, int _bodyCount) :
|
|
Task(TASK_MASSIVE_BURIAL)
|
|
{
|
|
color = _color;
|
|
bodyCount = _bodyCount;
|
|
if ((0 == color) || (0 == bodyCount))
|
|
{
|
|
randomize();
|
|
}
|
|
}
|
|
|
|
int TaskMassiveBurial::computeReward()
|
|
{
|
|
return rand() % 150 + bodyCount * ((Constants::MTG_COLOR_LAND == color) ? 70 : 50);
|
|
}
|
|
|
|
string TaskMassiveBurial::createDesc()
|
|
{
|
|
char buffer[4096];
|
|
|
|
sprintf(buffer, _("Bury %i %s cards to your opponent's graveyard and defeat him.").c_str(), bodyCount,
|
|
Constants::MTGColorStrings[color]);
|
|
|
|
return buffer;
|
|
}
|
|
|
|
string TaskMassiveBurial::getShortDesc()
|
|
{
|
|
char buffer[4096];
|
|
switch (color)
|
|
{
|
|
case Constants::MTG_COLOR_GREEN:
|
|
sprintf(buffer, _("Tame the nature (%i)").c_str(), bodyCount);
|
|
break;
|
|
case Constants::MTG_COLOR_BLUE:
|
|
sprintf(buffer, _("Evaporation (%i)").c_str(), bodyCount);
|
|
break;
|
|
case Constants::MTG_COLOR_RED:
|
|
sprintf(buffer, _("Bring the order (%i)").c_str(), bodyCount);
|
|
break;
|
|
case Constants::MTG_COLOR_BLACK:
|
|
sprintf(buffer, _("Exorcism (%i)").c_str(), bodyCount);
|
|
break;
|
|
case Constants::MTG_COLOR_WHITE:
|
|
sprintf(buffer, _("Dusk (%i)").c_str(), bodyCount);
|
|
break;
|
|
case Constants::MTG_COLOR_LAND:
|
|
sprintf(buffer, _("Selective disaster (%i)").c_str(), bodyCount);
|
|
break;
|
|
}
|
|
return buffer;
|
|
}
|
|
|
|
bool TaskMassiveBurial::isDone(Player * _p1, Player * _p2, GameApp * _app)
|
|
{
|
|
int countColor = 0;
|
|
vector<MTGCardInstance *> cards = _p2->game->graveyard->cards;
|
|
|
|
for (vector<MTGCardInstance *>::iterator it = cards.begin(); it != cards.end(); it++)
|
|
{
|
|
if ((*it)->hasColor(color))
|
|
{
|
|
countColor++;
|
|
}
|
|
}
|
|
|
|
return (countColor >= bodyCount);
|
|
}
|
|
|
|
void TaskMassiveBurial::storeCustomAttribs()
|
|
{
|
|
char buff[256];
|
|
sprintf(buff, "%i", color);
|
|
persistentAttribs.push_back(buff);
|
|
|
|
sprintf(buff, "%i", bodyCount);
|
|
persistentAttribs.push_back(buff);
|
|
}
|
|
|
|
void TaskMassiveBurial::restoreCustomAttribs()
|
|
{
|
|
color = atoi(persistentAttribs[COMMON_ATTRIBS_COUNT].c_str());
|
|
bodyCount = atoi(persistentAttribs[COMMON_ATTRIBS_COUNT + 1].c_str());
|
|
}
|
|
|
|
void TaskMassiveBurial::randomize()
|
|
{
|
|
color = rand() % (Constants::MTG_NB_COLORS - 1) + 1;
|
|
bodyCount = 5 + ((Constants::MTG_COLOR_LAND == color) ? rand() % 10 : rand() % 20);
|
|
Task::randomize();
|
|
}
|
|
|
|
/* ------------ TaskWisdom ------------ */
|
|
|
|
TaskWisdom::TaskWisdom(int _color, int _cardCount) :
|
|
Task(TASK_WISDOM)
|
|
{
|
|
color = _color;
|
|
cardCount = _cardCount;
|
|
if ((0 == color) || (0 == cardCount))
|
|
{
|
|
randomize();
|
|
}
|
|
}
|
|
|
|
int TaskWisdom::computeReward()
|
|
{
|
|
return (rand() % 150) + (cardCount * 50) + (cardCount > 7 ? 200 : 0);
|
|
}
|
|
|
|
string TaskWisdom::createDesc()
|
|
{
|
|
char buffer[4096];
|
|
|
|
sprintf(buffer, _("Win a game with at least %i %s cards in your hand.").c_str(), cardCount, Constants::MTGColorStrings[color]);
|
|
|
|
return buffer;
|
|
}
|
|
|
|
string TaskWisdom::getShortDesc()
|
|
{
|
|
char buffer[4096];
|
|
switch (color)
|
|
{
|
|
case Constants::MTG_COLOR_GREEN:
|
|
sprintf(buffer, _("Animal herder (%i)").c_str(), cardCount);
|
|
break;
|
|
case Constants::MTG_COLOR_BLUE:
|
|
sprintf(buffer, _("Accumulated knowledge (%i)").c_str(), cardCount);
|
|
break;
|
|
case Constants::MTG_COLOR_RED:
|
|
sprintf(buffer, _("Retained anger (%i)").c_str(), cardCount);
|
|
break;
|
|
case Constants::MTG_COLOR_BLACK:
|
|
sprintf(buffer, _("Necropotence (%i)").c_str(), cardCount);
|
|
break;
|
|
case Constants::MTG_COLOR_WHITE:
|
|
sprintf(buffer, _("Dawn of crusade (%i)").c_str(), cardCount);
|
|
break;
|
|
case Constants::MTG_COLOR_LAND:
|
|
sprintf(buffer, _("Mana reserves (%i)").c_str(), cardCount);
|
|
break;
|
|
}
|
|
return buffer;
|
|
}
|
|
|
|
bool TaskWisdom::isDone(Player * _p1, Player * _p2, GameApp * _app)
|
|
{
|
|
GameObserver * g = GameObserver::GetInstance();
|
|
int countColor = 0;
|
|
vector<MTGCardInstance *> cards = _p1->game->hand->cards;
|
|
|
|
for (vector<MTGCardInstance *>::iterator it = cards.begin(); it != cards.end(); it++)
|
|
{
|
|
if ((*it)->hasColor(color))
|
|
{
|
|
countColor++;
|
|
}
|
|
}
|
|
|
|
return (!_p1->isAI()) && (_p2->isAI()) && (g->gameOver != _p1) // Human player wins
|
|
&& (countColor >= cardCount);
|
|
}
|
|
|
|
void TaskWisdom::storeCustomAttribs()
|
|
{
|
|
char buff[256];
|
|
sprintf(buff, "%i", color);
|
|
persistentAttribs.push_back(buff);
|
|
|
|
sprintf(buff, "%i", cardCount);
|
|
persistentAttribs.push_back(buff);
|
|
}
|
|
|
|
void TaskWisdom::restoreCustomAttribs()
|
|
{
|
|
color = atoi(persistentAttribs[COMMON_ATTRIBS_COUNT].c_str());
|
|
cardCount = atoi(persistentAttribs[COMMON_ATTRIBS_COUNT + 1].c_str());
|
|
}
|
|
|
|
void TaskWisdom::randomize()
|
|
{
|
|
color = rand() % (Constants::MTG_NB_COLORS - 1) + 1;
|
|
cardCount = 2 + ((Constants::MTG_COLOR_LAND == color) ? rand() % 5 : rand() % 7);
|
|
Task::randomize();
|
|
}
|
|
|
|
/* ------------ TaskPacifism ------------ */
|
|
|
|
TaskPacifism::TaskPacifism(int _lifeSlashCardMin) :
|
|
Task(TASK_PACIFISM)
|
|
{
|
|
lifeSlashCardMin = _lifeSlashCardMin;
|
|
if (lifeSlashCardMin == 0)
|
|
{
|
|
randomize();
|
|
}
|
|
}
|
|
|
|
int TaskPacifism::computeReward()
|
|
{
|
|
return 200 + (rand() % 50) + (lifeSlashCardMin * 5) + (lifeSlashCardMin > 20 ? 200 : 0);
|
|
}
|
|
|
|
string TaskPacifism::createDesc()
|
|
{
|
|
char buffer[4096];
|
|
|
|
switch (rand() % 2)
|
|
{
|
|
case 0:
|
|
sprintf(buffer, _("Let your opponent live with at least %i life and cards in library, but defeat him.").c_str(),
|
|
lifeSlashCardMin);
|
|
break;
|
|
case 1:
|
|
sprintf(buffer, _("Win a game with your opponent having at least %i life and cards in library.").c_str(), lifeSlashCardMin);
|
|
break;
|
|
}
|
|
return buffer;
|
|
}
|
|
|
|
string TaskPacifism::getShortDesc()
|
|
{
|
|
char buffer[4096];
|
|
sprintf(buffer, _("Pacifism (%i)").c_str(), lifeSlashCardMin);
|
|
return buffer;
|
|
}
|
|
|
|
bool TaskPacifism::isDone(Player * _p1, Player * _p2, GameApp * _app)
|
|
{
|
|
GameObserver * g = GameObserver::GetInstance();
|
|
return (!_p1->isAI()) && (_p2->isAI()) && (g->gameOver != _p1) // Human player wins
|
|
&& (_p2->life >= lifeSlashCardMin) && ((int) _p2->game->library->cards.size() >= lifeSlashCardMin);
|
|
}
|
|
|
|
void TaskPacifism::storeCustomAttribs()
|
|
{
|
|
char buff[256];
|
|
|
|
sprintf(buff, "%i", lifeSlashCardMin);
|
|
persistentAttribs.push_back(buff);
|
|
}
|
|
|
|
void TaskPacifism::restoreCustomAttribs()
|
|
{
|
|
lifeSlashCardMin = atoi(persistentAttribs[COMMON_ATTRIBS_COUNT].c_str());
|
|
}
|
|
|
|
void TaskPacifism::randomize()
|
|
{
|
|
lifeSlashCardMin = rand() % 25 + 1;
|
|
Task::randomize();
|
|
}
|
|
|
|
/* ------------ Task template ------------
|
|
|
|
TaskXX::TaskXX() : Task(TASK_XX) {
|
|
// TODO: Implement
|
|
}
|
|
|
|
int TaskXX::computeReward() {
|
|
// TODO: Implement
|
|
return 100;
|
|
}
|
|
|
|
string TaskXX::createDesc() {
|
|
// TODO: Implement
|
|
char buffer[4096];
|
|
|
|
switch (rand()%2) {
|
|
case 0:
|
|
sprintf(buffer, _("%s").c_str(), getOpponentName().c_str());
|
|
break;
|
|
case 1:
|
|
sprintf(buffer, _("%s").c_str(), getOpponentName().c_str());
|
|
break;
|
|
}
|
|
return buffer;
|
|
}
|
|
|
|
string TaskXX::getShortDesc(){
|
|
// TODO: Implement
|
|
char buffer[4096];
|
|
sprintf(buffer, _("%s").c_str(), getOpponentName().c_str());
|
|
return buffer;
|
|
}
|
|
|
|
bool TaskXX::isDone(Player * _p1, Player * _p2, GameApp * _app) {
|
|
GameObserver * g = GameObserver::GetInstance();
|
|
// TODO: Implement
|
|
return (!_p1->isAI()) && (_p2->isAI()) && (g->gameOver != _p1) // Human player wins
|
|
&& ;
|
|
}
|
|
|
|
void TaskXX::storeCustomAttribs() {
|
|
// TODO: Implement
|
|
char buff[256];
|
|
persistentAttribs.push_back(VarXX);
|
|
|
|
sprintf(buff, "%i", VarXY);
|
|
persistentAttribs.push_back(buff);
|
|
}
|
|
|
|
void TaskXX::restoreCustomAttribs() {
|
|
// TODO: Implement
|
|
VarXX = persistentAttribs[COMMON_ATTRIBS_COUNT];
|
|
VarXY = atoi(persistentAttribs[COMMON_ATTRIBS_COUNT+1].c_str());
|
|
}
|
|
|
|
void TaskXX::randomize() {
|
|
// TODO: Implement
|
|
VarXX = rand()%10 + 1;
|
|
Task::randomize();
|
|
}
|
|
|
|
*/
|