diff --git a/res/token-images.txt b/res/token-images.txt index 00fedbbf51f..54334d2cd1f 100644 --- a/res/token-images.txt +++ b/res/token-images.txt @@ -1,180 +1,174 @@ -[T]b_0_0_germ.jpg http://www.cardforge.org/fpics/tokens/b_0_0_germ.jpg -[T]b_0_1_insect.jpg http://www.cardforge.org/fpics/tokens/b_0_1_insect.jpg -[T]b_0_1_serf.jpg http://www.cardforge.org/fpics/tokens/b_0_1_serf.jpg -[T]b_0_1_thrull.jpg http://www.cardforge.org/fpics/tokens/b_0_1_thrull.jpg -[T]b_1_1_bat.jpg http://www.cardforge.org/fpics/tokens/b_1_1_bat.jpg -[T]b_1_1_faerie_rogue.jpg http://www.cardforge.org/fpics/tokens/b_1_1_faerie_rogue.jpg -[T]b_1_1_festering_goblin.jpg http://www.cardforge.org/fpics/tokens/b_1_1_festering_goblin.jpg -[T]b_1_1_goblin_rogue.jpg http://www.cardforge.org/fpics/tokens/b_1_1_goblin_rogue.jpg -[T]b_1_1_minion.jpg http://www.cardforge.org/fpics/tokens/b_1_1_minion.jpg -[T]b_1_1_rat.jpg http://www.cardforge.org/fpics/tokens/b_1_1_rat.jpg -[T]b_1_1_skeleton.jpg http://www.cardforge.org/fpics/tokens/b_1_1_skeleton.jpg -[T]b_1_1_thrull.jpg http://www.cardforge.org/fpics/tokens/b_1_1_thrull.jpg -[T]b_1_2_bat.jpg http://www.cardforge.org/fpics/tokens/b_1_2_bat.jpg -[T]b_20_20_marit_lage.jpg http://www.cardforge.org/fpics/tokens/b_20_20_marit_lage.jpg -[T]b_2_1_cat.jpg http://www.cardforge.org/fpics/tokens/b_2_1_cat.jpg -[T]b_2_2_zombie.jpg http://www.cardforge.org/fpics/tokens/b_2_2_zombie.jpg -[T]b_2_4_spider.jpg http://www.cardforge.org/fpics/tokens/b_2_4_spider.jpg -[T]b_3_3_angel.jpg http://www.cardforge.org/fpics/tokens/b_3_3_angel.jpg -[T]b_3_3_kavu.jpg http://www.cardforge.org/fpics/tokens/b_3_3_kavu.jpg -[T]b_4_4_horror.jpg http://www.cardforge.org/fpics/tokens/b_4_4_horror.jpg -[T]b_5_5_demon.jpg http://www.cardforge.org/fpics/tokens/b_5_5_demon.jpg -[T]b_5_5_urami.jpg http://www.cardforge.org/fpics/tokens/b_5_5_urami.jpg -[T]b_5_5_zombie_giant.jpg http://www.cardforge.org/fpics/tokens/b_5_5_zombie_giant.jpg -[T]b_6_6_wurm.jpg http://www.cardforge.org/fpics/tokens/b_6_6_wurm.jpg -[T]b_dx_dy_spirit.jpg http://www.cardforge.org/fpics/tokens/b_dx_dy_spirit.jpg -[T]b_x_x_demon.jpg http://www.cardforge.org/fpics/tokens/b_x_x_demon.jpg -[T]b_x_x_minion.jpg http://www.cardforge.org/fpics/tokens/b_x_x_minion.jpg -[T]bg_1_1_worm.jpg http://www.cardforge.org/fpics/tokens/bg_1_1_worm.jpg -[T]br_1_1_minor_demon.jpg http://www.cardforge.org/fpics/tokens/br_1_1_minor_demon.jpg -[T]br_3_1_graveborn.jpg http://www.cardforge.org/fpics/tokens/br_3_1_graveborn.jpg -[T]br_5_5_elemental.jpg http://www.cardforge.org/fpics/tokens/br_5_5_elemental.jpg -[T]c_0_1_eldrazi_spawn.jpg http://www.cardforge.org/fpics/tokens/c_0_1_eldrazi_spawn.jpg -[T]c_0_1_pest.jpg http://www.cardforge.org/fpics/tokens/c_0_1_pest.jpg -[T]c_0_1_prism.jpg http://www.cardforge.org/fpics/tokens/c_0_1_prism.jpg -[T]c_1_1_hornet.jpg http://www.cardforge.org/fpics/tokens/c_1_1_hornet.jpg -[T]c_1_1_metallic_sliver.jpg http://www.cardforge.org/fpics/tokens/c_1_1_metallic_sliver.jpg -[T]c_1_1_myr.jpg http://www.cardforge.org/fpics/tokens/c_1_1_myr.jpg -[T]c_1_1_pentavite.jpg http://www.cardforge.org/fpics/tokens/c_1_1_pentavite.jpg -[T]c_1_1_sand.jpg http://www.cardforge.org/fpics/tokens/c_1_1_sand.jpg -[T]c_1_1_shapeshifter.jpg http://www.cardforge.org/fpics/tokens/c_1_1_shapeshifter.jpg -[T]c_1_1_sliver.jpg http://www.cardforge.org/fpics/tokens/c_1_1_sliver.jpg -[T]c_1_1_snake.jpg http://www.cardforge.org/fpics/tokens/c_1_1_snake.jpg -[T]c_1_1_spirit.jpg http://www.cardforge.org/fpics/tokens/c_1_1_spirit.jpg -[T]c_1_1_thopter.jpg http://www.cardforge.org/fpics/tokens/c_1_1_thopter.jpg -[T]c_1_1_triskelavite.jpg http://www.cardforge.org/fpics/tokens/c_1_1_triskelavite.jpg -[T]c_1_1_wasp.jpg http://www.cardforge.org/fpics/tokens/c_1_1_wasp.jpg -[T]c_2_2_assembly_worker.jpg http://www.cardforge.org/fpics/tokens/c_2_2_assembly_worker.jpg -[T]c_2_2_pincher.jpg http://www.cardforge.org/fpics/tokens/c_2_2_pincher.jpg -[T]c_2_2_spawn.jpg http://www.cardforge.org/fpics/tokens/c_2_2_spawn.jpg -[T]c_2_2_wirefly.jpg http://www.cardforge.org/fpics/tokens/c_2_2_wirefly.jpg -[T]c_3_3_golem.jpg http://www.cardforge.org/fpics/tokens/c_3_3_golem.jpg -[T]c_3_3_wurm_deathtouch.jpg http://www.cardforge.org/fpics/tokens/c_3_3_wurm_deathtouch.jpg -[T]c_3_3_wurm_lifelink.jpg http://www.cardforge.org/fpics/tokens/c_3_3_wurm_lifelink.jpg -[T]c_3_4_gargoyle.jpg http://www.cardforge.org/fpics/tokens/c_3_4_gargoyle.jpg -[T]c_5_5_djinn.jpg http://www.cardforge.org/fpics/tokens/c_5_5_djinn.jpg -[T]c_5_5_tuktuk_the_returned.jpg http://www.cardforge.org/fpics/tokens/c_5_5_tuktuk_the_returned.jpg -[T]c_9_9_golem.jpg http://www.cardforge.org/fpics/tokens/c_9_9_golem.jpg -[T]c_x_x_horror.jpg http://www.cardforge.org/fpics/tokens/c_x_x_horror.jpg -[T]c_x_x_riptide_replicator.jpg http://www.cardforge.org/fpics/tokens/c_x_x_riptide_replicator.jpg -[T]c_x_y_twin.jpg http://www.cardforge.org/fpics/tokens/c_x_y_twin.jpg -[T]g_1_1_butterfly.jpg http://www.cardforge.org/fpics/tokens/g_1_1_butterfly.jpg -[T]g_0_1_plant.jpg http://www.cardforge.org/fpics/tokens/g_0_1_plant.jpg -[T]g_0_1_plant_wall.jpg http://www.cardforge.org/fpics/tokens/g_0_1_plant_wall.jpg -[T]g_0_1_wood.jpg http://www.cardforge.org/fpics/tokens/g_0_1_wood.jpg -[T]g_0_2_plant_wall.jpg http://www.cardforge.org/fpics/tokens/g_0_2_plant_wall.jpg -[T]g_0_3_plant_wall.jpg http://www.cardforge.org/fpics/tokens/g_0_3_plant_wall.jpg -[T]g_1_1_cat.jpg http://www.cardforge.org/fpics/tokens/g_1_1_cat.jpg -[T]g_1_1_elf_warrior.jpg http://www.cardforge.org/fpics/tokens/g_1_1_elf_warrior.jpg -[T]g_1_1_hippo.jpg http://www.cardforge.org/fpics/tokens/g_1_1_hippo.jpg -[T]g_1_1_hound.jpg http://www.cardforge.org/fpics/tokens/g_1_1_hound.jpg -[T]g_1_1_insect.jpg http://www.cardforge.org/fpics/tokens/g_1_1_insect.jpg -[T]g_1_1_insect_deathtouch.jpg http://www.cardforge.org/fpics/tokens/g_1_1_insect_deathtouch.jpg -[T]g_1_1_insect_infect.jpg http://www.cardforge.org/fpics/tokens/g_1_1_insect_infect.jpg -[T]g_1_1_llanowar_elves.jpg http://www.cardforge.org/fpics/tokens/g_1_1_llanowar_elves.jpg -[T]g_1_1_ooze.jpg http://www.cardforge.org/fpics/tokens/g_1_1_ooze.jpg -[T]g_1_1_saproling.jpg http://www.cardforge.org/fpics/tokens/g_1_1_saproling.jpg -[T]g_1_1_snake.jpg http://www.cardforge.org/fpics/tokens/g_1_1_snake.jpg -[T]g_1_1_spike.jpg http://www.cardforge.org/fpics/tokens/g_1_1_spike.jpg -[T]g_1_1_splinter.jpg http://www.cardforge.org/fpics/tokens/g_1_1_splinter.jpg -[T]g_1_1_squirrel.jpg http://www.cardforge.org/fpics/tokens/g_1_1_squirrel.jpg -[T]g_1_1_wolf.jpg http://www.cardforge.org/fpics/tokens/g_1_1_wolf.jpg -[T]g_1_2_spider.jpg http://www.cardforge.org/fpics/tokens/g_1_2_spider.jpg -[T]g_1_3_plant_wall.jpg http://www.cardforge.org/fpics/tokens/g_1_3_plant_wall.jpg -[T]g_1_3_plant_wall_deathtouch.jpg http://www.cardforge.org/fpics/tokens/g_1_3_plant_wall_deathtouch.jpg -[T]g_1_4_plant_wall.jpg http://www.cardforge.org/fpics/tokens/g_1_4_plant_wall.jpg -[T]g_2_2_ape.jpg http://www.cardforge.org/fpics/tokens/g_2_2_ape.jpg -[T]g_2_2_bear.jpg http://www.cardforge.org/fpics/tokens/g_2_2_bear.jpg -[T]g_2_2_cat_warrior.jpg http://www.cardforge.org/fpics/tokens/g_2_2_cat_warrior.jpg -[T]g_2_2_lizard.jpg http://www.cardforge.org/fpics/tokens/g_2_2_lizard.jpg -[T]g_2_2_ooze.jpg http://www.cardforge.org/fpics/tokens/g_2_2_ooze.jpg -[T]g_2_2_wolf.jpg http://www.cardforge.org/fpics/tokens/g_2_2_wolf.jpg -[T]g_2_5_treefolk_shaman.jpg http://www.cardforge.org/fpics/tokens/g_2_5_treefolk_shaman.jpg -[T]g_3_3_ape.jpg http://www.cardforge.org/fpics/tokens/g_3_3_ape.jpg -[T]g_3_3_beast.jpg http://www.cardforge.org/fpics/tokens/g_3_3_beast.jpg -[T]g_3_3_centaur.jpg http://www.cardforge.org/fpics/tokens/g_3_3_centaur.jpg -[T]g_3_3_centaur_pro_black.jpg http://www.cardforge.org/fpics/tokens/g_3_3_centaur_pro_black.jpg -[T]g_3_3_elephant.jpg http://www.cardforge.org/fpics/tokens/g_3_3_elephant.jpg -[T]g_4_4_beast.jpg http://www.cardforge.org/fpics/tokens/g_4_4_beast.jpg -[T]g_4_4_elemental.jpg http://www.cardforge.org/fpics/tokens/g_4_4_elemental.jpg -[T]g_5_5_beast.jpg http://www.cardforge.org/fpics/tokens/g_5_5_beast.jpg -[T]g_6_1_insect.jpg http://www.cardforge.org/fpics/tokens/g_6_1_insect.jpg -[T]g_6_6_wurm.jpg http://www.cardforge.org/fpics/tokens/g_6_6_wurm.jpg -[T]g_7_7_elemental.jpg http://www.cardforge.org/fpics/tokens/g_7_7_elemental.jpg -[T]g_x_x_elephant.jpg http://www.cardforge.org/fpics/tokens/g_x_x_elephant.jpg -[T]g_x_x_ooze.jpg http://www.cardforge.org/fpics/tokens/g_x_x_ooze.jpg -[T]g_x_x_wurm.jpg http://www.cardforge.org/fpics/tokens/g_x_x_wurm.jpg -[T]gr_1_1_dragon.jpg http://www.cardforge.org/fpics/tokens/gr_1_1_dragon.jpg -[T]grw_1_1_sand_warrior.jpg http://www.cardforge.org/fpics/tokens/grw_1_1_sand_warrior.jpg -[T]gu_2_2_drake.jpg http://www.cardforge.org/fpics/tokens/gu_2_2_drake.jpg -[T]gu_1_1_snake.jpg http://www.cardforge.org/fpics/tokens/gu_1_1_snake.jpg -[T]gw_1_1_elf_warrior.jpg http://www.cardforge.org/fpics/tokens/gw_1_1_elf_warrior.jpg -[T]gw_2_2_voja.jpg http://www.cardforge.org/fpics/tokens/gw_2_2_voja.jpg -[T]r_0_1_kobolds_of_kher_keep.jpg http://www.cardforge.org/fpics/tokens/r_0_1_kobolds_of_kher_keep.jpg -[T]r_1_1_elemental_cat.jpg http://www.cardforge.org/fpics/tokens/r_1_1_elemental_cat.jpg -[T]r_1_1_elemental.jpg http://www.cardforge.org/fpics/tokens/r_1_1_elemental.jpg -[T]r_1_1_goblin.jpg http://www.cardforge.org/fpics/tokens/r_1_1_goblin.jpg -[T]r_1_1_goblin_scout.jpg http://www.cardforge.org/fpics/tokens/r_1_1_goblin_scout.jpg -[T]r_2_1_goblin.jpg http://www.cardforge.org/fpics/tokens/r_2_1_goblin.jpg -[T]r_3_1_elemental.jpg http://www.cardforge.org/fpics/tokens/r_3_1_elemental.jpg -[T]r_3_1_elemental_shaman.jpg http://www.cardforge.org/fpics/tokens/r_3_1_elemental_shaman.jpg -[T]r_3_1_spark_elemental.jpg http://www.cardforge.org/fpics/tokens/r_3_1_spark_elemental.jpg -[T]r_3_3_elemental.jpg http://www.cardforge.org/fpics/tokens/r_3_3_elemental.jpg -[T]r_3_3_ogre.jpg http://www.cardforge.org/fpics/tokens/r_3_3_ogre.jpg -[T]r_4_4_bird.jpg http://www.cardforge.org/fpics/tokens/r_4_4_bird.jpg -[T]r_4_4_dragon.jpg http://www.cardforge.org/fpics/tokens/r_4_4_dragon.jpg -[T]r_4_4_giant.jpg http://www.cardforge.org/fpics/tokens/r_4_4_giant.jpg -[T]r_4_4_hellion.jpg http://www.cardforge.org/fpics/tokens/r_4_4_hellion.jpg -[T]r_5_5_dragon.jpg http://www.cardforge.org/fpics/tokens/r_5_5_dragon.jpg -[T]r_7_1_elemental.jpg http://www.cardforge.org/fpics/tokens/r_7_1_elemental.jpg -[T]r_x_x_elemental.jpg http://www.cardforge.org/fpics/tokens/r_x_x_elemental.jpg -[T]rg_3_4_stangg_twin.jpg http://www.cardforge.org/fpics/tokens/rg_3_4_stangg_twin.jpg -[T]rw_1_1_goblin_soldier.jpg http://www.cardforge.org/fpics/tokens/rw_1_1_goblin_soldier.jpg -[T]u_0_1_homunculus.jpg http://www.cardforge.org/fpics/tokens/u_0_1_homunculus.jpg -[T]u_0_1_plant_wall.jpg http://www.cardforge.org/fpics/tokens/u_0_1_plant_wall.jpg -[T]u_1_1_bird.jpg http://www.cardforge.org/fpics/tokens/u_1_1_bird.jpg -[T]u_1_1_camarid.jpg http://www.cardforge.org/fpics/tokens/u_1_1_camarid.jpg -[T]u_1_1_cloud_sprite.jpg http://www.cardforge.org/fpics/tokens/u_1_1_cloud_sprite.jpg -[T]u_1_1_faerie.jpg http://www.cardforge.org/fpics/tokens/u_1_1_faerie.jpg -[T]u_1_1_illusion.jpg http://www.cardforge.org/fpics/tokens/u_1_1_illusion.jpg -[T]u_1_1_merfolk_wizard.jpg http://www.cardforge.org/fpics/tokens/u_1_1_merfolk_wizard.jpg -[T]u_1_1_thopter.jpg http://www.cardforge.org/fpics/tokens/u_1_1_thopter.jpg -[T]u_2_2_elemental_flying.jpg http://www.cardforge.org/fpics/tokens/u_2_2_elemental_flying.jpg -[T]u_2_2_homunculus.jpg http://www.cardforge.org/fpics/tokens/u_2_2_homunculus.jpg -[T]u_2_2_illusion.jpg http://www.cardforge.org/fpics/tokens/u_2_2_illusion.jpg -[T]u_3_3_weird.jpg http://www.cardforge.org/fpics/tokens/u_3_3_weird.jpg -[T]u_5_5_wall.jpg http://www.cardforge.org/fpics/tokens/u_5_5_wall.jpg -[T]ub_1_1_faerie_rogue.jpg http://www.cardforge.org/fpics/tokens/ub_1_1_faerie_rogue.jpg -[T]ub_1_1_zombie_wizard.jpg http://www.cardforge.org/fpics/tokens/ub_1_1_zombie_wizard.jpg -[T]ur_5_5_elemental.jpg http://www.cardforge.org/fpics/tokens/ur_5_5_elemental.jpg -[T]w_0_1_caribou.jpg http://www.cardforge.org/fpics/tokens/w_0_1_caribou.jpg -[T]w_0_1_deserter.jpg http://www.cardforge.org/fpics/tokens/w_0_1_deserter.jpg -[T]w_0_1_goat.jpg http://www.cardforge.org/fpics/tokens/w_0_1_goat.jpg -[T]w_1_1_bird.jpg http://www.cardforge.org/fpics/tokens/w_1_1_bird.jpg -[T]w_1_1_bird_flying.jpg http://www.cardforge.org/fpics/tokens/w_1_1_bird_flying.jpg -[T]w_1_1_bird_soldier.jpg http://www.cardforge.org/fpics/tokens/w_1_1_bird_soldier.jpg -[T]w_1_1_citizen.jpg http://www.cardforge.org/fpics/tokens/w_1_1_citizen.jpg -[T]w_1_1_goldmeadow_harrier.jpg http://www.cardforge.org/fpics/tokens/w_1_1_goldmeadow_harrier.jpg -[T]w_1_1_kithkin_soldier.jpg http://www.cardforge.org/fpics/tokens/w_1_1_kithkin_soldier.jpg -[T]w_1_1_kor_soldier.jpg http://www.cardforge.org/fpics/tokens/w_1_1_kor_soldier.jpg -[T]w_1_1_pegasus.jpg http://www.cardforge.org/fpics/tokens/w_1_1_pegasus.jpg -[T]w_1_1_soldier.jpg http://www.cardforge.org/fpics/tokens/w_1_1_soldier.jpg -[T]w_1_1_soldier_ally.jpg http://www.cardforge.org/fpics/tokens/w_1_1_soldier_ally.jpg -[T]w_1_1_spirit.jpg http://www.cardforge.org/fpics/tokens/w_1_1_spirit.jpg -[T]w_2_2_cat.jpg http://www.cardforge.org/fpics/tokens/w_2_2_cat.jpg -[T]w_2_2_griffin.jpg http://www.cardforge.org/fpics/tokens/w_2_2_griffin.jpg -[T]w_2_2_knight.jpg http://www.cardforge.org/fpics/tokens/w_2_2_knight.jpg -[T]w_2_2_knight_first_strike.jpg http://www.cardforge.org/fpics/tokens/w_2_2_knight_first_strike.jpg -[T]w_3_3_bird.jpg http://www.cardforge.org/fpics/tokens/w_3_3_bird.jpg -[T]w_3_3_spirit.jpg http://www.cardforge.org/fpics/tokens/w_3_3_spirit.jpg -[T]w_4_4_angel.jpg http://www.cardforge.org/fpics/tokens/w_4_4_angel.jpg -[T]w_4_4_elemental.jpg http://www.cardforge.org/fpics/tokens/w_4_4_elemental.jpg -[T]w_5_5_giant_warrior.jpg http://www.cardforge.org/fpics/tokens/w_5_5_giant_warrior.jpg -[T]w_n_n_avatar.jpg http://www.cardforge.org/fpics/tokens/w_n_n_avatar.jpg -[T]wb_1_1_spirit.jpg http://www.cardforge.org/fpics/tokens/wb_1_1_spirit.jpg -[T]wrg_8_8_beast.jpg http://www.cardforge.org/fpics/tokens/wrg_8_8_beast.jpg -[T]wr_1_1_goblin_soldier.jpg http://www.cardforge.org/fpics/tokens/wr_1_1_goblin_soldier.jpg -[T]wu_1_1_bird.jpg http://www.cardforge.org/fpics/tokens/wu_1_1_bird.jpg +b_0_0_germ.jpg http://www.cardforge.org/fpics/tokens/b_0_0_germ.jpg +b_0_1_insect.jpg http://www.cardforge.org/fpics/tokens/b_0_1_insect.jpg +b_0_1_serf.jpg http://www.cardforge.org/fpics/tokens/b_0_1_serf.jpg +b_0_1_thrull.jpg http://www.cardforge.org/fpics/tokens/b_0_1_thrull.jpg +b_1_1_bat.jpg http://www.cardforge.org/fpics/tokens/b_1_1_bat.jpg +b_1_1_faerie_rogue.jpg http://www.cardforge.org/fpics/tokens/b_1_1_faerie_rogue.jpg +b_1_1_festering_goblin.jpg http://www.cardforge.org/fpics/tokens/b_1_1_festering_goblin.jpg +b_1_1_goblin_rogue.jpg http://www.cardforge.org/fpics/tokens/b_1_1_goblin_rogue.jpg +b_1_1_minion.jpg http://www.cardforge.org/fpics/tokens/b_1_1_minion.jpg +b_1_1_rat.jpg http://www.cardforge.org/fpics/tokens/b_1_1_rat.jpg +b_1_1_skeleton.jpg http://www.cardforge.org/fpics/tokens/b_1_1_skeleton.jpg +b_1_1_thrull.jpg http://www.cardforge.org/fpics/tokens/b_1_1_thrull.jpg +b_1_2_bat.jpg http://www.cardforge.org/fpics/tokens/b_1_2_bat.jpg +b_20_20_marit_lage.jpg http://www.cardforge.org/fpics/tokens/b_20_20_marit_lage.jpg +b_2_1_cat.jpg http://www.cardforge.org/fpics/tokens/b_2_1_cat.jpg +b_2_2_zombie.jpg http://www.cardforge.org/fpics/tokens/b_2_2_zombie.jpg +b_2_4_spider.jpg http://www.cardforge.org/fpics/tokens/b_2_4_spider.jpg +b_3_3_angel.jpg http://www.cardforge.org/fpics/tokens/b_3_3_angel.jpg +b_3_3_kavu.jpg http://www.cardforge.org/fpics/tokens/b_3_3_kavu.jpg +b_4_4_horror.jpg http://www.cardforge.org/fpics/tokens/b_4_4_horror.jpg +b_5_5_demon.jpg http://www.cardforge.org/fpics/tokens/b_5_5_demon.jpg +b_5_5_urami.jpg http://www.cardforge.org/fpics/tokens/b_5_5_urami.jpg +b_5_5_zombie_giant.jpg http://www.cardforge.org/fpics/tokens/b_5_5_zombie_giant.jpg +b_6_6_wurm.jpg http://www.cardforge.org/fpics/tokens/b_6_6_wurm.jpg +b_dx_dy_spirit.jpg http://www.cardforge.org/fpics/tokens/b_dx_dy_spirit.jpg +b_x_x_demon.jpg http://www.cardforge.org/fpics/tokens/b_x_x_demon.jpg +b_x_x_minion.jpg http://www.cardforge.org/fpics/tokens/b_x_x_minion.jpg +bg_1_1_worm.jpg http://www.cardforge.org/fpics/tokens/bg_1_1_worm.jpg +br_1_1_minor_demon.jpg http://www.cardforge.org/fpics/tokens/br_1_1_minor_demon.jpg +br_3_1_graveborn.jpg http://www.cardforge.org/fpics/tokens/br_3_1_graveborn.jpg +br_5_5_elemental.jpg http://www.cardforge.org/fpics/tokens/br_5_5_elemental.jpg +c_0_1_eldrazi_spawn.jpg http://www.cardforge.org/fpics/tokens/c_0_1_eldrazi_spawn.jpg +c_0_1_pest.jpg http://www.cardforge.org/fpics/tokens/c_0_1_pest.jpg +c_0_1_prism.jpg http://www.cardforge.org/fpics/tokens/c_0_1_prism.jpg +c_1_1_hornet.jpg http://www.cardforge.org/fpics/tokens/c_1_1_hornet.jpg +c_1_1_metallic_sliver.jpg http://www.cardforge.org/fpics/tokens/c_1_1_metallic_sliver.jpg +c_1_1_myr.jpg http://www.cardforge.org/fpics/tokens/c_1_1_myr.jpg +c_1_1_pentavite.jpg http://www.cardforge.org/fpics/tokens/c_1_1_pentavite.jpg +c_1_1_sand.jpg http://www.cardforge.org/fpics/tokens/c_1_1_sand.jpg +c_1_1_shapeshifter.jpg http://www.cardforge.org/fpics/tokens/c_1_1_shapeshifter.jpg +c_1_1_sliver.jpg http://www.cardforge.org/fpics/tokens/c_1_1_sliver.jpg +c_1_1_snake.jpg http://www.cardforge.org/fpics/tokens/c_1_1_snake.jpg +c_1_1_spirit.jpg http://www.cardforge.org/fpics/tokens/c_1_1_spirit.jpg +c_1_1_thopter.jpg http://www.cardforge.org/fpics/tokens/c_1_1_thopter.jpg +c_1_1_triskelavite.jpg http://www.cardforge.org/fpics/tokens/c_1_1_triskelavite.jpg +c_1_1_wasp.jpg http://www.cardforge.org/fpics/tokens/c_1_1_wasp.jpg +c_2_2_assembly_worker.jpg http://www.cardforge.org/fpics/tokens/c_2_2_assembly_worker.jpg +c_2_2_pincher.jpg http://www.cardforge.org/fpics/tokens/c_2_2_pincher.jpg +c_2_2_spawn.jpg http://www.cardforge.org/fpics/tokens/c_2_2_spawn.jpg +c_2_2_wirefly.jpg http://www.cardforge.org/fpics/tokens/c_2_2_wirefly.jpg +c_3_3_golem.jpg http://www.cardforge.org/fpics/tokens/c_3_3_golem.jpg +c_3_3_wurm_deathtouch.jpg http://www.cardforge.org/fpics/tokens/c_3_3_wurm_deathtouch.jpg +c_3_3_wurm_lifelink.jpg http://www.cardforge.org/fpics/tokens/c_3_3_wurm_lifelink.jpg +c_3_4_gargoyle.jpg http://www.cardforge.org/fpics/tokens/c_3_4_gargoyle.jpg +c_5_5_djinn.jpg http://www.cardforge.org/fpics/tokens/c_5_5_djinn.jpg +c_5_5_tuktuk_the_returned.jpg http://www.cardforge.org/fpics/tokens/c_5_5_tuktuk_the_returned.jpg +c_9_9_golem.jpg http://www.cardforge.org/fpics/tokens/c_9_9_golem.jpg +c_x_x_horror.jpg http://www.cardforge.org/fpics/tokens/c_x_x_horror.jpg +c_x_x_riptide_replicator.jpg http://www.cardforge.org/fpics/tokens/c_x_x_riptide_replicator.jpg +c_x_y_twin.jpg http://www.cardforge.org/fpics/tokens/c_x_y_twin.jpg +g_1_1_butterfly.jpg http://www.cardforge.org/fpics/tokens/g_1_1_butterfly.jpg +g_0_1_plant.jpg http://www.cardforge.org/fpics/tokens/g_0_1_plant.jpg +g_0_1_wood.jpg http://www.cardforge.org/fpics/tokens/g_0_1_wood.jpg +g_1_1_cat.jpg http://www.cardforge.org/fpics/tokens/g_1_1_cat.jpg +g_1_1_elf_warrior.jpg http://www.cardforge.org/fpics/tokens/g_1_1_elf_warrior.jpg +g_1_1_hippo.jpg http://www.cardforge.org/fpics/tokens/g_1_1_hippo.jpg +g_1_1_hound.jpg http://www.cardforge.org/fpics/tokens/g_1_1_hound.jpg +g_1_1_insect.jpg http://www.cardforge.org/fpics/tokens/g_1_1_insect.jpg +g_1_1_insect_deathtouch.jpg http://www.cardforge.org/fpics/tokens/g_1_1_insect_deathtouch.jpg +g_1_1_insect_infect.jpg http://www.cardforge.org/fpics/tokens/g_1_1_insect_infect.jpg +g_1_1_llanowar_elves.jpg http://www.cardforge.org/fpics/tokens/g_1_1_llanowar_elves.jpg +g_1_1_ooze.jpg http://www.cardforge.org/fpics/tokens/g_1_1_ooze.jpg +g_1_1_saproling.jpg http://www.cardforge.org/fpics/tokens/g_1_1_saproling.jpg +g_1_1_snake.jpg http://www.cardforge.org/fpics/tokens/g_1_1_snake.jpg +g_1_1_spike.jpg http://www.cardforge.org/fpics/tokens/g_1_1_spike.jpg +g_1_1_splinter.jpg http://www.cardforge.org/fpics/tokens/g_1_1_splinter.jpg +g_1_1_squirrel.jpg http://www.cardforge.org/fpics/tokens/g_1_1_squirrel.jpg +g_1_1_wolf.jpg http://www.cardforge.org/fpics/tokens/g_1_1_wolf.jpg +g_1_2_spider.jpg http://www.cardforge.org/fpics/tokens/g_1_2_spider.jpg +g_2_2_ape.jpg http://www.cardforge.org/fpics/tokens/g_2_2_ape.jpg +g_2_2_bear.jpg http://www.cardforge.org/fpics/tokens/g_2_2_bear.jpg +g_2_2_cat_warrior.jpg http://www.cardforge.org/fpics/tokens/g_2_2_cat_warrior.jpg +g_2_2_lizard.jpg http://www.cardforge.org/fpics/tokens/g_2_2_lizard.jpg +g_2_2_ooze.jpg http://www.cardforge.org/fpics/tokens/g_2_2_ooze.jpg +g_2_2_wolf.jpg http://www.cardforge.org/fpics/tokens/g_2_2_wolf.jpg +g_2_5_treefolk_shaman.jpg http://www.cardforge.org/fpics/tokens/g_2_5_treefolk_shaman.jpg +g_3_3_ape.jpg http://www.cardforge.org/fpics/tokens/g_3_3_ape.jpg +g_3_3_beast.jpg http://www.cardforge.org/fpics/tokens/g_3_3_beast.jpg +g_3_3_centaur.jpg http://www.cardforge.org/fpics/tokens/g_3_3_centaur.jpg +g_3_3_centaur_pro_black.jpg http://www.cardforge.org/fpics/tokens/g_3_3_centaur_pro_black.jpg +g_3_3_elephant.jpg http://www.cardforge.org/fpics/tokens/g_3_3_elephant.jpg +g_4_4_beast.jpg http://www.cardforge.org/fpics/tokens/g_4_4_beast.jpg +g_4_4_elemental.jpg http://www.cardforge.org/fpics/tokens/g_4_4_elemental.jpg +g_5_5_beast.jpg http://www.cardforge.org/fpics/tokens/g_5_5_beast.jpg +g_6_1_insect.jpg http://www.cardforge.org/fpics/tokens/g_6_1_insect.jpg +g_6_6_wurm.jpg http://www.cardforge.org/fpics/tokens/g_6_6_wurm.jpg +g_7_7_elemental.jpg http://www.cardforge.org/fpics/tokens/g_7_7_elemental.jpg +g_x_x_elephant.jpg http://www.cardforge.org/fpics/tokens/g_x_x_elephant.jpg +g_x_x_ooze.jpg http://www.cardforge.org/fpics/tokens/g_x_x_ooze.jpg +g_x_x_wurm.jpg http://www.cardforge.org/fpics/tokens/g_x_x_wurm.jpg +gr_1_1_dragon.jpg http://www.cardforge.org/fpics/tokens/gr_1_1_dragon.jpg +grw_1_1_sand_warrior.jpg http://www.cardforge.org/fpics/tokens/grw_1_1_sand_warrior.jpg +gu_2_2_drake.jpg http://www.cardforge.org/fpics/tokens/gu_2_2_drake.jpg +gu_1_1_snake.jpg http://www.cardforge.org/fpics/tokens/gu_1_1_snake.jpg +gw_1_1_elf_warrior.jpg http://www.cardforge.org/fpics/tokens/gw_1_1_elf_warrior.jpg +gw_2_2_voja.jpg http://www.cardforge.org/fpics/tokens/gw_2_2_voja.jpg +r_0_1_kobolds_of_kher_keep.jpg http://www.cardforge.org/fpics/tokens/r_0_1_kobolds_of_kher_keep.jpg +r_1_1_elemental_cat.jpg http://www.cardforge.org/fpics/tokens/r_1_1_elemental_cat.jpg +r_1_1_elemental.jpg http://www.cardforge.org/fpics/tokens/r_1_1_elemental.jpg +r_1_1_goblin.jpg http://www.cardforge.org/fpics/tokens/r_1_1_goblin.jpg +r_1_1_goblin_scout.jpg http://www.cardforge.org/fpics/tokens/r_1_1_goblin_scout.jpg +r_2_1_goblin.jpg http://www.cardforge.org/fpics/tokens/r_2_1_goblin.jpg +r_3_1_elemental.jpg http://www.cardforge.org/fpics/tokens/r_3_1_elemental.jpg +r_3_1_elemental_shaman.jpg http://www.cardforge.org/fpics/tokens/r_3_1_elemental_shaman.jpg +r_3_1_spark_elemental.jpg http://www.cardforge.org/fpics/tokens/r_3_1_spark_elemental.jpg +r_3_3_elemental.jpg http://www.cardforge.org/fpics/tokens/r_3_3_elemental.jpg +r_3_3_ogre.jpg http://www.cardforge.org/fpics/tokens/r_3_3_ogre.jpg +r_4_4_bird.jpg http://www.cardforge.org/fpics/tokens/r_4_4_bird.jpg +r_4_4_dragon.jpg http://www.cardforge.org/fpics/tokens/r_4_4_dragon.jpg +r_4_4_giant.jpg http://www.cardforge.org/fpics/tokens/r_4_4_giant.jpg +r_4_4_hellion.jpg http://www.cardforge.org/fpics/tokens/r_4_4_hellion.jpg +r_5_5_dragon.jpg http://www.cardforge.org/fpics/tokens/r_5_5_dragon.jpg +r_7_1_elemental.jpg http://www.cardforge.org/fpics/tokens/r_7_1_elemental.jpg +r_x_x_elemental.jpg http://www.cardforge.org/fpics/tokens/r_x_x_elemental.jpg +rg_3_4_stangg_twin.jpg http://www.cardforge.org/fpics/tokens/rg_3_4_stangg_twin.jpg +rw_1_1_goblin_soldier.jpg http://www.cardforge.org/fpics/tokens/rw_1_1_goblin_soldier.jpg +u_0_1_homunculus.jpg http://www.cardforge.org/fpics/tokens/u_0_1_homunculus.jpg +u_0_1_plant_wall.jpg http://www.cardforge.org/fpics/tokens/u_0_1_plant_wall.jpg +u_1_1_bird.jpg http://www.cardforge.org/fpics/tokens/u_1_1_bird.jpg +u_1_1_camarid.jpg http://www.cardforge.org/fpics/tokens/u_1_1_camarid.jpg +u_1_1_cloud_sprite.jpg http://www.cardforge.org/fpics/tokens/u_1_1_cloud_sprite.jpg +u_1_1_faerie.jpg http://www.cardforge.org/fpics/tokens/u_1_1_faerie.jpg +u_1_1_illusion.jpg http://www.cardforge.org/fpics/tokens/u_1_1_illusion.jpg +u_1_1_merfolk_wizard.jpg http://www.cardforge.org/fpics/tokens/u_1_1_merfolk_wizard.jpg +u_1_1_thopter.jpg http://www.cardforge.org/fpics/tokens/u_1_1_thopter.jpg +u_2_2_elemental_flying.jpg http://www.cardforge.org/fpics/tokens/u_2_2_elemental_flying.jpg +u_2_2_homunculus.jpg http://www.cardforge.org/fpics/tokens/u_2_2_homunculus.jpg +u_2_2_illusion.jpg http://www.cardforge.org/fpics/tokens/u_2_2_illusion.jpg +u_3_3_weird.jpg http://www.cardforge.org/fpics/tokens/u_3_3_weird.jpg +u_5_5_wall.jpg http://www.cardforge.org/fpics/tokens/u_5_5_wall.jpg +ub_1_1_faerie_rogue.jpg http://www.cardforge.org/fpics/tokens/ub_1_1_faerie_rogue.jpg +ub_1_1_zombie_wizard.jpg http://www.cardforge.org/fpics/tokens/ub_1_1_zombie_wizard.jpg +ur_5_5_elemental.jpg http://www.cardforge.org/fpics/tokens/ur_5_5_elemental.jpg +w_0_1_caribou.jpg http://www.cardforge.org/fpics/tokens/w_0_1_caribou.jpg +w_0_1_deserter.jpg http://www.cardforge.org/fpics/tokens/w_0_1_deserter.jpg +w_0_1_goat.jpg http://www.cardforge.org/fpics/tokens/w_0_1_goat.jpg +w_1_1_bird.jpg http://www.cardforge.org/fpics/tokens/w_1_1_bird.jpg +w_1_1_bird_flying.jpg http://www.cardforge.org/fpics/tokens/w_1_1_bird_flying.jpg +w_1_1_bird_soldier.jpg http://www.cardforge.org/fpics/tokens/w_1_1_bird_soldier.jpg +w_1_1_citizen.jpg http://www.cardforge.org/fpics/tokens/w_1_1_citizen.jpg +w_1_1_goldmeadow_harrier.jpg http://www.cardforge.org/fpics/tokens/w_1_1_goldmeadow_harrier.jpg +w_1_1_kithkin_soldier.jpg http://www.cardforge.org/fpics/tokens/w_1_1_kithkin_soldier.jpg +w_1_1_kor_soldier.jpg http://www.cardforge.org/fpics/tokens/w_1_1_kor_soldier.jpg +w_1_1_pegasus.jpg http://www.cardforge.org/fpics/tokens/w_1_1_pegasus.jpg +w_1_1_soldier.jpg http://www.cardforge.org/fpics/tokens/w_1_1_soldier.jpg +w_1_1_soldier_ally.jpg http://www.cardforge.org/fpics/tokens/w_1_1_soldier_ally.jpg +w_1_1_spirit.jpg http://www.cardforge.org/fpics/tokens/w_1_1_spirit.jpg +w_2_2_cat.jpg http://www.cardforge.org/fpics/tokens/w_2_2_cat.jpg +w_2_2_griffin.jpg http://www.cardforge.org/fpics/tokens/w_2_2_griffin.jpg +w_2_2_knight.jpg http://www.cardforge.org/fpics/tokens/w_2_2_knight.jpg +w_2_2_knight_first_strike.jpg http://www.cardforge.org/fpics/tokens/w_2_2_knight_first_strike.jpg +w_3_3_bird.jpg http://www.cardforge.org/fpics/tokens/w_3_3_bird.jpg +w_3_3_spirit.jpg http://www.cardforge.org/fpics/tokens/w_3_3_spirit.jpg +w_4_4_angel.jpg http://www.cardforge.org/fpics/tokens/w_4_4_angel.jpg +w_4_4_elemental.jpg http://www.cardforge.org/fpics/tokens/w_4_4_elemental.jpg +w_5_5_giant_warrior.jpg http://www.cardforge.org/fpics/tokens/w_5_5_giant_warrior.jpg +w_n_n_avatar.jpg http://www.cardforge.org/fpics/tokens/w_n_n_avatar.jpg +wb_1_1_spirit.jpg http://www.cardforge.org/fpics/tokens/wb_1_1_spirit.jpg +wrg_8_8_beast.jpg http://www.cardforge.org/fpics/tokens/wrg_8_8_beast.jpg +wr_1_1_goblin_soldier.jpg http://www.cardforge.org/fpics/tokens/wr_1_1_goblin_soldier.jpg +wu_1_1_bird.jpg http://www.cardforge.org/fpics/tokens/wu_1_1_bird.jpg # //These tokens are not currently used by any cards in Forge, but links provided should they be scripted so the correct name is used: diff --git a/src/main/java/forge/Gui_DownloadPictures_LQ.java b/src/main/java/forge/Gui_DownloadPictures_LQ.java index 60ea94be896..06d1b0c7b74 100644 --- a/src/main/java/forge/Gui_DownloadPictures_LQ.java +++ b/src/main/java/forge/Gui_DownloadPictures_LQ.java @@ -1,28 +1,13 @@ package forge; -import com.esotericsoftware.minlog.Log; -import forge.error.ErrorViewer; + import forge.properties.ForgeProps; -import forge.properties.NewConstants; -import javax.swing.*; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.*; -import java.net.InetSocketAddress; -import java.net.MalformedURLException; -import java.net.Proxy; -import java.net.URL; +import java.io.File; + import java.util.ArrayList; -import java.util.Random; -import java.util.StringTokenizer; -import static java.lang.Integer.parseInt; -import static javax.swing.JOptionPane.DEFAULT_OPTION; -import static javax.swing.JOptionPane.PLAIN_MESSAGE; +import javax.swing.JFrame; /** @@ -31,303 +16,49 @@ import static javax.swing.JOptionPane.PLAIN_MESSAGE; * @author Forge * @version $Id$ */ -public class Gui_DownloadPictures_LQ extends DefaultBoundedRangeModel implements Runnable, NewConstants, NewConstants.LANG.Gui_DownloadPictures { +public class Gui_DownloadPictures_LQ extends GuiDownloader { - /** Constant serialVersionUID=-7890794857949935256L. */ - private static final long serialVersionUID = -7890794857949935256L; - - /** Constant types. */ - public static final Proxy.Type[] types = Proxy.Type.values(); - - //proxy - private int type; - private JTextField addr, port; - - //progress - private mCard[] cards; - private int card; - private boolean cancel; - private JProgressBar bar; - - private JOptionPane dlg; - private JButton close; + private static final long serialVersionUID = -2839597792999139007L; /** - *

