Files
wagic/projects/mtg/src/Tasks.cpp
wrenczes@gmail.com 2063e27681 Added a debug helper override class for ifstream - this normally washes out to std::ifstream. If #define TRACK_FILE_USAGE_STATS is enabled, it derives from ifstream, but additionally tracks each time we create an instance for a given file name & counts each hit in a map, and dump the statistics on shutdown. This is to help track how often we open up certain files, since i/o is costly on the psp.
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
-------------------
2011-01-11 10:11:15 +00:00

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