Constructor for Gui_DownloadPictures_LQ.

+ *

Constructor for GuiDownloadQuestImages.

* - * @param c an array of {@link forge.Gui_DownloadPictures_LQ.mCard} objects. + * @param frame a array of {@link javax.swing.JFrame} objects. */ - private Gui_DownloadPictures_LQ(final mCard[] c) { - this.cards = c; - addr = new JTextField(ForgeProps.getLocalized(PROXY_ADDRESS)); - port = new JTextField(ForgeProps.getLocalized(PROXY_PORT)); - bar = new JProgressBar(this); - - JPanel p0 = new JPanel(); - p0.setLayout(new BoxLayout(p0, BoxLayout.Y_AXIS)); - - //Proxy Choice - ButtonGroup bg = new ButtonGroup(); - String[] labels = { - ForgeProps.getLocalized(NO_PROXY), ForgeProps.getLocalized(HTTP_PROXY), - ForgeProps.getLocalized(SOCKS_PROXY)}; - for (int i = 0; i < types.length; i++) { - JRadioButton rb = new JRadioButton(labels[i]); - rb.addChangeListener(new ProxyHandler(i)); - bg.add(rb); - p0.add(rb); - if (i == 0) { - rb.setSelected(true); - } - } - - //Proxy config - p0.add(addr); - p0.add(port); - - //Start - final JButton b = new JButton(ForgeProps.getLocalized(BUTTONS.START)); - b.addActionListener(new ActionListener() { - - public void actionPerformed(final ActionEvent e) { - new Thread(Gui_DownloadPictures_LQ.this).start(); - b.setEnabled(false); - } - }); - - p0.add(Box.createVerticalStrut(5)); - - //Progress - p0.add(bar); - bar.setStringPainted(true); - bar.setString(String.format(ForgeProps.getLocalized(card == cards.length ? BAR_CLOSE : BAR_WAIT), this.card, cards.length)); - Dimension d = bar.getPreferredSize(); - d.width = 300; - bar.setPreferredSize(d); - - //JOptionPane - Object[] options = {b, close = new JButton(ForgeProps.getLocalized(BUTTONS.CANCEL))}; - dlg = new JOptionPane(p0, DEFAULT_OPTION, PLAIN_MESSAGE, null, options, options[1]); + public Gui_DownloadPictures_LQ(final JFrame frame) { + super(frame); } - /** {@inheritDoc} */ - @Override - public int getMinimum() { - return 0; - } - - /** {@inheritDoc} */ - @Override - public int getValue() { - return card; - } - - /** {@inheritDoc} */ - @Override - public int getExtent() { - return 0; - } - - /** {@inheritDoc} */ - @Override - public int getMaximum() { - return cards == null ? 0 : cards.length; - } - - /** - *

update.

- * - * @param card a int. - */ - private void update(final int card) { - this.card = card; - final class Worker implements Runnable { - private int card; - - Worker(int card) { - this.card = card; - } - - public void run() { - fireStateChanged(); - bar.setString(String.format(ForgeProps.getLocalized(card == cards.length ? BAR_CLOSE : BAR_WAIT), card, - cards.length)); - System.out.println(card + "/" + cards.length); - } - } - - EventQueue.invokeLater(new Worker(card)); - } - - /** - *

Getter for the field dlg.

- * - * @param frame a {@link javax.swing.JFrame} object. - * @return a {@link javax.swing.JDialog} object. - */ - public JDialog getDlg(final JFrame frame) { - final JDialog dlg = this.dlg.createDialog(frame, ForgeProps.getLocalized(TITLE)); - close.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - dlg.setVisible(false); - } - }); - return dlg; - } - - /** - *

Setter for the field cancel.

- * - * @param cancelIn a boolean. - */ - public void setCancel(final boolean cancelIn) { - this.cancel = cancelIn; - } - - - /** - *

run.

- */ - public void run() { - BufferedInputStream in; - BufferedOutputStream out; - - File base = ForgeProps.getFile(IMAGE_BASE); - File tokenBase = ForgeProps.getFile(IMAGE_TOKEN); - if (!tokenBase.exists()) { - tokenBase.mkdirs(); - } - - Random r = MyRandom.random; - - Proxy p = null; - if (type == 0) { - p = Proxy.NO_PROXY; - } else { - try { - p = new Proxy(types[type], new InetSocketAddress(addr.getText(), parseInt(port.getText()))); - } catch (Exception ex) { - ErrorViewer.showError(ex, ForgeProps.getLocalized(ERRORS.PROXY_CONNECT), addr.getText(), - port.getText()); - return; - } - } - - if (p != null) { - byte[] buf = new byte[1024]; - int len; - System.out.println("basedir: " + base); - for (update(0); card < cards.length && !cancel; update(card + 1)) { - try { - String url = cards[card].url; - String cName; - - if (cards[card].name.substring(0, 3).equals("[T]")) { - base = ForgeProps.getFile(IMAGE_TOKEN); - cName = cards[card].name.substring(3, cards[card].name.length()); - } else { - base = ForgeProps.getFile(IMAGE_BASE); - cName = cards[card].name; - } - - - File f = new File(base, cName); - - try { - in = new BufferedInputStream(new URL(url).openConnection(p).getInputStream()); - out = new BufferedOutputStream(new FileOutputStream(f)); - - while ((len = in.read(buf)) != -1) { - //user cancelled - if (cancel) { - in.close(); - out.flush(); - out.close(); - - //delete what was written so far - f.delete(); - - return; - } //if - cancel - - out.write(buf, 0, len); - } //while - read and write file - - in.close(); - out.flush(); - out.close(); - } catch (MalformedURLException mURLe) { - System.out.println("Error - possibly missing URL for: " + cards[card].name); - } - } catch (FileNotFoundException fnfe) { - System.out.println("Error - the LQ picture for " + cards[card].name + " could not be found on the server."); - } catch (Exception ex) { - System.out.println("General error - downloading LQ picture for " + cards[card].name); - Log.error("LQ Pictures", "Error downloading pictures", ex); - } - - try { - Thread.sleep(r.nextInt(750) + 420); - } catch (InterruptedException e) { - Log.error("LQ Set Pictures", "Sleep Error", e); - } - } //for - } - close.setText(ForgeProps.getLocalized(BUTTONS.CLOSE)); - } //run - - /** - *

startDownload.

- * - * @param frame a {@link javax.swing.JFrame} object. - */ - public static void startDownload(final JFrame frame) { - final mCard[] card = getNeededCards(); - - if (card.length == 0) { - JOptionPane.showMessageDialog(frame, ForgeProps.getLocalized(NO_MORE)); - return; - } - - Gui_DownloadPictures_LQ download = new Gui_DownloadPictures_LQ(card); - JDialog dlg = download.getDlg(frame); - dlg.setVisible(true); - dlg.dispose(); - download.setCancel(true); - } //startDownload() - /** *

getNeededCards.

* - * @return an array of {@link forge.Gui_DownloadPictures_LQ.mCard} objects. + * @return an array of {@link forge.GuiDownloader.DownloadObject} objects. */ - private static mCard[] getNeededCards() { + protected final DownloadObject[] getNeededImages() { //read token names and urls - mCard[] cardTokenLQ = readFile(TOKEN_IMAGES); - - ArrayList cList = new ArrayList(); + DownloadObject[] cardTokenLQ = readFileWithNames(TOKEN_IMAGES, ForgeProps.getFile(IMAGE_TOKEN)); + ArrayList cList = new ArrayList(); + String base = ForgeProps.getFile(IMAGE_BASE).getPath(); for (Card c : AllZone.getCardFactory()) { String url = c.getSVar("Picture"); String[] URLs = url.split("\\\\"); String iName = GuiDisplayUtil.cleanString(c.getImageName()); - cList.add(new mCard(iName + ".jpg", URLs[0])); - //Log.error(iName + ".jpg" + "\t" + URLs[0]); + cList.add(new DownloadObject(iName + ".jpg", URLs[0], base)); if (URLs.length > 1) { for (int j = 1; j < URLs.length; j++) { - cList.add(new mCard(iName + j + ".jpg", URLs[j])); + cList.add(new DownloadObject(iName + j + ".jpg", URLs[j], base)); } } } - ArrayList list = new ArrayList(); + ArrayList list = new ArrayList(); File file; - File base = ForgeProps.getFile(IMAGE_BASE); - mCard[] a = {new mCard("", "")}; - mCard[] cardPlay = cList.toArray(a); + DownloadObject[] a = {new DownloadObject("", "", "")}; + DownloadObject[] cardPlay = cList.toArray(a); //check to see which cards we already have for (int i = 0; i < cardPlay.length; i++) { file = new File(base, cardPlay[i].name); @@ -335,75 +66,21 @@ public class Gui_DownloadPictures_LQ extends DefaultBoundedRangeModel implements list.add(cardPlay[i]); } } - base = ForgeProps.getFile(IMAGE_TOKEN); + + //add missing tokens to the list of things to download + File filebase = ForgeProps.getFile(IMAGE_TOKEN); for (int i = 0; i < cardTokenLQ.length; i++) { - file = new File(base, cardTokenLQ[i].name.substring(3, cardTokenLQ[i].name.length())); - if (!file.exists()) list.add(cardTokenLQ[i]); + file = new File(filebase, cardTokenLQ[i].name); + if (!file.exists()) { + list.add(cardTokenLQ[i]); + } } //return all card names and urls that are needed - mCard[] out = new mCard[list.size()]; + DownloadObject[] out = new DownloadObject[list.size()]; list.toArray(out); return out; - } //getNeededCards() + } //getNeededImages() - /** - *

readFile.

- * - * @param ABC a {@link java.lang.String} object. - * @return an array of {@link forge.Gui_DownloadPictures_LQ.mCard} objects. - */ - private static mCard[] readFile(String ABC) { - try { - FileReader zrc = new FileReader(ForgeProps.getFile(ABC)); - BufferedReader in = new BufferedReader(zrc); - String line; - ArrayList list = new ArrayList(); - StringTokenizer tok; - - line = in.readLine(); - while (line != null && (!line.equals("")) && !line.startsWith("#")) { - tok = new StringTokenizer(line); - list.add(new mCard(tok.nextToken(), tok.nextToken())); - - line = in.readLine(); - } - - mCard[] out = new mCard[list.size()]; - list.toArray(out); - return out; - - } catch (Exception ex) { - ErrorViewer.showError(ex, "Gui_DownloadPictures: readFile() error"); - throw new RuntimeException("Gui_DownloadPictures : readFile() error"); - } - }//readFile() - - private class ProxyHandler implements ChangeListener { - private int type; - - public ProxyHandler(final int typeIn) { - this.type = typeIn; - } - - public void stateChanged(final ChangeEvent e) { - if (((AbstractButton) e.getSource()).isSelected()) { - Gui_DownloadPictures_LQ.this.type = type; - addr.setEnabled(type != 0); - port.setEnabled(type != 0); - } - } - } - - private static class mCard { - public final String name; - public final String url; - - mCard(final String cardName, final String cardURL) { - name = cardName; - url = cardURL; - } - } //mCard - } diff --git a/src/main/java/forge/Gui_DownloadSetPictures_LQ.java b/src/main/java/forge/Gui_DownloadSetPictures_LQ.java index 248190d8032..e464943cffb 100644 --- a/src/main/java/forge/Gui_DownloadSetPictures_LQ.java +++ b/src/main/java/forge/Gui_DownloadSetPictures_LQ.java @@ -1,36 +1,17 @@ package forge; -import com.esotericsoftware.minlog.Log; import forge.card.CardSet; -import forge.error.ErrorViewer; import forge.item.CardDb; import forge.item.CardPrinted; import forge.properties.ForgeProps; -import forge.properties.NewConstants; - -import javax.swing.*; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; import org.apache.commons.lang3.StringUtils; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.*; -import java.net.ConnectException; -import java.net.InetSocketAddress; -import java.net.MalformedURLException; -import java.net.Proxy; -import java.net.URL; +import java.io.File; import java.util.ArrayList; -import java.util.Random; -import java.util.StringTokenizer; -import static java.lang.Integer.parseInt; -import static javax.swing.JOptionPane.DEFAULT_OPTION; -import static javax.swing.JOptionPane.PLAIN_MESSAGE; +import javax.swing.JFrame; /** @@ -39,355 +20,31 @@ import static javax.swing.JOptionPane.PLAIN_MESSAGE; * @author Forge * @version $Id$ */ -public class Gui_DownloadSetPictures_LQ extends DefaultBoundedRangeModel implements Runnable, NewConstants, NewConstants.LANG.Gui_DownloadPictures { +public class Gui_DownloadSetPictures_LQ extends GuiDownloader { - /** Constant serialVersionUID=-7890794857949935256L */ private static final long serialVersionUID = -7890794857949935256L; - /** Constant types */ - public static final Proxy.Type[] types = Proxy.Type.values(); - - //proxy - private int type; - private JTextField addr, port; - - //progress - private mCard[] cards; - private int card; - private boolean cancel; - private JProgressBar bar; - - private JOptionPane dlg; - private JButton close; - - private long times[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - private int tptr = 0; - private long lTime = System.currentTimeMillis(); - - /** - *

getAverageTimePerCard.

- * - * @return a int. - */ - private int getAverageTimePerCard() { - int aTime = 0; - int nz = 10; - - if (tptr > 9) - tptr = 0; - - times[tptr] = System.currentTimeMillis() - lTime; - lTime = System.currentTimeMillis(); - - int tTime = 0; - for (int i = 0; i < 10; i++) { - tTime += times[i]; - if (times[i] == 0) - nz--; - } - aTime = tTime / nz; - - tptr++; - - return aTime; - } - - /** *

Constructor for Gui_DownloadSetPictures_LQ.

* - * @param c an array of {@link forge.Gui_DownloadSetPictures_LQ.mCard} objects. - */ - private Gui_DownloadSetPictures_LQ(mCard[] c) { - this.cards = c; - addr = new JTextField(ForgeProps.getLocalized(PROXY_ADDRESS)); - port = new JTextField(ForgeProps.getLocalized(PROXY_PORT)); - bar = new JProgressBar(this); - - JPanel p0 = new JPanel(); - p0.setLayout(new BoxLayout(p0, BoxLayout.Y_AXIS)); - - //Proxy Choice - ButtonGroup bg = new ButtonGroup(); - String[] labels = { - ForgeProps.getLocalized(NO_PROXY), ForgeProps.getLocalized(HTTP_PROXY), - ForgeProps.getLocalized(SOCKS_PROXY)}; - for (int i = 0; i < types.length; i++) { - JRadioButton rb = new JRadioButton(labels[i]); - rb.addChangeListener(new ProxyHandler(i)); - bg.add(rb); - p0.add(rb); - if (i == 0) rb.setSelected(true); - } - - //Proxy config - p0.add(addr); - p0.add(port); - - //Start - final JButton b = new JButton(ForgeProps.getLocalized(BUTTONS.START)); - b.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent e) { - new Thread(Gui_DownloadSetPictures_LQ.this).start(); - b.setEnabled(false); - } - }); - - p0.add(Box.createVerticalStrut(5)); - - //Progress - p0.add(bar); - bar.setStringPainted(true); - bar.setString(card + "/" + cards.length); - Dimension d = bar.getPreferredSize(); - d.width = 300; - bar.setPreferredSize(d); - - //JOptionPane - Object[] options = {b, close = new JButton(ForgeProps.getLocalized(BUTTONS.CANCEL))}; - dlg = new JOptionPane(p0, DEFAULT_OPTION, PLAIN_MESSAGE, null, options, options[1]); - } - - /** {@inheritDoc} */ - @Override - public int getMinimum() { - return 0; - } - - /** {@inheritDoc} */ - @Override - public int getValue() { - return card; - } - - /** {@inheritDoc} */ - @Override - public int getExtent() { - return 0; - } - - /** {@inheritDoc} */ - @Override - public int getMaximum() { - return cards == null ? 0 : cards.length; - } - - /** - *

update.

- * - * @param card a int. - */ - private void update(int card) { - this.card = card; - - final class Worker implements Runnable { - private int card; - - Worker(int card) { - this.card = card; - } - - public void run() { - fireStateChanged(); - - StringBuilder sb = new StringBuilder(); - - int a = getAverageTimePerCard(); - - if (card != cards.length) { - sb.append(card + "/" + cards.length + " - "); - - long t2Go = (cards.length - card) * a; - - boolean secOnly = true; - if (t2Go > 3600000) { - sb.append(String.format("%02d:", t2Go / 3600000)); - t2Go = t2Go % 3600000; - secOnly = false; - } - if (t2Go > 60000) { - sb.append(String.format("%02d:", t2Go / 60000)); - t2Go = t2Go % 60000; - secOnly = false; - } - if (!secOnly) - sb.append(String.format("%02d remaining.", t2Go / 1000)); - else - sb.append(String.format("0:%02d remaining.", t2Go / 1000)); - } else - sb.append(String.format(ForgeProps.getLocalized(BAR_CLOSE), card, cards.length)); - - bar.setString(sb.toString()); - System.out.println(card + "/" + cards.length + " - " + a); - } - } - ; - EventQueue.invokeLater(new Worker(card)); - } - - /** - *

Getter for the field dlg.

- * - * @param frame a {@link javax.swing.JFrame} object. - * @return a {@link javax.swing.JDialog} object. - */ - public JDialog getDlg(JFrame frame) { - final JDialog dlg = this.dlg.createDialog(frame, ForgeProps.getLocalized(TITLE)); - close.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - dlg.setVisible(false); - } - }); - return dlg; - } - - /** - *

Setter for the field cancel.

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

run.

- */ - public void run() { - BufferedInputStream in; - BufferedOutputStream out; - - File base = ForgeProps.getFile(IMAGE_BASE); - File tokenBase = ForgeProps.getFile(IMAGE_TOKEN); - if (!tokenBase.exists()) { - tokenBase.mkdirs(); - } - - Random r = MyRandom.random; - - Proxy p = null; - if (type == 0) p = Proxy.NO_PROXY; - else try { - p = new Proxy(types[type], new InetSocketAddress(addr.getText(), parseInt(port.getText()))); - } catch (Exception ex) { - ErrorViewer.showError(ex, ForgeProps.getLocalized(ERRORS.PROXY_CONNECT), addr.getText(), - port.getText()); - return; - } - - if (p != null) { - byte[] buf = new byte[1024]; - int len; - System.out.println("basedir: " + base); - for (update(0); card < cards.length && !cancel; update(card + 1)) { - try { - String url = cards[card].url; - String cName; - - if (cards[card].name.substring(0, 3).equals("[T]")) { - base = ForgeProps.getFile(IMAGE_TOKEN); - cName = cards[card].name.substring(3, cards[card].name.length()); - } else { - base = ForgeProps.getFile(IMAGE_BASE); - cName = cards[card].name; - } - if (Constant.Runtime.DevMode[0]) - System.out.println(cName + " - " + url); - - File f = new File(base, cName); - - //test for folder existence - File test = new File(base, cards[card].folder); - if (!test.exists()) { - // create folder - if (!test.mkdir()) - System.out.println("Can't create folder" + cards[card].folder); - } - - try { - in = new BufferedInputStream(new URL(url).openConnection(p).getInputStream()); - out = new BufferedOutputStream(new FileOutputStream(f)); - - while ((len = in.read(buf)) != -1) { - //user cancelled - if (cancel) { - in.close(); - out.flush(); - out.close(); - - //delete what was written so far - f.delete(); - - return; - }//if - cancel - - out.write(buf, 0, len); - }//while - read and write file - - in.close(); - out.flush(); - out.close(); - } - catch (ConnectException ce) { - System.out.println("Connection refused for url: " + url); - } - catch (MalformedURLException mURLe) { - System.out.println("Error - possibly missing URL for: " + cards[card].name); - } - } catch (FileNotFoundException fnfe) { - System.out.println("Error - the LQ picture for " + cards[card].name + " could not be found on the server. [" + cards[card].url + "] - " + fnfe.getMessage()); - } catch (Exception ex) { - Log.error("LQ Pictures", "Error downloading pictures", ex); - } - - // pause - - try { - Thread.sleep(r.nextInt(750) + 420); - } catch (InterruptedException e) { - Log.error("LQ Set Pictures", "Sleep Error", e); - } - }//for - } - close.setText(ForgeProps.getLocalized(BUTTONS.CLOSE)); - }//run - - /** - *

startDownload.

- * * @param frame a {@link javax.swing.JFrame} object. */ - public static void startDownload(JFrame frame) { - final mCard[] card = getNeededCards(); - - if (card.length == 0) { - JOptionPane.showMessageDialog(frame, ForgeProps.getLocalized(NO_MORE)); - return; - } - - Gui_DownloadSetPictures_LQ download = new Gui_DownloadSetPictures_LQ(card); - JDialog dlg = download.getDlg(frame); - dlg.setVisible(true); - dlg.dispose(); - download.setCancel(true); - }//startDownload() + public Gui_DownloadSetPictures_LQ(JFrame frame) { + super(frame); + } /** *

getNeededCards.

* - * @return an array of {@link forge.Gui_DownloadSetPictures_LQ.mCard} objects. + * @return an array of {@link forge.GuiDownloader.DownloadObject} objects. */ - private static mCard[] getNeededCards() { + protected final DownloadObject[] getNeededImages() { //read token names and urls - mCard[] cardTokenLQ = readFile(TOKEN_IMAGES); + DownloadObject[] cardTokenLQ = readFileWithNames(TOKEN_IMAGES, ForgeProps.getFile(IMAGE_TOKEN)); + ArrayList cList = new ArrayList(); - ArrayList cList = new ArrayList(); - - //File imgBase = ForgeProps.getFile(NewConstants.IMAGE_BASE); + File base = ForgeProps.getFile(IMAGE_BASE); String URLBase = "http://cardforge.org/fpics/"; - for (CardPrinted c : CardDb.instance().getAllCards()) { String SC3 = c.getSet(); if (StringUtils.isBlank(SC3) || "???".equals(SC3)) continue; // we don't want cards from unknown sets @@ -400,85 +57,26 @@ public class Gui_DownloadSetPictures_LQ extends DefaultBoundedRangeModel impleme if (!foundSetImage) { int artsCnt = c.getCard().getSetInfo(SC3).getCopiesCount(); - String fn = CardUtil.buildIdealFilename(c.getName(), c.getArtIndex(), artsCnt); - //System.out.println(fn); - cList.add(new mCard(SC3 + "/" + fn, URLBase + SC2 + "/" + Base64Coder.encodeString(fn, true), SC3)); + String fn = CardUtil.buildIdealFilename(c.getName(), c.getArtIndex(), artsCnt); + cList.add(new DownloadObject(fn, URLBase + SC2 + "/" + Base64Coder.encodeString(fn, true), base.getPath() + File.separator + SC3)); } } + //add missing tokens to the list of things to download File file; - File base = ForgeProps.getFile(IMAGE_TOKEN); + File filebase = ForgeProps.getFile(IMAGE_TOKEN); for (int i = 0; i < cardTokenLQ.length; i++) { - file = new File(base, cardTokenLQ[i].name.substring(3, cardTokenLQ[i].name.length())); - if (!file.exists()) cList.add(cardTokenLQ[i]); + file = new File(filebase, cardTokenLQ[i].name); + if (!file.exists()) { + cList.add(cardTokenLQ[i]); + } } //return all card names and urls that are needed - mCard[] out = new mCard[cList.size()]; + DownloadObject[] out = new DownloadObject[cList.size()]; cList.toArray(out); - - for (int i = 0; i < out.length; i++) { System.out.println(out[i].name + " " + out[i].url); } return out; - }//getNeededCards() - - /** - *

readFile.

- * - * @param ABC a {@link java.lang.String} object. - * @return an array of {@link forge.Gui_DownloadSetPictures_LQ.mCard} objects. - */ - private static mCard[] readFile(String ABC) { - try { - FileReader zrc = new FileReader(ForgeProps.getFile(ABC)); - BufferedReader in = new BufferedReader(zrc); - String line; - ArrayList list = new ArrayList(); - StringTokenizer tok; - - line = in.readLine(); - while (line != null && (!line.equals("")) && !line.startsWith("#")) { - tok = new StringTokenizer(line); - list.add(new mCard(tok.nextToken(), tok.nextToken(), "")); - - line = in.readLine(); - } - - mCard[] out = new mCard[list.size()]; - list.toArray(out); - return out; - - } catch (Exception ex) { - ErrorViewer.showError(ex, "Gui_DownloadPictures: readFile() error"); - throw new RuntimeException("Gui_DownloadPictures : readFile() error"); - } - }//readFile() - - private class ProxyHandler implements ChangeListener { - private int type; - - public ProxyHandler(int type) { - this.type = type; - } - - public void stateChanged(ChangeEvent e) { - if (((AbstractButton) e.getSource()).isSelected()) { - Gui_DownloadSetPictures_LQ.this.type = type; - addr.setEnabled(type != 0); - port.setEnabled(type != 0); - } - } - } - - private static class mCard { - final public String name; - final public String url; - final public String folder; - - mCard(String cardName, String cardURL, String cardFolder) { - name = cardName; - url = cardURL; - folder = cardFolder; - } - }//mCard -} + }//getNeededImages() + +} //end class Gui_DownloadSetPictures_LQ diff --git a/src/main/java/forge/view/swing/Gui_HomeScreen.java b/src/main/java/forge/view/swing/Gui_HomeScreen.java index fcb3b0f5390..4b8e8aa4200 100644 --- a/src/main/java/forge/view/swing/Gui_HomeScreen.java +++ b/src/main/java/forge/view/swing/Gui_HomeScreen.java @@ -865,7 +865,7 @@ public class Gui_HomeScreen { cmdDownloadLQSetPics.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { - Gui_DownloadSetPictures_LQ.startDownload(null); + new Gui_DownloadSetPictures_LQ(null); } }); diff --git a/src/main/java/forge/view/swing/OldGuiNewGame.java b/src/main/java/forge/view/swing/OldGuiNewGame.java index a1fd75a4d83..c33f533d5f7 100644 --- a/src/main/java/forge/view/swing/OldGuiNewGame.java +++ b/src/main/java/forge/view/swing/OldGuiNewGame.java @@ -1093,7 +1093,7 @@ public class OldGuiNewGame extends JFrame implements NewConstants, NewConstants. * */ public final void actionPerformed(final ActionEvent e) { - Gui_DownloadPictures_LQ.startDownload(null); + new Gui_DownloadPictures_LQ(null); } } @@ -1116,7 +1116,7 @@ public class OldGuiNewGame extends JFrame implements NewConstants, NewConstants. * */ public final void actionPerformed(final ActionEvent e) { - Gui_DownloadSetPictures_LQ.startDownload(null); + new Gui_DownloadSetPictures_LQ(null); } } diff --git a/src/test/java/forge/GuiDownloadPicturesLQTest.java b/src/test/java/forge/GuiDownloadPicturesLQTest.java index 089cfe51981..15d4a475c77 100644 --- a/src/test/java/forge/GuiDownloadPicturesLQTest.java +++ b/src/test/java/forge/GuiDownloadPicturesLQTest.java @@ -15,6 +15,6 @@ public class GuiDownloadPicturesLQTest { */ @Test(enabled = false, timeOut = 1000) public void GuiDownloadPicturesTest1() { - Gui_DownloadPictures_LQ.startDownload(null); + new Gui_DownloadPictures_LQ(null); } } diff --git a/src/test/java/forge/GuiDownloadSetPicturesLQTest.java b/src/test/java/forge/GuiDownloadSetPicturesLQTest.java index 32d35e7a04b..4d368f8966c 100644 --- a/src/test/java/forge/GuiDownloadSetPicturesLQTest.java +++ b/src/test/java/forge/GuiDownloadSetPicturesLQTest.java @@ -13,6 +13,6 @@ public class GuiDownloadSetPicturesLQTest { */ @Test(enabled = false, timeOut = 1000) public void GuiDownloadSetPicturesLQTest1() { - Gui_DownloadSetPictures_LQ.startDownload(null); + new Gui_DownloadSetPictures_LQ(null); } }