From 4f8183ae9819a29b8e520de7893e78c441affcef Mon Sep 17 00:00:00 2001 From: Cal Date: Sun, 9 Nov 2025 01:02:47 +0100 Subject: [PATCH 01/49] Add set_name in pokemon_info + tests --- src/save/pokemon/pokemon_info.rs | 21 +++++++++++++++++++++ tests/pokemon/pokemon_info.rs | 20 +++++++++++++++++++- 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/save/pokemon/pokemon_info.rs b/src/save/pokemon/pokemon_info.rs index 70d5d44..b1ad455 100644 --- a/src/save/pokemon/pokemon_info.rs +++ b/src/save/pokemon/pokemon_info.rs @@ -155,6 +155,19 @@ pub fn get_name(properties: &StructProperty) -> Option<&String> { source_string } +pub fn get_name_mut(properties: &mut StructProperty) -> Option<&mut String> { + let vec = properties.get_starts_with_mut("Name")?; + let name_prop = vec.first_mut()?; + + if let Property::TextProperty(text) = name_prop { + if let FTextHistory::Base { source_string: Some(ref mut s), .. } = &mut text.value.history { + return Some(s); + } + } + + None +} + /// Returns a namespaced string pub fn get_nature<'a>(properties: &StructProperty) -> Option<&String> { let vec = properties.get_starts_with("Nature")?; @@ -252,5 +265,13 @@ impl<'a> PokemonInfoMut<'a> { } } } + + pub fn set_name(&mut self, index: usize, name: String) { + if let Some(s) = get_struct_at_idx_mut(self.property, index) { + if let Some(name_ref) = get_name_mut(s) { + *name_ref = name; + } + } + } } diff --git a/tests/pokemon/pokemon_info.rs b/tests/pokemon/pokemon_info.rs index 99d3e3e..f3ce033 100644 --- a/tests/pokemon/pokemon_info.rs +++ b/tests/pokemon/pokemon_info.rs @@ -283,4 +283,22 @@ fn set_stat() { let party_reader = PokemonInfo::new_party(&gvas).unwrap(); let stat = party_reader.get_stat(0, Stats::ATK).expect("get stat"); assert_eq!(100.0, stat); -} \ No newline at end of file +} + +#[test] +fn set_name() { + let mut gvas = get_gvas_mut(); + { + let party_reader = PokemonInfo::new_party(&gvas).unwrap(); + let first_name = party_reader.get_name(0).expect("get stat"); + println!("{:?}", first_name); + assert_ne!("thisshoudlntbearandomname", first_name); + } + + let mut party = PokemonInfoMut::new_party(&mut gvas).unwrap(); + party.set_name(0, "foo".to_string()); + let party_reader = PokemonInfo::new_party(&gvas).unwrap(); + let name = party_reader.get_name(0).expect("get name"); + + assert_eq!("foo", name); +} From 6ba5ecc6429a6ebea9754d718716a746c55279c2 Mon Sep 17 00:00:00 2001 From: Cal Date: Sun, 9 Nov 2025 01:03:18 +0100 Subject: [PATCH 02/49] Use mon class instead of name for image finding Nicknames would break our system --- src/ui/screen/single_screen.rs | 43 +++++++++++++++++++++++++++++----- 1 file changed, 37 insertions(+), 6 deletions(-) diff --git a/src/ui/screen/single_screen.rs b/src/ui/screen/single_screen.rs index 5f63980..119e9c5 100644 --- a/src/ui/screen/single_screen.rs +++ b/src/ui/screen/single_screen.rs @@ -7,13 +7,15 @@ use crate::save::pokemon::pokemon_info::{InfoStruct, PokemonInfo, PokemonInfoMut use crate::save::pokemon::shiny_list::{ShinyList, ShinyListMut}; use crate::ui::screen::{get_images_path, render_pokemon_path, Reload, ScreenAction, ScreenTrait}; use crate::{try_gvas_read, try_gvas_write, unwrap_gvas}; -use egui::{Button, Image, Response, Sense, TextEdit, Ui}; +use egui::{Button, Image, Response, RichText, Sense, TextEdit, Ui}; use egui_extras::{Column, TableBuilder, TableRow}; use gvas::GvasFile; use std::collections::HashMap; use std::sync::RwLockWriteGuard; use eframe::emath::Vec2; use eframe::epaint::Color32; +use rfd::MessageDialogResult::No; +use crate::save::pokemon::pokemon_classes::{parse_class, PokemonClasses}; use crate::save::pokemon::StorageType; use crate::ui::image::ImageContainer; use crate::ui::render_image_container; @@ -34,6 +36,7 @@ pub struct Buffer { #[derive(Clone, Debug)] pub struct SingleMon { index: usize, + class: String, storage_type: StorageType, is_shiny: bool, name: String, @@ -364,10 +367,21 @@ impl ScreenTrait for SingleScreen { } } }; + let class = match PokemonClasses::new_party(gvas_file) { + None => {return;} + Some(party) => { + if let Some(c) = party.class_at(idx.clone()) { + c.clone() + } else { + return; + } + } + }; self.mon_data = Some(SingleMon { index: idx, storage_type: StorageType::PARTY, + class, is_shiny, name: name.clone(), stats, @@ -382,14 +396,15 @@ impl ScreenTrait for SingleScreen { self.load(app); } if let Some(data) = &self.mon_data { - let action = ui.horizontal(|ui| { - ui.add(render_image_container(&ImageContainer::new_party(data.name.clone(), data.is_shiny.clone(), data.index.clone()))); + let shiny = ui.horizontal(|ui| { + let parsed_class = parse_class(data.class.clone().as_str()).unwrap(); + ui.add(render_image_container(&ImageContainer::new_party(parsed_class, data.is_shiny.clone(), data.index.clone()))); fn flip_shiny(mut guard: RwLockWriteGuard, data: &SingleMon) -> ScreenAction { let gvas = &mut *guard; if let Some(mut list) = ShinyListMut::new_party(gvas) { match list.set_shiny_at(data.index, !data.is_shiny) { Ok(_) => { - Logger::info(format!("Shiny toggle success!")); + Logger::info("Shiny toggle success!".to_string()); return ScreenAction::Reload; } Err(e) => {Logger::info(format!("Failed to set shiny at: {}", e));} @@ -419,7 +434,7 @@ impl ScreenTrait for SingleScreen { .sense(Sense::click())); if res.clicked() { - Logger::info(format!("Shiny toggle clicked!")); + Logger::info("Shiny toggle clicked!".to_string()); let guard = match try_gvas_write!(GVAS_FILE) { None => {return ScreenAction::None;} Some(g) => {g} @@ -429,10 +444,26 @@ impl ScreenTrait for SingleScreen { } ScreenAction::None }); - if let ScreenAction::Reload = action.inner { + if let ScreenAction::Reload = shiny.inner { self.loaded = false; return ScreenAction::Reload; } + ui.label("Name"); + let mut display: String = data.name.clone(); + let res: Response = ui.add(TextEdit::singleline(&mut display).desired_width(200.0)); + if res.changed() { + let mut guard = match try_gvas_write!(GVAS_FILE) { + None => { return ScreenAction::None;} + Some(g) => {g} + }; + match PokemonInfoMut::new_party(&mut *guard) { + None => { return ScreenAction::None; } + Some(mut party) => { + party.set_name(data.index.clone(), display); + return ScreenAction::Reload; + } + }; + } } From 264d72f3a9c8ab4ea54db0d97f309157d6f24609 Mon Sep 17 00:00:00 2001 From: Cal Date: Sun, 9 Nov 2025 09:15:23 +0100 Subject: [PATCH 03/49] add rust-embed, image --- Cargo.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Cargo.toml b/Cargo.toml index 20e057b..16730d6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,6 +16,8 @@ eframe = "0.33.0" egui = { version = "0.33.0" } egui_extras = { version = "0.33.0", features = ["all_loaders"]} rfd = { version = "0.15.4" } +rust-embed="8.9.0" +image = { version = "0.25.8" } [dev-dependencies] ordered-float = { version = "4.6.0"} From 1c88bf9233f27c09be14ad8aaf7d5d17a8bc26ee Mon Sep 17 00:00:00 2001 From: Cal Date: Sun, 9 Nov 2025 09:15:36 +0100 Subject: [PATCH 04/49] add ImageCache --- src/ui/image.rs | 45 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/src/ui/image.rs b/src/ui/image.rs index f0f6a63..5cfebf6 100644 --- a/src/ui/image.rs +++ b/src/ui/image.rs @@ -1,7 +1,8 @@ -use egui::{Color32, Vec2}; +use std::collections::HashMap; use crate::save::pokemon::StorageType; -use crate::ui::menu::OnClick; use crate::ui::screen::render_pokemon_path; +use egui::{Color32, ColorImage, Context, TextureHandle, Vec2}; +use crate::app::Asset; #[derive(Clone)] pub struct ImageContainer { @@ -31,4 +32,44 @@ pub struct ImageSettings { pub size: Option, pub bg_color: Option, pub corner_radius: Option, +} + +#[derive(Clone)] +pub struct ImageCache { + pub map: HashMap, +} + +impl ImageCache { + pub fn new() -> Self { + Self { + map: HashMap::new() + } + } + + pub fn get(&mut self, ctx: &Context, path: &str) -> Option<&TextureHandle> { + if !self.map.contains_key(path) { + if let Some(texture) = Self::load_texture(ctx, path) { + self.map.insert(path.to_string(), texture); + } + } + self.map.get(path) + } + + fn load_texture(ctx: &Context, path: &str) -> Option { + let file = Asset::get(path)?; + let img = image::load_from_memory(&file.data).ok()?; + let rgba = img.to_rgba8(); + let (w, h) = (img.width() as usize, img.height() as usize); + let color_image = ColorImage::from_rgba_unmultiplied([w, h], &rgba); + Some(ctx.load_texture(path.to_owned(), color_image, egui::TextureOptions::LINEAR)) + } + + pub fn list_all(&self) -> String { + let keys = self.map.keys(); + let mut list = String::new(); + keys.for_each(|key| { + list.push_str(&format!("{} ", key)); + }); + list + } } \ No newline at end of file From 97906ae509ce201fbd3a2454e8e339bc7467ce62 Mon Sep 17 00:00:00 2001 From: Cal Date: Sun, 9 Nov 2025 09:15:58 +0100 Subject: [PATCH 05/49] edit render_pokemon_path to use images --- src/ui/screen/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/screen/mod.rs b/src/ui/screen/mod.rs index 56236d0..79abdd8 100644 --- a/src/ui/screen/mod.rs +++ b/src/ui/screen/mod.rs @@ -96,7 +96,7 @@ pub trait ScreenTrait { pub fn render_pokemon_path<'a>(name: String, is_shiny: bool) -> String { let shiny_folder: &str = if is_shiny { "shiny" } else { "normal" }; format!( - "file://{}/scraper/images/{}/{}.png", + "file://{}/images/{}/{}.png", env!("CARGO_MANIFEST_DIR").replace("\\", "/"), shiny_folder, name From a670c0f3e2c7b9c27fa3847551779fbf41c1f4b8 Mon Sep 17 00:00:00 2001 From: Cal Date: Sun, 9 Nov 2025 09:16:10 +0100 Subject: [PATCH 06/49] addrender_texture function --- src/ui/mod.rs | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/ui/mod.rs b/src/ui/mod.rs index b6b8538..0a20f1b 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -1,9 +1,12 @@ -use egui::{Color32, Image, Vec2}; +use egui::{Color32, Image, TextureHandle, Vec2}; +use egui::load::SizedTexture; +use rust_embed::EmbeddedFile; +use crate::app::Asset; use crate::ui::image::ImageContainer; pub mod screen; pub mod menu; -mod image; +pub(crate) mod image; fn render_image<'a>(path: String) -> Image<'a> { Image::new(path) @@ -13,8 +16,22 @@ fn render_image<'a>(path: String) -> Image<'a> { } fn render_image_container(container: &ImageContainer) -> Image { + // let src = match Asset::get(container.path.clone().as_str()) { + // None => {Image::new("")} + // Some(image) => { + // Image::new(image) + // } + // }; Image::new(container.path.clone()) .corner_radius(5) .bg_fill(Color32::from_rgb(50, 50, 50)) .fit_to_exact_size(Vec2::new(64.0, 64.0)) +} + +pub fn render_texture(texture: &TextureHandle) -> Image { + Image::new(SizedTexture { + id: texture.id(), + size: Vec2::new(64.0, 64.0), + }).corner_radius(5) + .bg_fill(Color32::from_rgb(50, 50, 50)) } \ No newline at end of file From 35b1a3271c56dae90199caa17ebb93a3c09e4785 Mon Sep 17 00:00:00 2001 From: Cal Date: Sun, 9 Nov 2025 09:16:26 +0100 Subject: [PATCH 07/49] Create cache in app::new --- src/app.rs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/app.rs b/src/app.rs index 501ad14..9c9f18d 100644 --- a/src/app.rs +++ b/src/app.rs @@ -12,8 +12,10 @@ use crate::ui::screen::party_screen::PartyScreen; use crate::ui::screen::home_screen::HomeScreen; use crate::ui::screen::{render_screen, Screen, }; use crate::ui::screen::single_screen::SingleScreen; +use crate::ui::image::ImageCache; use gvas::GvasFile; use rfd::MessageLevel; +use rust_embed::Embed; pub static GVAS_FILE: OnceLock>> = OnceLock::>>::new(); @@ -22,6 +24,7 @@ pub struct App { pub gvas_file: Option>>, pub screen: Screen, pub selected_mon: Option, + pub image_cache: ImageCache } pub struct Screens { @@ -48,11 +51,19 @@ impl App { panic!() } }; - + Logger::info("Loading image cache"); + let start = chrono::Local::now().timestamp_millis(); + let mut cache = ImageCache::new(); + for path in Asset::iter() { + cache.get(&cc.egui_ctx, &path); + } + let end = chrono::Local::now().timestamp_millis(); + Logger::info(format!("Image cache loaded in: {} ms", end - start)); Self { gvas_file: None, screen: Screen::Home(HomeScreen), selected_mon: None, + image_cache: cache } } @@ -138,6 +149,10 @@ impl App { } } +#[derive(Embed)] +#[folder = "images/"] +pub struct Asset; + impl eframe::App for App { fn update(&mut self, ctx: &egui::Context, frame: &mut eframe::Frame) { ctx.data_mut(|map| { From 5c8ff2deb8bb1232d0eab74dcc3424d33d05eaff Mon Sep 17 00:00:00 2001 From: Cal Date: Sun, 9 Nov 2025 09:16:35 +0100 Subject: [PATCH 08/49] Use cache in singlescreen --- src/ui/screen/single_screen.rs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/ui/screen/single_screen.rs b/src/ui/screen/single_screen.rs index 119e9c5..7131c3a 100644 --- a/src/ui/screen/single_screen.rs +++ b/src/ui/screen/single_screen.rs @@ -11,14 +11,16 @@ use egui::{Button, Image, Response, RichText, Sense, TextEdit, Ui}; use egui_extras::{Column, TableBuilder, TableRow}; use gvas::GvasFile; use std::collections::HashMap; +use std::fmt::format; use std::sync::RwLockWriteGuard; use eframe::emath::Vec2; use eframe::epaint::Color32; +use egui::Shape::Path; use rfd::MessageDialogResult::No; use crate::save::pokemon::pokemon_classes::{parse_class, PokemonClasses}; use crate::save::pokemon::StorageType; use crate::ui::image::ImageContainer; -use crate::ui::render_image_container; +use crate::ui::{render_image_container, render_texture}; #[derive(Clone, Debug)] pub struct SingleScreen { @@ -398,7 +400,16 @@ impl ScreenTrait for SingleScreen { if let Some(data) = &self.mon_data { let shiny = ui.horizontal(|ui| { let parsed_class = parse_class(data.class.clone().as_str()).unwrap(); - ui.add(render_image_container(&ImageContainer::new_party(parsed_class, data.is_shiny.clone(), data.index.clone()))); + let shiny_text = if data.is_shiny { "shiny" } else { "normal" }; + + let path = format!("{}/{}.png", shiny_text, parsed_class); + if let Some(tex) = app.image_cache.get(ui.ctx(), path.as_str()) { + let image: Image = render_texture(tex); + ui.add(image); + } else { + Logger::info(format!("No such image: {}", path.as_str())); + } + fn flip_shiny(mut guard: RwLockWriteGuard, data: &SingleMon) -> ScreenAction { let gvas = &mut *guard; if let Some(mut list) = ShinyListMut::new_party(gvas) { From b846cc0e77f6328bcb477336222673ea5e1a081b Mon Sep 17 00:00:00 2001 From: Cal Date: Sun, 9 Nov 2025 09:19:58 +0100 Subject: [PATCH 09/49] cargo fmt entire repo still builds thankfully, seems to work --- Cargo.lock | 533 +++++++++++++++++++++++++++- benches/gvas_read.rs | 38 +- src/app.rs | 64 ++-- src/file/mod.rs | 4 +- src/lib.rs | 13 +- src/logger/mod.rs | 54 ++- src/macros.rs | 6 +- src/main.rs | 10 +- src/pkmn/gender.rs | 12 +- src/pkmn/mod.rs | 19 +- src/pkmn/natures.rs | 56 ++- src/pkmn/stats.rs | 55 +-- src/pkmn/types.rs | 12 +- src/property/mod.rs | 2 +- src/property/traits.rs | 59 ++- src/save/mod.rs | 46 +-- src/save/pokemon/attack_lists.rs | 16 +- src/save/pokemon/gender.rs | 20 +- src/save/pokemon/iv_struct.rs | 31 +- src/save/pokemon/mod.rs | 17 +- src/save/pokemon/pokemon_classes.rs | 35 +- src/save/pokemon/pokemon_id.rs | 4 +- src/save/pokemon/pokemon_info.rs | 93 ++--- src/save/pokemon/pp_moves_lists.rs | 32 +- src/save/pokemon/shiny_list.rs | 55 ++- src/save/utils.rs | 42 ++- src/ui/image.rs | 10 +- src/ui/menu/buttons.rs | 6 +- src/ui/menu/discord.rs | 1 + src/ui/menu/mod.rs | 145 ++++---- src/ui/mod.rs | 17 +- src/ui/screen/home_screen.rs | 10 +- src/ui/screen/mod.rs | 35 +- src/ui/screen/party_screen.rs | 53 +-- src/ui/screen/single_screen.rs | 203 ++++++----- src/utils/custom_struct.rs | 68 ++-- src/utils/mod.rs | 13 +- tests/common.rs | 13 +- tests/main.rs | 2 +- tests/pokemon/attack_lists.rs | 14 +- tests/pokemon/gender.rs | 4 +- tests/pokemon/iv_struct.rs | 9 +- tests/pokemon/mod.rs | 8 +- tests/pokemon/pokemon_classes.rs | 4 +- tests/pokemon/pokemon_id.rs | 10 +- tests/pokemon/pokemon_info.rs | 33 +- tests/pokemon/pp_moves_lists.rs | 10 +- tests/pokemon/shiny_list.rs | 14 +- tests/property.rs | 22 +- 49 files changed, 1274 insertions(+), 758 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4efc382..66043ad 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -136,6 +136,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "aligned-vec" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc890384c8602f339876ded803c97ad529f3842aba97f6392b3dba0dd171769b" +dependencies = [ + "equator", +] + [[package]] name = "android-activity" version = "0.6.0" @@ -190,6 +199,18 @@ version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" +[[package]] +name = "anyhow" +version = "1.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" + +[[package]] +name = "arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" + [[package]] name = "arboard" version = "3.6.1" @@ -210,6 +231,17 @@ dependencies = [ "x11rb", ] +[[package]] +name = "arg_enum_proc_macro" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "arrayref" version = "0.3.9" @@ -474,6 +506,29 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +[[package]] +name = "av1-grain" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f3efb2ca85bc610acfa917b5aaa36f3fcbebed5b3182d7f877b02531c4b80c8" +dependencies = [ + "anyhow", + "arrayvec", + "log", + "nom", + "num-rational", + "v_frame", +] + +[[package]] +name = "avif-serialize" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47c8fbc0f831f4519fe8b810b6a7a91410ec83031b8233f730a0480029f6a23f" +dependencies = [ + "arrayvec", +] + [[package]] name = "base64" version = "0.22.1" @@ -495,6 +550,12 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" +[[package]] +name = "bit_field" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e4b40c7323adcfc0a41c4b88143ed58346ff65a288fc144329c5c45e05d70c6" + [[package]] name = "bitflags" version = "1.3.2" @@ -507,12 +568,27 @@ version = "2.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" +[[package]] +name = "bitstream-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6099cdc01846bc367c4e7dd630dc5966dccf36b652fae7a74e17b640411a91b2" + [[package]] name = "block" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + [[package]] name = "block2" version = "0.5.1" @@ -544,6 +620,12 @@ dependencies = [ "piper", ] +[[package]] +name = "built" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ed6191a7e78c36abdb16ab65341eefd73d64d303fffccdbb00d51e4205967b" + [[package]] name = "bumpalo" version = "3.17.0" @@ -637,6 +719,16 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + [[package]] name = "cfg-if" version = "1.0.0" @@ -842,6 +934,15 @@ dependencies = [ "libc", ] +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + [[package]] name = "crc32fast" version = "1.4.2" @@ -862,7 +963,7 @@ dependencies = [ "ciborium", "clap", "criterion-plot", - "itertools", + "itertools 0.13.0", "num-traits", "oorandom", "plotters", @@ -881,7 +982,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b1bcc0dc7dfae599d84ad0b1a55f80cde8af3725da8313b528da95ef783e338" dependencies = [ "cast", - "itertools", + "itertools 0.13.0", ] [[package]] @@ -915,6 +1016,16 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + [[package]] name = "cursor-icon" version = "1.2.0" @@ -972,6 +1083,16 @@ dependencies = [ "serde", ] +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + [[package]] name = "dispatch" version = "0.2.0" @@ -1282,6 +1403,26 @@ version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "66054d943c66715c6003a27a3dc152d87cadf714ef2597ccd79f550413009b97" +[[package]] +name = "equator" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc" +dependencies = [ + "equator-macro", +] + +[[package]] +name = "equator-macro" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "equivalent" version = "1.0.2" @@ -1334,6 +1475,21 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "exr" +version = "1.73.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83197f59927b46c04a183a619b7c29df34e63e63c7869320862268c0ef687e0" +dependencies = [ + "bit_field", + "half", + "lebe", + "miniz_oxide", + "rayon-core", + "smallvec", + "zune-inflate", +] + [[package]] name = "fastrand" version = "2.3.0" @@ -1516,13 +1672,25 @@ dependencies = [ "egui", "egui_extras", "gvas", + "image", "indexmap 2.11.3", "ordered-float", "rfd", + "rust-embed", "serde", "serde_json", ] +[[package]] +name = "generic-array" +version = "0.14.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" +dependencies = [ + "typenum", + "version_check", +] + [[package]] name = "gethostname" version = "1.0.2" @@ -1760,6 +1928,12 @@ dependencies = [ "foldhash 0.2.0", ] +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "hermit-abi" version = "0.5.2" @@ -1924,12 +2098,19 @@ dependencies = [ "bytemuck", "byteorder-lite", "color_quant", + "exr", "gif", "image-webp", "moxcms", "num-traits", "png 0.18.0", + "qoi", + "ravif", + "rayon", + "rgb", "tiff", + "zune-core", + "zune-jpeg", ] [[package]] @@ -1948,6 +2129,12 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edcd27d72f2f071c64249075f42e205ff93c9a4c5f6c6da53e79ed9f9832c285" +[[package]] +name = "imgref" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c5cedc30da3a610cac6b4ba17597bdf7152cf974e8aab3afb3d54455e371c8" + [[package]] name = "indexmap" version = "1.9.3" @@ -1971,6 +2158,26 @@ dependencies = [ "serde_core", ] +[[package]] +name = "interpolate_name" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.13.0" @@ -2056,12 +2263,28 @@ dependencies = [ "smallvec", ] +[[package]] +name = "lebe" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" + [[package]] name = "libc" version = "0.2.172" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" +[[package]] +name = "libfuzzer-sys" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5037190e1f70cbeef565bd267599242926f724d3b8a9f510fd7e0b540cfa4404" +dependencies = [ + "arbitrary", + "cc", +] + [[package]] name = "libloading" version = "0.8.9" @@ -2128,6 +2351,15 @@ version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" +[[package]] +name = "loop9" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" +dependencies = [ + "imgref", +] + [[package]] name = "malloc_buf" version = "0.0.6" @@ -2137,6 +2369,16 @@ dependencies = [ "libc", ] +[[package]] +name = "maybe-rayon" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" +dependencies = [ + "cfg-if", + "rayon", +] + [[package]] name = "memchr" version = "2.7.4" @@ -2194,6 +2436,12 @@ dependencies = [ "unicase", ] +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" version = "0.8.8" @@ -2270,6 +2518,12 @@ dependencies = [ "jni-sys", ] +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + [[package]] name = "nix" version = "0.30.1" @@ -2289,12 +2543,69 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "noop_proc_macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + [[package]] name = "num-conv" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -2940,6 +3251,19 @@ name = "profiling" version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773" +dependencies = [ + "profiling-procmacros", +] + +[[package]] +name = "profiling-procmacros" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52717f9a02b6965224f95ca2a81e2e0c5c43baacd28ca057577988930b6c3d5b" +dependencies = [ + "quote", + "syn", +] [[package]] name = "pxfm" @@ -2950,6 +3274,15 @@ dependencies = [ "num-traits", ] +[[package]] +name = "qoi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" +dependencies = [ + "bytemuck", +] + [[package]] name = "quick-error" version = "2.0.1" @@ -2996,6 +3329,8 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ + "libc", + "rand_chacha 0.3.1", "rand_core 0.6.4", "serde", ] @@ -3006,10 +3341,20 @@ version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ - "rand_chacha", + "rand_chacha 0.9.0", "rand_core 0.9.3", ] +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + [[package]] name = "rand_chacha" version = "0.9.0" @@ -3026,6 +3371,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ + "getrandom 0.2.16", "serde", ] @@ -3044,6 +3390,56 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3d6831663a5098ea164f89cff59c6284e95f4e3c76ce9848d4529f5ccca9bde" +[[package]] +name = "rav1e" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" +dependencies = [ + "arbitrary", + "arg_enum_proc_macro", + "arrayvec", + "av1-grain", + "bitstream-io", + "built", + "cfg-if", + "interpolate_name", + "itertools 0.12.1", + "libc", + "libfuzzer-sys", + "log", + "maybe-rayon", + "new_debug_unreachable", + "noop_proc_macro", + "num-derive", + "num-traits", + "once_cell", + "paste", + "profiling", + "rand 0.8.5", + "rand_chacha 0.3.1", + "simd_helpers", + "system-deps", + "thiserror 1.0.69", + "v_frame", + "wasm-bindgen", +] + +[[package]] +name = "ravif" +version = "0.11.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5825c26fddd16ab9f515930d49028a630efec172e903483c94796cfe31893e6b" +dependencies = [ + "avif-serialize", + "imgref", + "loop9", + "quick-error", + "rav1e", + "rayon", + "rgb", +] + [[package]] name = "raw-window-handle" version = "0.6.2" @@ -3190,6 +3586,40 @@ version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" +[[package]] +name = "rust-embed" +version = "8.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "947d7f3fad52b283d261c4c99a084937e2fe492248cb9a68a8435a861b8798ca" +dependencies = [ + "rust-embed-impl", + "rust-embed-utils", + "walkdir", +] + +[[package]] +name = "rust-embed-impl" +version = "8.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fa2c8c9e8711e10f9c4fd2d64317ef13feaab820a4c51541f1a8c8e2e851ab2" +dependencies = [ + "proc-macro2", + "quote", + "rust-embed-utils", + "syn", + "walkdir", +] + +[[package]] +name = "rust-embed-utils" +version = "8.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b161f275cb337fe0a44d924a5f4df0ed69c2c39519858f931ce61c779d3475" +dependencies = [ + "sha2", + "walkdir", +] + [[package]] name = "rustc-hash" version = "1.1.0" @@ -3362,6 +3792,15 @@ dependencies = [ "syn", ] +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + [[package]] name = "serde_with" version = "3.12.0" @@ -3392,6 +3831,17 @@ dependencies = [ "syn", ] +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "shlex" version = "1.3.0" @@ -3413,6 +3863,15 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" +[[package]] +name = "simd_helpers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" +dependencies = [ + "quote", +] + [[package]] name = "simplecss" version = "0.2.2" @@ -3568,6 +4027,25 @@ dependencies = [ "syn", ] +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck", + "pkg-config", + "toml", + "version-compare", +] + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + [[package]] name = "tempfile" version = "3.23.0" @@ -3721,11 +4199,26 @@ dependencies = [ "serde_json", ] +[[package]] +name = "toml" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + [[package]] name = "toml_datetime" version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" +dependencies = [ + "serde", +] [[package]] name = "toml_edit" @@ -3734,6 +4227,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" dependencies = [ "indexmap 2.11.3", + "serde", + "serde_spanned", "toml_datetime", "winnow", ] @@ -3784,6 +4279,12 @@ dependencies = [ "rustc-hash 2.1.1", ] +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + [[package]] name = "uds_windows" version = "1.1.0" @@ -3887,6 +4388,23 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" +[[package]] +name = "v_frame" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "666b7727c8875d6ab5db9533418d7c764233ac9c0cff1d469aec8fa127597be2" +dependencies = [ + "aligned-vec", + "num-traits", + "wasm-bindgen", +] + +[[package]] +name = "version-compare" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" + [[package]] name = "version_check" version = "0.9.5" @@ -5110,6 +5628,15 @@ version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" +[[package]] +name = "zune-inflate" +version = "0.2.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" +dependencies = [ + "simd-adler32", +] + [[package]] name = "zune-jpeg" version = "0.4.21" diff --git a/benches/gvas_read.rs b/benches/gvas_read.rs index 59deda1..0546f60 100644 --- a/benches/gvas_read.rs +++ b/benches/gvas_read.rs @@ -1,15 +1,15 @@ use criterion::{criterion_group, criterion_main, Criterion}; -use std::hint::black_box; +use gammaeditor::save::pokemon::pokemon_info::PokemonInfo; +use gammaeditor::{try_gvas_read, try_gvas_write}; +use gvas::game_version::GameVersion; +use gvas::GvasFile; use std::arch::x86_64::_rdtsc; use std::fs::File; +use std::hint::black_box; use std::io::Cursor; use std::path::PathBuf; use std::sync::{Arc, OnceLock, RwLock}; use std::time::Duration; -use gvas::game_version::GameVersion; -use gvas::GvasFile; -use gammaeditor::save::pokemon::pokemon_info::PokemonInfo; -use gammaeditor::{try_gvas_read, try_gvas_write}; fn bench_gvas_read(c: &mut Criterion) { let path = PathBuf::from("benches/resource/Slot1.sav"); @@ -19,7 +19,7 @@ fn bench_gvas_read(c: &mut Criterion) { group.measurement_time(Duration::from_secs(5)); group.bench_function("read (time)", |b| { - b.iter(|| { + b.iter(|| { let mut cursor = Cursor::new(black_box(&bytes)); let gvas = GvasFile::read(&mut cursor, GameVersion::Default).unwrap(); black_box(gvas); @@ -46,18 +46,16 @@ fn bench_gvas_read(c: &mut Criterion) { }); }); - let mut gvas: GvasFile = GvasFile::read(&mut Cursor::new(&bytes), GameVersion::Default).unwrap(); + let mut gvas: GvasFile = + GvasFile::read(&mut Cursor::new(&bytes), GameVersion::Default).unwrap(); group.bench_function("get a deep struct (time)", |b| { - b.iter(|| { - let g = black_box(&gvas); + b.iter(|| { + let g = black_box(&gvas); - let res = PokemonInfo::new_party(g) - .unwrap() - .get_stats(2) - .unwrap(); + let res = PokemonInfo::new_party(g).unwrap().get_stats(2).unwrap(); - black_box(res); - }) + black_box(res); + }) }); group.bench_function("get a deep struct (cycles)", |b| { @@ -69,10 +67,7 @@ fn bench_gvas_read(c: &mut Criterion) { let g = black_box(&gvas); - let res = PokemonInfo::new_party(g) - .unwrap() - .get_stats(2) - .unwrap(); + let res = PokemonInfo::new_party(g).unwrap().get_stats(2).unwrap(); let end = _rdtsc(); total_cycles += end - start; @@ -87,8 +82,9 @@ fn bench_gvas_read(c: &mut Criterion) { }); }); - let gvas: GvasFile = GvasFile::read(&mut Cursor::new(&bytes), GameVersion::Default).unwrap(); - pub static FAKE_STATIC: OnceLock>> = OnceLock::>>::new(); + let gvas: GvasFile = GvasFile::read(&mut Cursor::new(&bytes), GameVersion::Default).unwrap(); + pub static FAKE_STATIC: OnceLock>> = + OnceLock::>>::new(); FAKE_STATIC.set(Arc::new(RwLock::new(gvas))); group.bench_function("try gvas read (time)", |b| { b.iter(|| { diff --git a/src/app.rs b/src/app.rs index 9c9f18d..9f70bbd 100644 --- a/src/app.rs +++ b/src/app.rs @@ -1,21 +1,21 @@ -use crate::ui::screen::ScreenTrait; -use eframe::emath::Align; -use egui::panel::TopBottomSide; -use egui::{CursorIcon, Direction, Id, Label, Layout, RichText, Sense}; -use std::fs::File; -use std::io::{Cursor, Write}; -use std::sync::{Arc, OnceLock, RwLock, RwLockReadGuard}; use crate::logger::Logger; use crate::save::pokemon::SelectedMon; +use crate::ui::image::ImageCache; use crate::ui::menu::render_menu_bar; -use crate::ui::screen::party_screen::PartyScreen; use crate::ui::screen::home_screen::HomeScreen; -use crate::ui::screen::{render_screen, Screen, }; +use crate::ui::screen::party_screen::PartyScreen; use crate::ui::screen::single_screen::SingleScreen; -use crate::ui::image::ImageCache; +use crate::ui::screen::ScreenTrait; +use crate::ui::screen::{render_screen, Screen}; +use eframe::emath::Align; +use egui::panel::TopBottomSide; +use egui::{CursorIcon, Direction, Id, Label, Layout, RichText, Sense}; use gvas::GvasFile; use rfd::MessageLevel; use rust_embed::Embed; +use std::fs::File; +use std::io::{Cursor, Write}; +use std::sync::{Arc, OnceLock, RwLock, RwLockReadGuard}; pub static GVAS_FILE: OnceLock>> = OnceLock::>>::new(); @@ -24,18 +24,16 @@ pub struct App { pub gvas_file: Option>>, pub screen: Screen, pub selected_mon: Option, - pub image_cache: ImageCache + pub image_cache: ImageCache, } pub struct Screens { pub party_screen: PartyScreen, - pub single_screen: SingleScreen + pub single_screen: SingleScreen, } - impl App { pub fn new(cc: &eframe::CreationContext<'_>) -> Self { - let logger = match Logger::init() { Ok(_) => {} Err(e) => { @@ -45,8 +43,9 @@ impl App { .set_description(format!( "Logger failed to start.\ Please check the app has sufficient permissions to create files.\ - {}", e) - ) + {}", + e + )) .show(); panic!() } @@ -63,7 +62,7 @@ impl App { gvas_file: None, screen: Screen::Home(HomeScreen), selected_mon: None, - image_cache: cache + image_cache: cache, } } @@ -86,7 +85,8 @@ impl App { }; let mut file = File::create(&path).map_err(|e| e.to_string())?; - file.write_all(&writer.into_inner()).map_err(|e| e.to_string())?; + file.write_all(&writer.into_inner()) + .map_err(|e| e.to_string())?; Ok(()) } @@ -97,7 +97,7 @@ impl App { let res = GVAS_FILE.set(guard); match res { - Ok(_) => { Ok(()) } + Ok(_) => Ok(()), Err(e) => { let msg = "Failed to load save (is it already loaded?)"; Logger::error(msg.clone()); @@ -109,12 +109,8 @@ impl App { pub(crate) fn is_save_loaded(&self) -> bool { match &self.gvas_file { - None => { - false - } - Some(_) => { - true - } + None => false, + Some(_) => true, } } pub fn load_screen(&mut self, next: Screen) -> Result { @@ -140,7 +136,7 @@ impl App { pub fn set_screen(&mut self, next: Screen) { Logger::info("Setting screen inside app"); self.screen = match self.load_screen(next) { - Ok(s) => {s} + Ok(s) => s, Err(_) => { Logger::error("Failed to set screen..."); return; @@ -156,10 +152,7 @@ pub struct Asset; impl eframe::App for App { fn update(&mut self, ctx: &egui::Context, frame: &mut eframe::Frame) { ctx.data_mut(|map| { - map.insert_persisted( - Id::new("selected_mon"), - None::> - ) + map.insert_persisted(Id::new("selected_mon"), None::>) }); render_menu_bar(ctx, self); render_navigation_bar(self, ctx); @@ -172,13 +165,14 @@ fn render_navigation_bar(app: &mut App, ctx: &egui::Context) { ui.horizontal_centered(|ui| { for screen in [ Screen::Home(HomeScreen), - Screen::Party(PartyScreen { loaded: false, containers: vec![] }), + Screen::Party(PartyScreen { + loaded: false, + containers: vec![], + }), ] { let text: RichText = RichText::new(screen.as_str()).size(18.0); - let response = ui.add( - Label::new(text).sense(Sense::click()) - ); + let response = ui.add(Label::new(text).sense(Sense::click())); if response.hovered() { ui.ctx().set_cursor_icon(CursorIcon::PointingHand); @@ -192,4 +186,4 @@ fn render_navigation_bar(app: &mut App, ctx: &egui::Context) { } }); }); -} \ No newline at end of file +} diff --git a/src/file/mod.rs b/src/file/mod.rs index e0b6ed1..3adf9d5 100644 --- a/src/file/mod.rs +++ b/src/file/mod.rs @@ -8,6 +8,4 @@ pub fn parse_with_root(string: String) -> PathBuf { let mut path: PathBuf = get_root(); path.push(string); path - - -} \ No newline at end of file +} diff --git a/src/lib.rs b/src/lib.rs index bed1108..412345d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,12 +1,11 @@ extern crate core; -pub mod save; -pub mod pkmn; -pub mod property; -pub mod utils; +pub mod app; +pub mod file; pub mod logger; pub mod macros; +pub mod pkmn; +pub mod property; +pub mod save; pub mod ui; -pub mod file; -pub mod app; - +pub mod utils; diff --git a/src/logger/mod.rs b/src/logger/mod.rs index 88389d6..562ccde 100644 --- a/src/logger/mod.rs +++ b/src/logger/mod.rs @@ -1,12 +1,12 @@ +use chrono::{DateTime, Local, Utc}; use std::env::current_dir; use std::fs::{File, OpenOptions}; -use std::{io, thread}; use std::io::Write; use std::path::PathBuf; -use std::sync::{mpsc, Mutex, OnceLock}; use std::sync::mpsc::{Receiver, Sender}; +use std::sync::{mpsc, Mutex, OnceLock}; use std::time::SystemTime; -use chrono::{DateTime, Local, Utc}; +use std::{io, thread}; pub fn info(message: &str) { let mut file: File = get_log_file(); @@ -24,10 +24,8 @@ pub fn get_log_file() -> File { let curr: DateTime = Utc::now(); let file_name: String = format!("logs/{}.log", curr.format("%d-%m-%y")); - let file: Result = OpenOptions::new() - .create(true) - .append(true) - .open(file_name); + let file: Result = + OpenOptions::new().create(true).append(true).open(file_name); match file { Ok(file) => file, @@ -40,10 +38,9 @@ pub fn get_log_file() -> File { static LOGGER_SENDER: OnceLock>> = OnceLock::new(); static LAST_LOGGED: OnceLock>> = OnceLock::new(); - #[derive(Clone)] pub struct Logger { - sender: Sender + sender: Sender, } pub struct LogMessage { @@ -59,17 +56,14 @@ pub enum LogLevel { } impl Logger { - - pub fn create_dir() -> Result<(), String>{ + pub fn create_dir() -> Result<(), String> { if let Err(e) = std::fs::create_dir_all("logs") { return Err("Failed to create log dir: {e}".to_string()); }; - Ok(()) } - pub fn create_file() -> Result { let now: DateTime = Utc::now(); let file_name = format!("logs/{}.log", now.format("%d-%m-%y")); @@ -80,23 +74,19 @@ impl Logger { .open(&file_name) { Ok(f) => Ok(f), - Err(e) => Err("Failed to open log file: {e}".to_string()) + Err(e) => Err("Failed to open log file: {e}".to_string()), } } pub fn init() -> Result<(), String> { let dir_created: () = match Self::create_dir() { - Ok(_) => { - - } - Err(err) => { - return Err(err) - } + Ok(_) => {} + Err(err) => return Err(err), }; let mut file: File = match Self::create_file() { - Ok(f) => {f} - Err(e) => { return Err(e)} + Ok(f) => f, + Err(e) => return Err(e), }; let (tx, rx): (Sender, Receiver) = mpsc::channel::(); @@ -109,7 +99,7 @@ impl Logger { let prefix: &str = match msg.level { LogLevel::Info => "[INFO]", LogLevel::Error => "[ERROR]", - LogLevel::Warn => "[WARN]" + LogLevel::Warn => "[WARN]", }; let line: String = format!("{timestamp} > {prefix} {}", msg.content); if let Err(e) = writeln!(file, "{}", line) { @@ -132,10 +122,8 @@ impl Logger { LOGGER_SENDER.get() } - /// Send a non-blocking log message pub fn log_once(level: LogLevel, message: impl Into) { - let msg = message.into(); // Initialise on first use @@ -174,9 +162,17 @@ impl Logger { } } - pub fn info_once(msg: impl Into) { Self::log_once(LogLevel::Info, msg); } + pub fn info_once(msg: impl Into) { + Self::log_once(LogLevel::Info, msg); + } - pub fn info(msg: impl Into) { Self::log(LogLevel::Info, msg); } - pub fn warn(msg: impl Into) { Self::log(LogLevel::Warn, msg); } - pub fn error(msg: impl Into) { Self::log(LogLevel::Error, msg); } + pub fn info(msg: impl Into) { + Self::log(LogLevel::Info, msg); + } + pub fn warn(msg: impl Into) { + Self::log(LogLevel::Warn, msg); + } + pub fn error(msg: impl Into) { + Self::log(LogLevel::Error, msg); + } } diff --git a/src/macros.rs b/src/macros.rs index 48dc070..b22c424 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -75,8 +75,8 @@ macro_rules! unwrap_gvas_mut { #[macro_export] macro_rules! try_gvas_read { ($cell:expr) => {{ - use $crate::logger::Logger; use std::sync::TryLockError; + use $crate::logger::Logger; match $cell.get() { Some(cell) => match cell.try_read() { @@ -101,8 +101,8 @@ macro_rules! try_gvas_read { #[macro_export] macro_rules! try_gvas_write { ($cell:expr) => {{ - use $crate::logger::Logger; use std::sync::TryLockError; + use $crate::logger::Logger; match $cell.get() { Some(cell) => match cell.try_write() { @@ -122,4 +122,4 @@ macro_rules! try_gvas_write { } } }}; -} \ No newline at end of file +} diff --git a/src/main.rs b/src/main.rs index 59247c1..4a746a0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,8 +1,7 @@ -use std::process; use eframe::NativeOptions; use gammaeditor::app::App; use gammaeditor::logger::Logger; - +use std::process; fn main() { Logger::init().unwrap(); @@ -16,12 +15,11 @@ fn main() { Box::new(|cc| { egui_extras::install_image_loaders(&cc.egui_ctx); Ok(Box::new(App::new(cc))) - }) + }), ) - .expect("How did we get here?"); + .expect("How did we get here?"); } - fn run_generator(args: Vec) -> Result { println!("Starting generator"); @@ -34,4 +32,4 @@ fn run_generator(args: Vec) -> Result { return Err(String::from_utf8_lossy(&output.stderr).to_string()); } Ok(String::from_utf8_lossy(&output.stdout).to_string()) -} \ No newline at end of file +} diff --git a/src/pkmn/gender.rs b/src/pkmn/gender.rs index b5c8617..68ff4f3 100644 --- a/src/pkmn/gender.rs +++ b/src/pkmn/gender.rs @@ -1,4 +1,3 @@ - pub fn get_gender_from_enum(enum_str: &str) -> Option<&str> { let gender = match enum_str { "ENUM_Gender::NewEnumerator0" => "MALE", @@ -13,18 +12,17 @@ pub fn get_gender_from_enum(enum_str: &str) -> Option<&str> { pub enum Gender { Male, Female, - Unknown + Unknown, } -pub enum GenderStrings { -} +pub enum GenderStrings {} impl Gender { pub fn from_str(string: &str) -> Gender { match string.to_uppercase().as_str() { "MALE" => Gender::Male, "FEMALE" => Gender::Female, - _ => Gender::Unknown + _ => Gender::Unknown, } } @@ -33,9 +31,9 @@ impl Gender { let string = match &self { Gender::Male => "ENUM_Gender::NewEnumerator0", Gender::Female => "ENUM_Gender::NewEnumerator1", - Gender::Unknown => "ENUM_Gender::NewEnumerator2" + Gender::Unknown => "ENUM_Gender::NewEnumerator2", }; string.to_string() } -} \ No newline at end of file +} diff --git a/src/pkmn/mod.rs b/src/pkmn/mod.rs index 5ee8035..353d2eb 100644 --- a/src/pkmn/mod.rs +++ b/src/pkmn/mod.rs @@ -1,9 +1,9 @@ use serde::Serialize; -pub mod types; -pub mod natures; pub mod gender; +pub mod natures; pub mod stats; +pub mod types; #[derive(Debug, Serialize, Clone)] pub struct EnrichedMon { @@ -45,19 +45,19 @@ pub struct TotalMon { pub box_id: Option, pub pokeball: Option, pub shiny: bool, - pub is_empty: bool + pub is_empty: bool, } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] pub struct Types { pub primary: String, - pub secondary: String + pub secondary: String, } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] pub struct GridPos { pub slot: i64, - pub row: i64 + pub row: i64, } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -67,14 +67,14 @@ pub struct Stats { pub defense: f64, pub special_attack: f64, pub special_defense: f64, - pub speed: f64 + pub speed: f64, } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] pub struct Move { pub name: String, pub pp: i64, - pub max_pp: i64 + pub max_pp: i64, } impl TotalMon { @@ -90,10 +90,7 @@ impl TotalMon { types: None, nature: "".to_string(), class: "".to_string(), - grid_pos: GridPos { - slot, - row - }, + grid_pos: GridPos { slot, row }, pokemon_id: Some(0), storage_index: Some(0), box_id: Some(box_number), diff --git a/src/pkmn/natures.rs b/src/pkmn/natures.rs index ee0fc4f..04d213e 100644 --- a/src/pkmn/natures.rs +++ b/src/pkmn/natures.rs @@ -1,7 +1,7 @@ // ENUM_Natures::NewEnumerator0 hardy // 1 lonely // 2 brave -// 3 adamant +// 3 adamant // ENUM_Natures::NewEnumerator6 docile // ENUM_Natures::NewEnumerator7 relaxed // 8 impish @@ -22,8 +22,8 @@ // 23 careful // ENUM_Natures::NewEnumerator24 quirky -use std::str::FromStr; use crate::pkmn::natures::Nature::{Adamant, Brave, Docile, Hardy, Lonely}; +use std::str::FromStr; /// Returns nature as a lowercase string pub fn get_nature_from_enum(enum_str: &str) -> Option<&str> { @@ -55,35 +55,35 @@ pub fn get_nature_from_enum(enum_str: &str) -> Option<&str> { "ENUM_Natures::NewEnumerator24" => "quirky", _ => return None, }; - + Some(nature) } #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum Nature { - Hardy, // 0 - Lonely, // 1 - Brave, // 2 - Adamant, // 3 - Docile, // 6 - Relaxed, // 7 - Impish, // 8 - Lax, // 9 - Timid, // 10 - Hasty, // 11 - Serious, // 12 - Jolly, // 13 - Naive, // 14 - Modest, // 15 - Mild, // 16 - Quiet, // 17 - Bashful, // 18 - Rash, // 19 - Calm, // 20 - Gentle, // 21 - Sassy, // 22 - Careful, // 23 - Quirky, // 24 + Hardy, // 0 + Lonely, // 1 + Brave, // 2 + Adamant, // 3 + Docile, // 6 + Relaxed, // 7 + Impish, // 8 + Lax, // 9 + Timid, // 10 + Hasty, // 11 + Serious, // 12 + Jolly, // 13 + Naive, // 14 + Modest, // 15 + Mild, // 16 + Quiet, // 17 + Bashful, // 18 + Rash, // 19 + Calm, // 20 + Gentle, // 21 + Sassy, // 22 + Careful, // 23 + Quirky, // 24 } impl FromStr for Nature { @@ -94,6 +94,4 @@ impl FromStr for Nature { } } -pub enum NatureNamespace { - -} \ No newline at end of file +pub enum NatureNamespace {} diff --git a/src/pkmn/stats.rs b/src/pkmn/stats.rs index db6933b..9470e15 100644 --- a/src/pkmn/stats.rs +++ b/src/pkmn/stats.rs @@ -9,7 +9,7 @@ pub enum Stats { DEF, SATK, SDEF, - SPEED + SPEED, } impl Stats { @@ -21,8 +21,9 @@ impl Stats { Stats::DEF, Stats::SATK, Stats::SDEF, - Stats::SPEED - ].into_iter() + Stats::SPEED, + ] + .into_iter() } pub fn as_str(&self) -> &str { @@ -40,7 +41,7 @@ impl Stats { #[derive(Clone, Debug)] pub struct StatStruct { - pub values: HashMap + pub values: HashMap, } impl FromStr for Stats { @@ -67,18 +68,18 @@ pub enum IVs { DEF, SATK, SDEF, - SPEED + SPEED, } impl IVs { pub fn as_str(&self) -> &str { match self { - IVs::HP => {"HP"} - IVs::ATK => {"ATK"} - IVs::DEF => {"DEF"} - IVs::SATK => {"SATK"} - IVs::SDEF => {"SDEF"} - IVs::SPEED => {"SPEED"} + IVs::HP => "HP", + IVs::ATK => "ATK", + IVs::DEF => "DEF", + IVs::SATK => "SATK", + IVs::SDEF => "SDEF", + IVs::SPEED => "SPEED", } } pub fn iter() -> impl Iterator { @@ -88,24 +89,24 @@ impl IVs { IVs::DEF, IVs::SATK, IVs::SDEF, - IVs::SPEED - ].into_iter() + IVs::SPEED, + ] + .into_iter() } pub fn from_stat(stat: Stats) -> Option { match stat { - Stats::MaxHp => { Some(IVs::HP) } - Stats::ATK => { Some(IVs::ATK) } - Stats::DEF => { Some(IVs::DEF) } - Stats::SATK => { Some(IVs::SATK) } - Stats::SDEF => { Some(IVs::SDEF) } - Stats::SPEED => { Some(IVs::SPEED) } - _ => None + Stats::MaxHp => Some(IVs::HP), + Stats::ATK => Some(IVs::ATK), + Stats::DEF => Some(IVs::DEF), + Stats::SATK => Some(IVs::SATK), + Stats::SDEF => Some(IVs::SDEF), + Stats::SPEED => Some(IVs::SPEED), + _ => None, } } } - #[derive(Clone, Debug)] pub struct IVSpread { pub hp: i32, @@ -119,12 +120,12 @@ pub struct IVSpread { impl IVs { pub fn get_index(self) -> usize { match self { - IVs::HP => {0} - IVs::ATK => {1} - IVs::DEF => {2} - IVs::SATK => {3} - IVs::SDEF => {4} - IVs::SPEED => {5} + IVs::HP => 0, + IVs::ATK => 1, + IVs::DEF => 2, + IVs::SATK => 3, + IVs::SDEF => 4, + IVs::SPEED => 5, } } } diff --git a/src/pkmn/types.rs b/src/pkmn/types.rs index a072dae..2e841c2 100644 --- a/src/pkmn/types.rs +++ b/src/pkmn/types.rs @@ -67,7 +67,8 @@ impl FromStr for Types { } } fn get_enum_number(enum_str: &str) -> Option { - enum_str.to_string() + enum_str + .to_string() .split("::") .last() .and_then(|part| part.strip_prefix("NewEnumerator")) @@ -75,7 +76,6 @@ fn get_enum_number(enum_str: &str) -> Option { } pub fn from_enum(enum_str: &str) -> Option<&str> { - let num: i32 = get_enum_number(enum_str)?; let t = match num { 0 => "BUG", @@ -95,15 +95,11 @@ pub fn from_enum(enum_str: &str) -> Option<&str> { 18 => "FAIRY", _ => return None, }; - + Some(t) } pub enum TypeOrder { PRIMARY, - SECONDARY + SECONDARY, } - - - - diff --git a/src/property/mod.rs b/src/property/mod.rs index d36fc60..f6ac8fc 100644 --- a/src/property/mod.rs +++ b/src/property/mod.rs @@ -1 +1 @@ -pub mod traits; \ No newline at end of file +pub mod traits; diff --git a/src/property/traits.rs b/src/property/traits.rs index 7f5c7f3..eefa81d 100644 --- a/src/property/traits.rs +++ b/src/property/traits.rs @@ -3,7 +3,7 @@ use gvas::properties::struct_property::{StructProperty, StructPropertyValue}; use gvas::properties::Property; pub struct ParentProperty<'a> { - property: Option<&'a Property> + property: Option<&'a Property>, } pub trait FromProperty<'a> { @@ -29,7 +29,6 @@ pub trait StartsWith { fn get_starts_with(&self, string: &str) -> Option<&Vec>; fn get_starts_with_mut(&mut self, string: &str) -> Option<&mut Vec>; - } impl StartsWith for StructProperty { @@ -37,29 +36,31 @@ impl StartsWith for StructProperty { fn get_starts_with(&self, string: &str) -> Option<&Vec> { match &self.value { StructPropertyValue::CustomStruct { properties, .. } => { - for (k,v) in properties.0.iter() { + for (k, v) in properties.0.iter() { if k.starts_with(string) { - return Some(v) + return Some(v); } } None } - _ => None + _ => None, } } /// Returns a mutable vector of properties in a StructProperty, - fn get_starts_with_mut(& mut self, string: &str) -> Option<&mut Vec> { + fn get_starts_with_mut(&mut self, string: &str) -> Option<&mut Vec> { match &mut self.value { - StructPropertyValue::CustomStruct { ref mut properties, .. } => { - for (k,v) in properties.0.iter_mut() { + StructPropertyValue::CustomStruct { + ref mut properties, .. + } => { + for (k, v) in properties.0.iter_mut() { if k.starts_with(string) { - return Some(v) + return Some(v); } } None } - _ => None + _ => None, } } } @@ -83,8 +84,8 @@ impl PropertyPath for Property { } fn get_starts_with_mut(&mut self, prefix: &str) -> Option<&mut Property> { - if let Property::StructProperty(StructProperty { value, ..}) = self { - if let StructPropertyValue::CustomStruct { properties, ..} = value { + if let Property::StructProperty(StructProperty { value, .. }) = self { + if let StructPropertyValue::CustomStruct { properties, .. } = value { for (k, v) in properties.0.iter_mut() { if k.starts_with(prefix) { return v.first_mut(); @@ -105,32 +106,26 @@ impl NamespacedValue for Property { fn get_namespaced_value(&self, string: &str) -> Option<&String> { let prop = self.get_starts_with(string)?; let byte = match prop { - Property::ByteProperty(byte) => { - Some(byte) - } - _ => None + Property::ByteProperty(byte) => Some(byte), + _ => None, }?; match &byte.value { - BytePropertyValue::Namespaced(namespaced) => { - Some(namespaced) - } - _ => None + BytePropertyValue::Namespaced(namespaced) => Some(namespaced), + _ => None, } } fn get_namespaced_value_mut(&mut self, string: &str) -> Option<&mut String> { let prop: &mut Property = self.get_starts_with_mut(string)?; let byte = match prop { - Property::ByteProperty(ref mut byte) => { - Some(byte) - } - _ => None + Property::ByteProperty(ref mut byte) => Some(byte), + _ => None, }?; match &mut byte.value { BytePropertyValue::Namespaced(namespaced) => Some(namespaced), - _ => None + _ => None, } } } @@ -140,21 +135,17 @@ impl NamespacedValue for StructProperty { let vec = self.get_starts_with(string)?; let prop = vec.first()?; let byte = match prop { - Property::ByteProperty(byte) => { - Some(byte) - } - _ => None + Property::ByteProperty(byte) => Some(byte), + _ => None, }?; match &byte.value { - BytePropertyValue::Namespaced(namespace) => { - Some(namespace) - } - _ => None + BytePropertyValue::Namespaced(namespace) => Some(namespace), + _ => None, } } fn get_namespaced_value_mut(&mut self, string: &str) -> Option<&mut String> { todo!() } -} \ No newline at end of file +} diff --git a/src/save/mod.rs b/src/save/mod.rs index 7e8f58c..b9c70c1 100644 --- a/src/save/mod.rs +++ b/src/save/mod.rs @@ -1,20 +1,19 @@ +use gvas::game_version::GameVersion; +use gvas::properties::Property; +use gvas::GvasFile; use std::fs::File; use std::io; use std::io::Write; use std::path::PathBuf; use std::sync::{Arc, RwLock, RwLockReadGuard, RwLockWriteGuard}; -use gvas::game_version::GameVersion; -use gvas::GvasFile; -use gvas::properties::Property; -pub mod utils; pub mod pokemon; +pub mod utils; pub type SharedGvas = Arc>; pub type SharedState = Arc>; pub struct Shared(SharedState); - pub trait SharedStateExt { fn with(&self, f: impl FnOnce(&AppState) -> R) -> Option; fn with_mut(&self, f: impl FnOnce(&mut AppState) -> R) -> Option; @@ -34,10 +33,9 @@ impl SharedStateExt for SharedState { pub struct AppState { pub file_path: Option, pub gvas_file: Option, - pub json: Option + pub json: Option, } impl AppState { - pub fn empty() -> Self { Self { file_path: None, @@ -57,7 +55,7 @@ impl AppState { if let Some(path) = &self.file_path { let file: Result = File::open(path); match file { - Ok(f) => { Some(f) } + Ok(f) => Some(f), Err(_e) => { // todo!() add logging, why did it fail, etc None @@ -66,21 +64,18 @@ impl AppState { } else { None } - } pub fn load_gvas(&mut self) -> () { match self.get_file_from_path() { - Some(mut file) => { - match GvasFile::read(&mut file, GameVersion::Default) { - Ok(gvas) => { - self.gvas_file = Some(Arc::new(RwLock::new(gvas))); - }, - Err(e) => { - eprintln!("{e}"); - } + Some(mut file) => match GvasFile::read(&mut file, GameVersion::Default) { + Ok(gvas) => { + self.gvas_file = Some(Arc::new(RwLock::new(gvas))); } - } + Err(e) => { + eprintln!("{e}"); + } + }, None => {} } } @@ -95,7 +90,11 @@ impl AppState { { let mut guard = self.gvas_file.as_ref()?.write().ok()?; println!("{:?}", guard.properties.keys()); - println!("Contains key '{}': {}", &key, guard.properties.contains_key(key)); + println!( + "Contains key '{}': {}", + &key, + guard.properties.contains_key(key) + ); let prop = guard.properties.get_mut(key)?; Some(f(prop)) @@ -115,7 +114,11 @@ impl AppState { match gvas.read() { Ok(guard) => { eprintln!("Lock succeeded!"); - eprintln!("Contains key '{}': {}", key, guard.properties.contains_key(key)); + eprintln!( + "Contains key '{}': {}", + key, + guard.properties.contains_key(key) + ); if let Some(prop) = guard.properties.get(key) { Some(f(prop)) } else { @@ -130,6 +133,3 @@ impl AppState { } } } - - - diff --git a/src/save/pokemon/attack_lists.rs b/src/save/pokemon/attack_lists.rs index 31f875d..e2e38ec 100644 --- a/src/save/pokemon/attack_lists.rs +++ b/src/save/pokemon/attack_lists.rs @@ -1,12 +1,12 @@ use gvas::properties::array_property::ArrayProperty; -use gvas::properties::Property; use gvas::properties::struct_property::StructProperty; +use gvas::properties::Property; // Takes the "PartyAttackLists" property pub fn attack_array(property: &Property) -> Option<&ArrayProperty> { let cs: &ArrayProperty = match &property { Property::ArrayProperty(arr) => Some(arr), - _ => return None + _ => return None, }?; Some(cs) @@ -15,7 +15,7 @@ pub fn attack_array(property: &Property) -> Option<&ArrayProperty> { pub fn attacks_at(array: &ArrayProperty, index: usize) -> Option<&ArrayProperty> { let property: &StructProperty = match &array { ArrayProperty::Structs { structs, .. } => structs.get(index)?, - _ => return None + _ => return None, }; let (_, v) = property.value.get_custom_struct()?; @@ -24,7 +24,7 @@ pub fn attacks_at(array: &ArrayProperty, index: usize) -> Option<&ArrayProperty> let first = val.first()?; return match &first { Property::ArrayProperty(arr) => Some(arr), - _ => None + _ => None, }; } } @@ -35,16 +35,12 @@ pub fn attacks_at(array: &ArrayProperty, index: usize) -> Option<&ArrayProperty> /// Takes attacks_at custom struct. Returns the attack string pub fn attack_at(array: &ArrayProperty, index: usize) -> Option<&String> { let property = match &array { - ArrayProperty::Properties { properties, .. } => { - properties.get(index) - } + ArrayProperty::Properties { properties, .. } => properties.get(index), _ => None, }?; let object = match &property { - Property::ObjectProperty(obj) => { - obj - } + Property::ObjectProperty(obj) => obj, _ => return None, }; diff --git a/src/save/pokemon/gender.rs b/src/save/pokemon/gender.rs index 412d266..d1477b2 100644 --- a/src/save/pokemon/gender.rs +++ b/src/save/pokemon/gender.rs @@ -4,19 +4,15 @@ use gvas::properties::Property; pub fn gender_string_at(array: &ArrayProperty, index: usize) -> Option<&String> { let prop = match array { - ArrayProperty::Properties { properties, .. } => { - properties.get(index) - }, - _ => None + ArrayProperty::Properties { properties, .. } => properties.get(index), + _ => None, }?; match prop { - Property::ByteProperty(byte) => { - match &byte.value { - BytePropertyValue::Byte(_) => { None } - BytePropertyValue::Namespaced(namespace) => { Some(namespace) } - } - } - _ => None + Property::ByteProperty(byte) => match &byte.value { + BytePropertyValue::Byte(_) => None, + BytePropertyValue::Namespaced(namespace) => Some(namespace), + }, + _ => None, } -} \ No newline at end of file +} diff --git a/src/save/pokemon/iv_struct.rs b/src/save/pokemon/iv_struct.rs index dea7ec6..330a35b 100644 --- a/src/save/pokemon/iv_struct.rs +++ b/src/save/pokemon/iv_struct.rs @@ -1,14 +1,13 @@ - -use std::ops::Index; -use gvas::GvasFile; -use gvas::properties::int_property::IntProperty; -use gvas::properties::Property; -use gvas::properties::struct_property::{StructProperty, StructPropertyValue}; use crate::gvas; use crate::pkmn::stats::{IVSpread, IVs}; use crate::property::traits::StartsWith; use crate::save::pokemon::StorageType; use crate::utils::custom_struct::{get_struct_property_at_idx, get_struct_property_at_idx_mut}; +use gvas::properties::int_property::IntProperty; +use gvas::properties::struct_property::{StructProperty, StructPropertyValue}; +use gvas::properties::Property; +use gvas::GvasFile; +use std::ops::Index; pub fn get_ivs<'a>(properties: &'a StructProperty) -> Option> { match &properties.value { @@ -21,7 +20,7 @@ pub fn get_ivs<'a>(properties: &'a StructProperty) -> Option> { } Some(ivs) } - _ => None + _ => None, } } @@ -37,7 +36,7 @@ pub fn get_iv_at_mut(properties: &mut StructProperty, index: usize, ivs: IVs) -> pub struct IV<'a> { property: &'a Property, box_number: Option, - storage_type: StorageType + storage_type: StorageType, } impl<'a> IV<'a> { @@ -84,7 +83,7 @@ impl<'a> IV<'a> { pub struct IVMut<'a> { property: &'a mut Property, box_number: Option, - storage_type: StorageType + storage_type: StorageType, } impl<'a> IVMut<'a> { @@ -103,7 +102,7 @@ impl<'a> IVMut<'a> { None => { return Err("Failed to get struct property mutably.".to_string()); } - Some(prop) => {prop} + Some(prop) => prop, }; match &mut sp.value { @@ -111,21 +110,23 @@ impl<'a> IVMut<'a> { for (k, v) in properties.0.iter_mut() { if k.starts_with(iv.as_str()) { let prop: &mut Property = match v.first_mut() { - None => { return Err("Failed to get first".to_string())} - Some(prop) => {prop} + None => return Err("Failed to get first".to_string()), + Some(prop) => prop, }; match prop { Property::IntProperty(ref mut prop) => { prop.value = value; } - _ => {return Err(format!("Failed to get int: {:?}", prop));} + _ => { + return Err(format!("Failed to get int: {:?}", prop)); + } } } } } - _ => return Err("set_iv_at failed.".to_string()) + _ => return Err("set_iv_at failed.".to_string()), }; Ok(()) } -} \ No newline at end of file +} diff --git a/src/save/pokemon/mod.rs b/src/save/pokemon/mod.rs index fb7c42c..464036e 100644 --- a/src/save/pokemon/mod.rs +++ b/src/save/pokemon/mod.rs @@ -1,18 +1,18 @@ use std::cmp::PartialEq; pub mod attack_lists; +pub mod gender; +pub mod iv_struct; +pub mod pokemon_classes; pub mod pokemon_id; pub mod pokemon_info; -pub mod pokemon_classes; -pub mod shiny_list; pub mod pp_moves_lists; -pub mod iv_struct; -pub mod gender; +pub mod shiny_list; #[derive(PartialEq, Clone, Debug)] pub enum StorageType { PARTY, - BOXES + BOXES, } #[derive(Clone)] @@ -25,17 +25,16 @@ impl Default for SelectedMon { fn default() -> Self { Self { storage_type: StorageType::PARTY, - index: 0 + index: 0, } } } - impl SelectedMon { pub fn new(storage_type: StorageType, index: usize) -> SelectedMon { SelectedMon { storage_type, - index + index, } } @@ -54,4 +53,4 @@ impl SelectedMon { true } -} \ No newline at end of file +} diff --git a/src/save/pokemon/pokemon_classes.rs b/src/save/pokemon/pokemon_classes.rs index 8c306af..8822be4 100644 --- a/src/save/pokemon/pokemon_classes.rs +++ b/src/save/pokemon/pokemon_classes.rs @@ -1,37 +1,31 @@ -use gvas::GvasFile; use gvas::properties::array_property::ArrayProperty; use gvas::properties::Property; +use gvas::GvasFile; -pub fn class_at(array: &ArrayProperty, idx: usize) -> Option<&String>{ +pub fn class_at(array: &ArrayProperty, idx: usize) -> Option<&String> { let class_property = match &array { - ArrayProperty::Properties { properties, .. } => { - properties.get(idx)? - }, - _ => return None + ArrayProperty::Properties { properties, .. } => properties.get(idx)?, + _ => return None, }; match &class_property { - Property::ObjectProperty(prop) => { - Some(&prop.value) - } - _ => None + Property::ObjectProperty(prop) => Some(&prop.value), + _ => None, } } /// Probably shouldn't be used, at least not until an enum for every class is written... pub fn class_at_mut(array: &mut ArrayProperty, idx: usize) -> Option<&mut String> { let class_property: &mut Property = match array { - ArrayProperty::Properties { ref mut properties, .. } => { - properties.get_mut(idx)? - } - _ => return None + ArrayProperty::Properties { + ref mut properties, .. + } => properties.get_mut(idx)?, + _ => return None, }; match class_property { - Property::ObjectProperty(ref mut prop) => { - Some(&mut prop.value) - }, - _ => None + Property::ObjectProperty(ref mut prop) => Some(&mut prop.value), + _ => None, } } @@ -48,9 +42,8 @@ pub fn parse_class(class: &str) -> Option { Some(name) } - pub struct PokemonClasses<'a> { - property: &'a Property + property: &'a Property, } impl<'a> PokemonClasses<'a> { @@ -69,4 +62,4 @@ impl<'a> PokemonClasses<'a> { pub fn parse_class(&self, class: &str) -> Option { parse_class(class) } -} \ No newline at end of file +} diff --git a/src/save/pokemon/pokemon_id.rs b/src/save/pokemon/pokemon_id.rs index 2338e1f..4d500a4 100644 --- a/src/save/pokemon/pokemon_id.rs +++ b/src/save/pokemon/pokemon_id.rs @@ -13,7 +13,7 @@ pub fn id_array_mut(property: &mut Property) -> Option<&mut ArrayProperty> { pub fn id_at(array: &ArrayProperty, index: usize) -> Option<&i32> { match array { ArrayProperty::Ints { ints, .. } => ints.get(index), - _ => None + _ => None, } } @@ -23,4 +23,4 @@ pub fn id_at_mut(array: &mut ArrayProperty, index: usize) -> Option<&mut i32> { pub struct PokemonID; -impl PokemonID {} \ No newline at end of file +impl PokemonID {} diff --git a/src/save/pokemon/pokemon_info.rs b/src/save/pokemon/pokemon_info.rs index b1ad455..0102c1a 100644 --- a/src/save/pokemon/pokemon_info.rs +++ b/src/save/pokemon/pokemon_info.rs @@ -1,27 +1,25 @@ -use std::collections::HashMap; -use std::fmt::format; -use gvas::GvasFile; +use crate::logger::Logger; +use crate::pkmn::stats::{StatStruct, Stats}; +use crate::property::traits::{NamespacedValue, PropertyPath, StartsWith}; +use crate::utils::custom_struct::{ + get_struct_at_idx, get_struct_at_idx_mut, get_struct_property_at_idx, CustomStruct, +}; use gvas::properties::array_property::ArrayProperty; use gvas::properties::int_property::BytePropertyValue; -use gvas::properties::Property; -use gvas::properties::struct_property::{StructProperty}; +use gvas::properties::struct_property::StructProperty; use gvas::properties::text_property::FTextHistory; +use gvas::properties::Property; +use gvas::GvasFile; use rfd::MessageDialogResult::No; -use crate::logger::Logger; -use crate::pkmn::stats::{StatStruct, Stats}; -use crate::property::traits::{NamespacedValue, PropertyPath, StartsWith}; -use crate::utils::custom_struct::{get_struct_at_idx, get_struct_at_idx_mut, get_struct_property_at_idx, CustomStruct}; +use std::collections::HashMap; +use std::fmt::format; pub fn get_is_fainted(struct_property: &StructProperty) -> Option { - let is_fainted: &Vec = struct_property.get_starts_with("isFainted")?; let first: &Property = is_fainted.first()?; match first { - - Property::BoolProperty(bool) => { - Some(bool.value) - } - _ => None + Property::BoolProperty(bool) => Some(bool.value), + _ => None, } } @@ -71,10 +69,8 @@ pub fn get_stat(properties: &StructProperty, stat: Stats) -> Option { let stat_str: &str = stat.as_str(); let stat_property = properties.get_starts_with(stat_str)?.first()?; match &stat_property { - Property::DoubleProperty(double) => { - Some(double.value.0) - } - _ => None + Property::DoubleProperty(double) => Some(double.value.0), + _ => None, } } @@ -93,7 +89,6 @@ pub fn get_stat_mut(properties: &mut StructProperty, stat: Stats) -> Option<&mut val } - pub fn get_stats(properties: &StructProperty) -> Option { fn get_value(props: &StructProperty, stat: Stats) -> Option { let name = stat.as_str(); @@ -112,9 +107,7 @@ pub fn get_stats(properties: &StructProperty) -> Option { map.insert(stat.clone(), get_value(properties, stat)?); } - Some(StatStruct { - values: map - }) + Some(StatStruct { values: map }) } pub fn get_level(properties: &StructProperty) -> Option { @@ -122,10 +115,8 @@ pub fn get_level(properties: &StructProperty) -> Option { let level_prop = vec.first()?; match level_prop { - Property::IntProperty(int) => { - Some(int.value) - } - _ => None + Property::IntProperty(int) => Some(int.value), + _ => None, } } @@ -134,22 +125,16 @@ pub fn get_name(properties: &StructProperty) -> Option<&String> { let name_prop = vec.first()?; let history = match name_prop { - Property::TextProperty(text) => { - Some(&text.value.history) - } - _ => None + Property::TextProperty(text) => Some(&text.value.history), + _ => None, }?; let source_string = match history { - FTextHistory::Base { source_string, .. } => { - match source_string { - None => None, - Some(str) => { - Some(str) - } - } - } - _ => return None + FTextHistory::Base { source_string, .. } => match source_string { + None => None, + Some(str) => Some(str), + }, + _ => return None, }; source_string @@ -160,7 +145,11 @@ pub fn get_name_mut(properties: &mut StructProperty) -> Option<&mut String> { let name_prop = vec.first_mut()?; if let Property::TextProperty(text) = name_prop { - if let FTextHistory::Base { source_string: Some(ref mut s), .. } = &mut text.value.history { + if let FTextHistory::Base { + source_string: Some(ref mut s), + .. + } = &mut text.value.history + { return Some(s); } } @@ -175,14 +164,12 @@ pub fn get_nature<'a>(properties: &StructProperty) -> Option<&String> { match nature_prop { Property::ByteProperty(byte) => { let val = &byte.value; - match &val { - BytePropertyValue::Namespaced(namespace) => { - Some(namespace) - } - _ => None + match &val { + BytePropertyValue::Namespaced(namespace) => Some(namespace), + _ => None, } } - _ => None + _ => None, } } @@ -199,20 +186,16 @@ pub fn get_nature_string(properties: &StructProperty) -> Option<&String> { properties.get_namespaced_value("Nature") } - pub struct PokemonInfo<'a> { /// The actual property containing isFainted, IVs, name, etc. property: &'a Property, - } impl<'a> PokemonInfo<'a> { /// Todo: turn this into a trait pub fn new_party(gvas_file: &'a GvasFile) -> Option { let prop = gvas_file.properties.get("PartyPokemonInfo")?; - Some(Self { - property: prop - }) + Some(Self { property: prop }) } pub fn get_name(&self, index: usize) -> Option<&String> { @@ -250,12 +233,9 @@ pub struct PokemonInfoMut<'a> { } impl<'a> PokemonInfoMut<'a> { - pub fn new_party(gvas_file: &'a mut GvasFile) -> Option { let prop = gvas_file.properties.get_mut("PartyPokemonInfo")?; - Some(Self { - property: prop - }) + Some(Self { property: prop }) } pub fn set_stat(&mut self, index: usize, stat: Stats, value: f64) { @@ -274,4 +254,3 @@ impl<'a> PokemonInfoMut<'a> { } } } - diff --git a/src/save/pokemon/pp_moves_lists.rs b/src/save/pokemon/pp_moves_lists.rs index ba88a11..7264dbb 100644 --- a/src/save/pokemon/pp_moves_lists.rs +++ b/src/save/pokemon/pp_moves_lists.rs @@ -1,6 +1,6 @@ use gvas::properties::array_property::ArrayProperty; -use gvas::properties::Property; use gvas::properties::struct_property::{StructProperty, StructPropertyValue}; +use gvas::properties::Property; use indexmap::IndexMap; pub fn moves_array(property: &Property) -> Option<&ArrayProperty> { @@ -21,12 +21,10 @@ pub fn moves_at(array: &ArrayProperty, index: usize) -> Option<&ArrayProperty> { _ => return None, }; - properties - .values() - .find_map(|v| match v.first()? { - Property::ArrayProperty(arr) => Some(arr), - _ => None, - }) + properties.values().find_map(|v| match v.first()? { + Property::ArrayProperty(arr) => Some(arr), + _ => None, + }) } /// Gets max pp at an index @@ -34,27 +32,27 @@ pub fn moves_at(array: &ArrayProperty, index: usize) -> Option<&ArrayProperty> { pub fn max_pp_at(moves: &ArrayProperty, index: usize) -> Option<&i32> { let pp_struct: &StructProperty = match &moves { ArrayProperty::Structs { structs, .. } => structs.get(index)?, - _ => return None + _ => return None, }; let map: &IndexMap> = pp_struct.value.get_custom_struct()?.1; - let prop: &Property = map.iter() - .find(|(k,_)| k.starts_with("MaxPP")) - .and_then(|(_,v)| v.first())?; + let prop: &Property = map + .iter() + .find(|(k, _)| k.starts_with("MaxPP")) + .and_then(|(_, v)| v.first())?; Some(&prop.get_int()?.value) } pub fn current_pp_at(moves: &ArrayProperty, index: usize) -> Option<&i32> { let pp_struct: &StructProperty = match &moves { ArrayProperty::Structs { structs, .. } => structs.get(index)?, - _ => return None + _ => return None, }; let map: &IndexMap> = pp_struct.value.get_custom_struct()?.1; // Typo "Curremt" is intentional, it's like that in the file... - let prop: &Property = map.iter() - .find(|(k,_)| k.starts_with("CurremtPP")) - .and_then(|(_,v)| v.first())?; + let prop: &Property = map + .iter() + .find(|(k, _)| k.starts_with("CurremtPP")) + .and_then(|(_, v)| v.first())?; Some(&prop.get_int()?.value) } pub struct PPMovesLists; - - diff --git a/src/save/pokemon/shiny_list.rs b/src/save/pokemon/shiny_list.rs index 2fa4bda..6527c81 100644 --- a/src/save/pokemon/shiny_list.rs +++ b/src/save/pokemon/shiny_list.rs @@ -4,34 +4,24 @@ use gvas::properties::struct_property::{StructProperty, StructPropertyValue}; use gvas::properties::Property; use gvas::GvasFile; -pub fn get_shiny_list(array: &ArrayProperty) -> Option<&Vec>{ +pub fn get_shiny_list(array: &ArrayProperty) -> Option<&Vec> { match array { - ArrayProperty::Bools { bools } => { - Some(bools) - } - _ => None + ArrayProperty::Bools { bools } => Some(bools), + _ => None, } } pub fn get_shiny_at(array: &ArrayProperty, index: usize) -> Option<&bool> { match array { - ArrayProperty::Bools { bools } => { - bools.get(index) - } - _ => { - None - } + ArrayProperty::Bools { bools } => bools.get(index), + _ => None, } } pub fn get_shiny_at_mut(array: &mut ArrayProperty, index: usize) -> Option<&mut bool> { match array { - ArrayProperty::Bools { ref mut bools } => { - bools.get_mut(index) - } - _ => { - None - } + ArrayProperty::Bools { ref mut bools } => bools.get_mut(index), + _ => None, } } @@ -46,16 +36,14 @@ pub fn set_shiny_at(array: &mut ArrayProperty, index: usize, value: bool) -> boo } pub struct ShinyList<'a> { - pub property: &'a Property + pub property: &'a Property, } impl<'a> ShinyList<'a> { pub fn new_party(gvas_file: &'a GvasFile) -> Option { - let prop = match gvas_file.properties.get("PartyShinyList"){ - None => {None} - Some(p) => { - Some(Self { property: p }) - } + let prop = match gvas_file.properties.get("PartyShinyList") { + None => None, + Some(p) => Some(Self { property: p }), }; prop @@ -79,18 +67,18 @@ impl<'a> ShinyList<'a> { } pub struct ShinyListMut<'a> { - property: &'a mut Property + property: &'a mut Property, } impl<'a> ShinyListMut<'a> { pub fn new_party(gvas_file: &'a mut GvasFile) -> Option { let property: &mut Property = match gvas_file.properties.get_mut("PartyShinyList") { - None => {return None;} - Some(p) => {p} + None => { + return None; + } + Some(p) => p, }; - Some(Self { - property - }) + Some(Self { property }) } pub fn set_shiny_at(&mut self, index: usize, value: bool) -> Result<(), String> { @@ -100,10 +88,13 @@ impl<'a> ShinyListMut<'a> { *shiny = value; Ok(()) } else { - Err(format!("Failed to set shiny at index {} (does it exist?)", index)) + Err(format!( + "Failed to set shiny at index {} (does it exist?)", + index + )) } } - _ => { Err(format!("Failed to set shiny at index {}", index)) } + _ => Err(format!("Failed to set shiny at index {}", index)), } } -} \ No newline at end of file +} diff --git a/src/save/utils.rs b/src/save/utils.rs index 701a337..5cb4fa2 100644 --- a/src/save/utils.rs +++ b/src/save/utils.rs @@ -2,25 +2,44 @@ use serde_json::Value; use std::collections::HashMap; pub fn get_f64(info: &HashMap, prefix: &str) -> Option { - info.iter().find(|(k, _)| k.starts_with(prefix))?.1.get(0)?.get("value")?.as_f64() + info.iter() + .find(|(k, _)| k.starts_with(prefix))? + .1 + .get(0)? + .get("value")? + .as_f64() } pub fn get_i64(info: &HashMap, prefix: &str) -> Option { - info.iter().find(|(k, _)| k.starts_with(prefix))?.1.get(0)?.get("value")?.as_i64() + info.iter() + .find(|(k, _)| k.starts_with(prefix))? + .1 + .get(0)? + .get("value")? + .as_i64() } pub fn get_namespaced(info: &HashMap, prefix: &str) -> Option { - info.iter().find(|(k, _)| k.starts_with(prefix))? - .1.get(0)?.get("Namespaced")?.as_str().map(String::from) + info.iter() + .find(|(k, _)| k.starts_with(prefix))? + .1 + .get(0)? + .get("Namespaced")? + .as_str() + .map(String::from) } - pub fn get_name(info: &HashMap) -> Option { - info.iter().find(|(k, _)| k.starts_with("Name_"))? - .1.get(0)?.get("source_string")?.as_str().map(String::from) + info.iter() + .find(|(k, _)| k.starts_with("Name_"))? + .1 + .get(0)? + .get("source_string")? + .as_str() + .map(String::from) } -pub fn get_box_key(box_number: i64) -> Option{ +pub fn get_box_key(box_number: i64) -> Option { Option::from(format!("Box{}", box_number)) } @@ -34,7 +53,10 @@ pub fn get_first_starts_with<'a>( } // get the key name that starts with prefix -pub fn get_starts_with(prefix: String, map: &serde_json::Map) -> Option { +pub fn get_starts_with( + prefix: String, + map: &serde_json::Map, +) -> Option { for key in map.keys() { if key.starts_with(&prefix) { return Some(key.clone()); @@ -49,4 +71,4 @@ pub fn match_bool(string: &str) -> Option { "false" => Some(false), _ => None, } -} \ No newline at end of file +} diff --git a/src/ui/image.rs b/src/ui/image.rs index 5cfebf6..0b59cac 100644 --- a/src/ui/image.rs +++ b/src/ui/image.rs @@ -1,8 +1,8 @@ -use std::collections::HashMap; +use crate::app::Asset; use crate::save::pokemon::StorageType; use crate::ui::screen::render_pokemon_path; use egui::{Color32, ColorImage, Context, TextureHandle, Vec2}; -use crate::app::Asset; +use std::collections::HashMap; #[derive(Clone)] pub struct ImageContainer { @@ -10,7 +10,7 @@ pub struct ImageContainer { pub storage_type: StorageType, pub index: usize, pub name: String, - pub is_shiny: bool + pub is_shiny: bool, } impl ImageContainer { @@ -42,7 +42,7 @@ pub struct ImageCache { impl ImageCache { pub fn new() -> Self { Self { - map: HashMap::new() + map: HashMap::new(), } } @@ -72,4 +72,4 @@ impl ImageCache { }); list } -} \ No newline at end of file +} diff --git a/src/ui/menu/buttons.rs b/src/ui/menu/buttons.rs index eb70746..b13fc43 100644 --- a/src/ui/menu/buttons.rs +++ b/src/ui/menu/buttons.rs @@ -1,7 +1,7 @@ -use std::io; -use std::process::{Child, Command}; use crate::logger::Logger; use crate::ui::menu::{MenuButton, OnClick}; +use std::io; +use std::process::{Child, Command}; pub struct DiscordButton; @@ -50,4 +50,4 @@ impl OnClick for DiscordButton { .spawn(); } } -} \ No newline at end of file +} diff --git a/src/ui/menu/discord.rs b/src/ui/menu/discord.rs index e69de29..8b13789 100644 --- a/src/ui/menu/discord.rs +++ b/src/ui/menu/discord.rs @@ -0,0 +1 @@ + diff --git a/src/ui/menu/mod.rs b/src/ui/menu/mod.rs index fac6ae6..aa94f0e 100644 --- a/src/ui/menu/mod.rs +++ b/src/ui/menu/mod.rs @@ -1,20 +1,19 @@ -use std::fs::File; -use std::path::{Path, PathBuf}; -use std::process::Command; -use egui::containers::menu; -use egui::{Context, ViewportCommand}; -use gvas::error::Error; -use gvas::game_version::GameVersion; -use gvas::GvasFile; use crate::app::App; use crate::logger::Logger; use crate::ui::menu::buttons::DiscordButton; use crate::ui::screen::party_screen::PartyScreen; use crate::ui::screen::Screen; +use egui::containers::menu; +use egui::{Context, ViewportCommand}; +use gvas::error::Error; +use gvas::game_version::GameVersion; +use gvas::GvasFile; +use std::fs::File; +use std::path::{Path, PathBuf}; +use std::process::Command; -pub mod discord; mod buttons; - +pub mod discord; pub trait MenuButton { fn get_identifier(&self) -> String; @@ -36,74 +35,72 @@ pub trait OnChange { pub fn render_menu_bar(ctx: &Context, state: &mut App) { egui::TopBottomPanel::top("menu_bar").show(ctx, |ui| { - menu::MenuBar::new().ui(ui, |ui| { - ui.menu_button("File", |ui| { - if ui.button("Open").clicked() { - let dialog = rfd::FileDialog::new() - .add_filter("Save files", &["sav"]) - .pick_file(); - - let path: PathBuf = match dialog { - None => { return } - Some(path) => { - path - } - }; - let mut file: File = match File::open(path) { - Ok(f) => { f } - Err(error) => { - Logger::error(error.to_string()); - return; - } - }; + menu::MenuBar::new().ui(ui, |ui| { + ui.menu_button("File", |ui| { + if ui.button("Open").clicked() { + let dialog = rfd::FileDialog::new() + .add_filter("Save files", &["sav"]) + .pick_file(); - let gvas: GvasFile = match GvasFile::read(&mut file, GameVersion::Default) { - Ok(res) => { - res - } - Err(error) => { - Logger::error(String::from(format!("Failed to read gvas file: {}", error))); - return - } - }; + let path: PathBuf = match dialog { + None => return, + Some(path) => path, + }; + let mut file: File = match File::open(path) { + Ok(f) => f, + Err(error) => { + Logger::error(error.to_string()); + return; + } + }; - match state.load_save(gvas) { - Ok(_) => { - Logger::info("Save loaded successfully"); - } - Err(e) => { - Logger::error(e); - } - } + let gvas: GvasFile = match GvasFile::read(&mut file, GameVersion::Default) { + Ok(res) => res, + Err(error) => { + Logger::error(String::from(format!( + "Failed to read gvas file: {}", + error + ))); + return; + } + }; - state.set_screen(Screen::Party(PartyScreen { - loaded: false, - containers: vec![], - })); + match state.load_save(gvas) { + Ok(_) => { + Logger::info("Save loaded successfully"); + } + Err(e) => { + Logger::error(e); + } + } - } + state.set_screen(Screen::Party(PartyScreen { + loaded: false, + containers: vec![], + })); + } - if ui.button("Save").clicked() { - let res = App::save_to(); - match res { - Ok(_) => { - Logger::info("Saved successfully"); - } - Err(s) => { - Logger::error(format!("Failed to save: {}", s)); - } - }; - } - if ui.button("Quit").clicked() { - ui.ctx().send_viewport_cmd(ViewportCommand::Close); - } - }); - ui.menu_button("Help", |ui| { - let discord = DiscordButton::new(); - if ui.button(discord.display()).clicked() { - discord.on_click(); - } - }); - }); + if ui.button("Save").clicked() { + let res = App::save_to(); + match res { + Ok(_) => { + Logger::info("Saved successfully"); + } + Err(s) => { + Logger::error(format!("Failed to save: {}", s)); + } + }; + } + if ui.button("Quit").clicked() { + ui.ctx().send_viewport_cmd(ViewportCommand::Close); + } + }); + ui.menu_button("Help", |ui| { + let discord = DiscordButton::new(); + if ui.button(discord.display()).clicked() { + discord.on_click(); + } + }); + }); }); } diff --git a/src/ui/mod.rs b/src/ui/mod.rs index 0a20f1b..20e9e09 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -1,12 +1,12 @@ -use egui::{Color32, Image, TextureHandle, Vec2}; -use egui::load::SizedTexture; -use rust_embed::EmbeddedFile; use crate::app::Asset; use crate::ui::image::ImageContainer; +use egui::load::SizedTexture; +use egui::{Color32, Image, TextureHandle, Vec2}; +use rust_embed::EmbeddedFile; -pub mod screen; -pub mod menu; pub(crate) mod image; +pub mod menu; +pub mod screen; fn render_image<'a>(path: String) -> Image<'a> { Image::new(path) @@ -32,6 +32,7 @@ pub fn render_texture(texture: &TextureHandle) -> Image { Image::new(SizedTexture { id: texture.id(), size: Vec2::new(64.0, 64.0), - }).corner_radius(5) - .bg_fill(Color32::from_rgb(50, 50, 50)) -} \ No newline at end of file + }) + .corner_radius(5) + .bg_fill(Color32::from_rgb(50, 50, 50)) +} diff --git a/src/ui/screen/home_screen.rs b/src/ui/screen/home_screen.rs index 14953d1..0df7a05 100644 --- a/src/ui/screen/home_screen.rs +++ b/src/ui/screen/home_screen.rs @@ -1,18 +1,16 @@ -use egui::Ui; -use gvas::GvasFile; use crate::app::App; use crate::ui::screen::{ScreenAction, ScreenTrait}; +use egui::Ui; +use gvas::GvasFile; #[derive(Clone, Debug)] pub struct HomeScreen; impl ScreenTrait for HomeScreen { - fn load(&mut self, app: &mut App) { - - } + fn load(&mut self, app: &mut App) {} fn ui(&mut self, ui: &mut Ui, app: &mut App) -> ScreenAction { ui.heading("Please load a save to begin"); ScreenAction::None } -} \ No newline at end of file +} diff --git a/src/ui/screen/mod.rs b/src/ui/screen/mod.rs index 79abdd8..178d9fd 100644 --- a/src/ui/screen/mod.rs +++ b/src/ui/screen/mod.rs @@ -2,13 +2,13 @@ pub mod home_screen; pub mod party_screen; pub(crate) mod single_screen; -use std::fmt::format; use crate::app::App; use crate::logger::Logger; +use crate::ui::screen::home_screen::HomeScreen; +use egui::{CentralPanel, Ui}; use party_screen::PartyScreen; use single_screen::SingleScreen; -use egui::{CentralPanel, Ui}; -use crate::ui::screen::home_screen::HomeScreen; +use std::fmt::format; #[derive(Clone)] pub enum Screen { @@ -37,22 +37,21 @@ impl ScreenTrait for Screen { pub enum ScreenState { Party(PartyScreen), - Empty() + Empty(), } - pub enum ScreenAction { None, ChangeTo(Screen), - Reload + Reload, } impl ScreenAction { pub fn as_str(&self) -> &str { match self { - ScreenAction::None => {"None"} - ScreenAction::ChangeTo(_) => {"ChangeTo"} - ScreenAction::Reload => {"Reload"} + ScreenAction::None => "None", + ScreenAction::ChangeTo(_) => "ChangeTo", + ScreenAction::Reload => "Reload", } } } @@ -60,8 +59,8 @@ impl ScreenAction { impl ScreenState { pub fn name(&self) -> &str { match self { - ScreenState::Party(_) => {"Party"} - _ => "" + ScreenState::Party(_) => "Party", + _ => "", } } } @@ -76,14 +75,15 @@ impl Screen { pub fn iter() -> impl Iterator { [ // we dont want Single in here - ].into_iter() + ] + .into_iter() } pub fn as_str(&self) -> &str { match &self { - Screen::Party(PartyScreen) => {"Party"} - Screen::Single(SingleScreen) => {"Single"} - Screen::Home(HomeScreen) => {"Home"} + Screen::Party(PartyScreen) => "Party", + Screen::Single(SingleScreen) => "Single", + Screen::Home(HomeScreen) => "Home", } } } @@ -108,13 +108,10 @@ pub fn get_images_path() -> String { } pub fn render_screen(app_state: &mut App, ctx: &egui::Context) { - CentralPanel::default().show(ctx, |ui| { let mut action: ScreenAction = ScreenAction::None; - if app_state.is_save_loaded() { + if app_state.is_save_loaded() {} - } - action = match &mut app_state.clone().screen { Screen::Home(s) => s.ui(ui, app_state), Screen::Party(s) => s.ui(ui, app_state), diff --git a/src/ui/screen/party_screen.rs b/src/ui/screen/party_screen.rs index d971c8b..0d79a16 100644 --- a/src/ui/screen/party_screen.rs +++ b/src/ui/screen/party_screen.rs @@ -1,17 +1,17 @@ -use std::ops::Deref; use crate::app::{App, GVAS_FILE}; use crate::logger::Logger; use crate::save::pokemon::pokemon_classes::{class_at, parse_class}; use crate::save::pokemon::shiny_list::get_shiny_list; use crate::save::pokemon::{SelectedMon, StorageType}; +use crate::ui::image::ImageContainer; use crate::ui::render_image; -use crate::ui::screen::{render_pokemon_path, Screen, ScreenAction, ScreenTrait}; use crate::ui::screen::single_screen::{SingleScreen, SingleScreenBuffer}; +use crate::ui::screen::{render_pokemon_path, Screen, ScreenAction, ScreenTrait}; use crate::utils::set_data_persisted; use egui::{CursorIcon, Direction, Layout, Response, RichText, Sense, TextBuffer, Ui}; use gvas::properties::Property; use gvas::GvasFile; -use crate::ui::image::ImageContainer; +use std::ops::Deref; #[derive(Clone)] pub struct PartyScreen { @@ -24,7 +24,7 @@ impl ScreenTrait for PartyScreen { if self.loaded { return; } - + let gvas_file: &GvasFile = match app.gvas_file.as_ref() { Some(file) => &file.read().unwrap().to_owned(), None => return, @@ -40,7 +40,12 @@ impl ScreenTrait for PartyScreen { n } }; - let arr = gvas_file.properties.get("PartyShinyList").unwrap().get_array().unwrap(); + let arr = gvas_file + .properties + .get("PartyShinyList") + .unwrap() + .get_array() + .unwrap(); let shiny_vec = get_shiny_list(arr).unwrap(); let mut container_vec: Vec = Vec::new(); @@ -51,22 +56,28 @@ impl ScreenTrait for PartyScreen { } self.containers = container_vec; - } fn ui(&mut self, ui: &mut Ui, app: &mut App) -> ScreenAction { - let mut action: ScreenAction = ScreenAction::None; ui.centered_and_justified(|ui| { egui::Grid::new("party-grid").show(ui, |ui| { if GVAS_FILE.get().is_none() { - ui.with_layout(Layout::centered_and_justified(Direction::LeftToRight), |ui| { - let text: RichText = RichText::new("Party not found. Please load a save file to continue.").size(24.0); - ui.add_sized([ui.available_width(), 24.0],egui::Label::new(text)); - }); + ui.with_layout( + Layout::centered_and_justified(Direction::LeftToRight), + |ui| { + let text: RichText = RichText::new( + "Party not found. Please load a save file to continue.", + ) + .size(24.0); + ui.add_sized([ui.available_width(), 24.0], egui::Label::new(text)); + }, + ); } for container in self.containers.iter() { - let res: Response = ui.add(render_image(container.path.clone())).interact(Sense::click()); + let res: Response = ui + .add(render_image(container.path.clone())) + .interact(Sense::click()); if res.clicked() { Logger::info_once(format!("{} Clicked!", container.name)); @@ -101,19 +112,15 @@ impl ScreenTrait for PartyScreen { pub fn get_names(gvas_file: &GvasFile) -> Option> { let prop: &Property = match gvas_file.properties.get("PartyPokemonClasses") { - None => {return None} - Some(p) => {p} + None => return None, + Some(p) => p, }; let arr = prop.get_array()?; let mut class_vec: Vec = Vec::new(); for i in 0..5 { let class = match class_at(&arr, i) { - None => { - continue - } - Some(c) => { - c - } + None => continue, + Some(c) => c, }; class_vec.push(class.clone()); } @@ -121,10 +128,10 @@ pub fn get_names(gvas_file: &GvasFile) -> Option> { let mut vec: Vec = Vec::new(); for i in class_vec.iter() { let parsed: String = match parse_class(i.as_str()) { - None => {"".to_string()} - Some(c) => {c} + None => "".to_string(), + Some(c) => c, }; vec.push(parsed) } Some(vec) -} \ No newline at end of file +} diff --git a/src/ui/screen/single_screen.rs b/src/ui/screen/single_screen.rs index 7131c3a..d6f5af1 100644 --- a/src/ui/screen/single_screen.rs +++ b/src/ui/screen/single_screen.rs @@ -3,24 +3,24 @@ use crate::logger::Logger; use crate::pkmn::stats::{IVSpread, IVs, StatStruct, Stats}; use crate::save::pokemon::iv_struct::IVMut; use crate::save::pokemon::iv_struct::IV; +use crate::save::pokemon::pokemon_classes::{parse_class, PokemonClasses}; use crate::save::pokemon::pokemon_info::{InfoStruct, PokemonInfo, PokemonInfoMut}; use crate::save::pokemon::shiny_list::{ShinyList, ShinyListMut}; +use crate::save::pokemon::StorageType; +use crate::ui::image::ImageContainer; use crate::ui::screen::{get_images_path, render_pokemon_path, Reload, ScreenAction, ScreenTrait}; +use crate::ui::{render_image_container, render_texture}; use crate::{try_gvas_read, try_gvas_write, unwrap_gvas}; +use eframe::emath::Vec2; +use eframe::epaint::Color32; +use egui::Shape::Path; use egui::{Button, Image, Response, RichText, Sense, TextEdit, Ui}; use egui_extras::{Column, TableBuilder, TableRow}; use gvas::GvasFile; +use rfd::MessageDialogResult::No; use std::collections::HashMap; use std::fmt::format; use std::sync::RwLockWriteGuard; -use eframe::emath::Vec2; -use eframe::epaint::Color32; -use egui::Shape::Path; -use rfd::MessageDialogResult::No; -use crate::save::pokemon::pokemon_classes::{parse_class, PokemonClasses}; -use crate::save::pokemon::StorageType; -use crate::ui::image::ImageContainer; -use crate::ui::{render_image_container, render_texture}; #[derive(Clone, Debug)] pub struct SingleScreen { @@ -46,12 +46,11 @@ pub struct SingleMon { ivs: IVSpread, } - #[derive(Default, Clone, Debug)] pub struct SingleScreenBuffer { pub pokemon_info: Option, pub is_shiny: Option, - pub ivs: Option> + pub ivs: Option>, } impl SingleScreenBuffer { @@ -67,17 +66,18 @@ impl SingleScreenBuffer { impl SingleScreen { fn render_row(&mut self, row: &mut TableRow, stat: Stats) -> ScreenAction { let mon: SingleMon = match self.mon_data.clone() { - None => {return ScreenAction::None;} - Some(mon) => {mon} + None => { + return ScreenAction::None; + } + Some(mon) => mon, }; - fn get_stat(mon: &SingleMon, stat: Stats) -> Option { match try_gvas_read!(GVAS_FILE) { None => {} Some(gvas_file) => { if let Some(party) = PokemonInfo::new_party(&*gvas_file) { - return party.get_stat(mon.index, stat) + return party.get_stat(mon.index, stat); } } } @@ -112,34 +112,38 @@ impl SingleScreen { row.col(|ui| { // todo!() CACHE ALL THIS ON LOAD, GET, AND SET! THEN AFTER CHANGES, TAKE NEW VALUE! fn create(ui: &mut Ui, mon: &SingleMon, iv: IVs) -> ScreenAction { - let current_iv_guard: Option = { - get_iv(mon, iv.clone()) + let current_iv_guard: Option = { get_iv(mon, iv.clone()) }; + let Some(current_iv) = current_iv_guard else { + return ScreenAction::None; }; - let Some(current_iv) = current_iv_guard else { return ScreenAction::None; }; let mut display: String = current_iv.to_string(); let text_edit: TextEdit = TextEdit::singleline(&mut display); let res: Response = ui.add(text_edit); - - if res.changed() { let mut guard: RwLockWriteGuard = match try_gvas_write!(GVAS_FILE) { - None => {return ScreenAction::None} - Some(g) => {g} + None => return ScreenAction::None, + Some(g) => g, }; - let gvas= &mut *guard; + let gvas = &mut *guard; Logger::info("Res changed"); if let Ok(val) = display.parse::() { if let Some(mut info) = IVMut::new_party(gvas) { match info.set_iv_at(mon.index, iv.clone(), val) { Ok(_) => {} - Err(e) => {Logger::error(e.to_string());} + Err(e) => { + Logger::error(e.to_string()); + } }; let ivs = IV::new_party(&gvas).unwrap(); - Logger::info(format!("Updated iv: {} to: {:?}", iv.clone().as_str(), ivs.get_iv_at(mon.index, iv.clone()).unwrap())); - return ScreenAction::Reload + Logger::info(format!( + "Updated iv: {} to: {:?}", + iv.clone().as_str(), + ivs.get_iv_at(mon.index, iv.clone()).unwrap() + )); + return ScreenAction::Reload; } } } @@ -150,7 +154,9 @@ impl SingleScreen { let act: ScreenAction = create(ui, &mon.clone(), iv.clone()); match act { ScreenAction::None => {} - other => { action = other; } + other => { + action = other; + } } } else { ui.add_enabled(false, TextEdit::singleline(&mut String::new())); @@ -158,20 +164,20 @@ impl SingleScreen { }); row.col(|ui| { fn create(ui: &mut Ui, mon: &SingleMon, stat: Stats) -> ScreenAction { - let current_stat_guard: Option = { - get_stat(mon, stat.clone()) + let current_stat_guard: Option = { get_stat(mon, stat.clone()) }; + let Some(current_stat) = current_stat_guard else { + return ScreenAction::None; }; - let Some(current_stat) = current_stat_guard else { return ScreenAction::None; }; let mut display: String = current_stat.to_string(); let text_edit: TextEdit = TextEdit::singleline(&mut display); let res: Response = ui.add(text_edit); let mut guard: RwLockWriteGuard = match try_gvas_write!(GVAS_FILE) { - None => {return ScreenAction::None} - Some(g) => {g} + None => return ScreenAction::None, + Some(g) => g, }; - let gvas= &mut *guard; + let gvas = &mut *guard; if res.changed() { Logger::info("Res changed"); @@ -180,8 +186,12 @@ impl SingleScreen { info.set_stat(mon.index, stat.clone(), val); let info_read = PokemonInfo::new_party(&gvas).unwrap(); - Logger::info(format!("Updated stat: {} to: {:?}", stat.clone().as_str(), info_read.get_stat(mon.index, stat.clone()).unwrap())); - return ScreenAction::Reload + Logger::info(format!( + "Updated stat: {} to: {:?}", + stat.clone().as_str(), + info_read.get_stat(mon.index, stat.clone()).unwrap() + )); + return ScreenAction::Reload; } } } @@ -191,7 +201,11 @@ impl SingleScreen { match act { ScreenAction::None => {} _ => { - Logger::info(format!("Action for stat {:?}: {:?}", stat.as_str(), act.as_str())); + Logger::info(format!( + "Action for stat {:?}: {:?}", + stat.as_str(), + act.as_str() + )); action = act } } @@ -302,7 +316,6 @@ impl SingleScreen { // todo: refresh after successful save } - } } @@ -315,62 +328,64 @@ impl ScreenTrait for SingleScreen { Logger::info("Getting idx"); let idx = match app.selected_mon.clone() { - None => {return} - Some(sel) => {sel.index} + None => return, + Some(sel) => sel.index, }; Logger::info("Getting is_shiny"); let is_shiny = match ShinyList::new_party(gvas_file) { - None => {return} - Some(l) => { - match l.get_shiny_at(idx) { - None => {return} - Some(s) => {s.clone()} - } - } + None => return, + Some(l) => match l.get_shiny_at(idx) { + None => return, + Some(s) => s.clone(), + }, }; Logger::info(is_shiny.clone().to_string()); Logger::info("Getting name"); let party = match PokemonInfo::new_party(gvas_file) { - None => {return} - Some(c) => { - c - } + None => return, + Some(c) => c, }; let name = match party.get_name(idx) { - None => { return; } - Some(name) => {name} + None => { + return; + } + Some(name) => name, }; Logger::info("Getting stats"); let stats: StatStruct = match party.get_stats(idx) { - None => { return; } - Some(s) => { - s + None => { + return; } + Some(s) => s, }; // todo!() wget ALL mon data, ivs, stats, moves, pp, etc. let iv_wrapper: IV = match IV::new_party(gvas_file) { - None => { return; } - Some(wrapper) => { - wrapper + None => { + return; } + Some(wrapper) => wrapper, }; let ivs: IVSpread = match iv_wrapper.get_ivs_at(idx) { - None => { return; } - Some(ivs) => { - match IV::to_struct(ivs.iter().map(|&v| *v).collect()) { - None => {return;} - Some(s) => {s} - } + None => { + return; } + Some(ivs) => match IV::to_struct(ivs.iter().map(|&v| *v).collect()) { + None => { + return; + } + Some(s) => s, + }, }; let class = match PokemonClasses::new_party(gvas_file) { - None => {return;} + None => { + return; + } Some(party) => { if let Some(c) = party.class_at(idx.clone()) { c.clone() @@ -387,7 +402,7 @@ impl ScreenTrait for SingleScreen { is_shiny, name: name.clone(), stats, - ivs + ivs, }); self.loaded = true; Logger::info(format!("Loaded info in SingleScreen for: {}", name)); @@ -410,7 +425,10 @@ impl ScreenTrait for SingleScreen { Logger::info(format!("No such image: {}", path.as_str())); } - fn flip_shiny(mut guard: RwLockWriteGuard, data: &SingleMon) -> ScreenAction { + fn flip_shiny( + mut guard: RwLockWriteGuard, + data: &SingleMon, + ) -> ScreenAction { let gvas = &mut *guard; if let Some(mut list) = ShinyListMut::new_party(gvas) { match list.set_shiny_at(data.index, !data.is_shiny) { @@ -418,37 +436,47 @@ impl ScreenTrait for SingleScreen { Logger::info("Shiny toggle success!".to_string()); return ScreenAction::Reload; } - Err(e) => {Logger::info(format!("Failed to set shiny at: {}", e));} + Err(e) => { + Logger::info(format!("Failed to set shiny at: {}", e)); + } }; } ScreenAction::None } if data.is_shiny { - let res: Response = ui.add(Image::new(format!("{}/shiny.png", get_images_path())) - .corner_radius(5) - .bg_fill(Color32::from_rgb(50, 50, 50)) - .fit_to_exact_size(Vec2::new(16.0, 16.0)) - .sense(Sense::click())); + let res: Response = ui.add( + Image::new(format!("{}/shiny.png", get_images_path())) + .corner_radius(5) + .bg_fill(Color32::from_rgb(50, 50, 50)) + .fit_to_exact_size(Vec2::new(16.0, 16.0)) + .sense(Sense::click()), + ); if res.clicked() { let mut guard = match try_gvas_write!(GVAS_FILE) { - None => {return ScreenAction::None;} - Some(g) => {g} + None => { + return ScreenAction::None; + } + Some(g) => g, }; return flip_shiny(guard, data); } } else { - let res: Response = ui.add(Image::new(format!("{}/non_shiny.png", get_images_path())) - .corner_radius(5) - .bg_fill(Color32::from_rgb(0, 0, 0)) - .fit_to_exact_size(Vec2::new(16.0, 16.0)) - .sense(Sense::click())); + let res: Response = ui.add( + Image::new(format!("{}/non_shiny.png", get_images_path())) + .corner_radius(5) + .bg_fill(Color32::from_rgb(0, 0, 0)) + .fit_to_exact_size(Vec2::new(16.0, 16.0)) + .sense(Sense::click()), + ); if res.clicked() { Logger::info("Shiny toggle clicked!".to_string()); let guard = match try_gvas_write!(GVAS_FILE) { - None => {return ScreenAction::None;} - Some(g) => {g} + None => { + return ScreenAction::None; + } + Some(g) => g, }; return flip_shiny(guard, data); } @@ -464,11 +492,15 @@ impl ScreenTrait for SingleScreen { let res: Response = ui.add(TextEdit::singleline(&mut display).desired_width(200.0)); if res.changed() { let mut guard = match try_gvas_write!(GVAS_FILE) { - None => { return ScreenAction::None;} - Some(g) => {g} + None => { + return ScreenAction::None; + } + Some(g) => g, }; match PokemonInfoMut::new_party(&mut *guard) { - None => { return ScreenAction::None; } + None => { + return ScreenAction::None; + } Some(mut party) => { party.set_name(data.index.clone(), display); return ScreenAction::Reload; @@ -477,7 +509,6 @@ impl ScreenTrait for SingleScreen { } } - if let Some(action) = self.iv_table(ui) { return action; } @@ -490,4 +521,4 @@ impl Reload for SingleScreen { self.loaded = false; self.load(app); } -} \ No newline at end of file +} diff --git a/src/utils/custom_struct.rs b/src/utils/custom_struct.rs index dab770c..63b793e 100644 --- a/src/utils/custom_struct.rs +++ b/src/utils/custom_struct.rs @@ -1,6 +1,6 @@ use gvas::properties::array_property::ArrayProperty; -use gvas::properties::Property; use gvas::properties::struct_property::{StructProperty, StructPropertyValue}; +use gvas::properties::Property; use indexmap::IndexMap; pub type CustomStruct<'a> = (&'a String, &'a IndexMap>); @@ -17,61 +17,61 @@ pub type CustomStruct<'a> = (&'a String, &'a IndexMap>); fn get_starts_with<'a>(value: &'a StructProperty, string: &str) -> Option<&'a Vec> { match &value.value { StructPropertyValue::CustomStruct { properties, .. } => { - for (k,v) in properties.0.iter() { + for (k, v) in properties.0.iter() { if k.starts_with(string) { - return Some(v) + return Some(v); } } None } - _ => None + _ => None, } } -fn get_starts_with_mut<'a>(value: &'a mut StructProperty, string: &str) -> Option<&'a mut Vec> { +fn get_starts_with_mut<'a>( + value: &'a mut StructProperty, + string: &str, +) -> Option<&'a mut Vec> { match &mut value.value { - StructPropertyValue::CustomStruct { ref mut properties, .. } => { - for (k,v) in properties.0.iter_mut() { + StructPropertyValue::CustomStruct { + ref mut properties, .. + } => { + for (k, v) in properties.0.iter_mut() { if k.starts_with(string) { - return Some(v) + return Some(v); } } None } - _ => None + _ => None, } } pub fn get_struct_property_at_idx(property: &Property, idx: usize) -> Option<&StructProperty> { let array = match property { - Property::ArrayProperty(prop) => { - prop - } - _ => return None + Property::ArrayProperty(prop) => prop, + _ => return None, }; match array { - ArrayProperty::Structs { structs, .. } => { - structs.get(idx) - } - _ => None + ArrayProperty::Structs { structs, .. } => structs.get(idx), + _ => None, } } // TODO: test this -pub fn get_struct_property_at_idx_mut(property: &mut Property, idx: usize) -> Option<&mut StructProperty> { +pub fn get_struct_property_at_idx_mut( + property: &mut Property, + idx: usize, +) -> Option<&mut StructProperty> { let array = match property { - Property::ArrayProperty(prop) => { - prop - } - _ => return None + Property::ArrayProperty(prop) => prop, + _ => return None, }; match array { - ArrayProperty::Structs { structs, .. } => { - structs.get_mut(idx) - } - _ => None + ArrayProperty::Structs { structs, .. } => structs.get_mut(idx), + _ => None, } } @@ -81,16 +81,14 @@ pub fn get_struct_at_idx(property: &Property, idx: usize) -> Option<&Property> { pub fn get_struct_at_idx_mut(property: &mut Property, idx: usize) -> Option<&mut StructProperty> { let array = match property { - Property::ArrayProperty(ref mut prop) => { - prop - } - _ => return None + Property::ArrayProperty(ref mut prop) => prop, + _ => return None, }; match array { - ArrayProperty::Structs { ref mut structs, .. } => { - structs.get_mut(idx) - } - _ => None + ArrayProperty::Structs { + ref mut structs, .. + } => structs.get_mut(idx), + _ => None, } -} \ No newline at end of file +} diff --git a/src/utils/mod.rs b/src/utils/mod.rs index 95e8ff3..ee1d6c7 100644 --- a/src/utils/mod.rs +++ b/src/utils/mod.rs @@ -1,19 +1,22 @@ -use std::cell::OnceCell; -use std::sync::{Arc, RwLock}; -use egui::{Context, Id}; use egui::util::id_type_map::SerializableAny; +use egui::{Context, Id}; use gvas::GvasFile; +use std::cell::OnceCell; +use std::sync::{Arc, RwLock}; pub mod custom_struct; pub fn get_data_persisted(context: &Context, key: String) -> Option where - T: SerializableAny + Clone + Send + Sync + 'static { + T: SerializableAny + Clone + Send + Sync + 'static, +{ context.data_mut(|map| map.get_persisted(Id::new(key))) } pub fn set_data_persisted(context: &Context, key: String, data: T) -> () -where T: SerializableAny + Clone { +where + T: SerializableAny + Clone, +{ context.data_mut(|map| { let persisted = map.get_persisted_mut_or(Id::new(key), data.clone()); *persisted = data; diff --git a/tests/common.rs b/tests/common.rs index 2a63fa9..3b6b082 100644 --- a/tests/common.rs +++ b/tests/common.rs @@ -1,10 +1,12 @@ -use std::fs::File; -use std::sync::{Arc, RwLock}; use gvas::game_version::GameVersion; -use gvas::GvasFile; -use gvas::properties::int_property::{BoolProperty, ByteProperty, BytePropertyValue, DoubleProperty}; +use gvas::properties::int_property::{ + BoolProperty, ByteProperty, BytePropertyValue, DoubleProperty, +}; use gvas::properties::Property; +use gvas::GvasFile; use ordered_float::OrderedFloat; +use std::fs::File; +use std::sync::{Arc, RwLock}; pub fn get_gvas<'a>() -> GvasFile { let mut file = File::open("Slot1.sav").expect("save file not found"); @@ -20,7 +22,6 @@ pub fn get_gvas_mut<'a>() -> GvasFile { gvas.clone() } - fn make_bool_property(value: bool) -> Property { Property::BoolProperty(BoolProperty { value }) } @@ -36,4 +37,4 @@ fn make_namespaced_property(value: &str) -> Property { name: None, value: BytePropertyValue::Namespaced(value.to_string()), }) -} \ No newline at end of file +} diff --git a/tests/main.rs b/tests/main.rs index aae87c4..f801f25 100644 --- a/tests/main.rs +++ b/tests/main.rs @@ -1 +1 @@ -mod pokemon; \ No newline at end of file +mod pokemon; diff --git a/tests/pokemon/attack_lists.rs b/tests/pokemon/attack_lists.rs index 3e7e1ac..682ce04 100644 --- a/tests/pokemon/attack_lists.rs +++ b/tests/pokemon/attack_lists.rs @@ -1,7 +1,7 @@ -use gvas::GvasFile; -use gvas::properties::Property; -use gammaeditor::save::pokemon::attack_lists::{attack_array, attack_at, attacks_at, parse_attack}; use crate::pokemon::common::get_gvas; +use gammaeditor::save::pokemon::attack_lists::{attack_array, attack_at, attacks_at, parse_attack}; +use gvas::properties::Property; +use gvas::GvasFile; #[test] fn attack_at_gets_class_string() { @@ -17,7 +17,9 @@ fn attack_at_gets_class_string() { #[test] fn parse_attack_parses() { - let actual = parse_attack("/Game/BPS/ABILITIES/BuffSkills/GHOST/Astonish/BP_Astonish.BP_Astonish_C").expect("parsed"); + let actual = + parse_attack("/Game/BPS/ABILITIES/BuffSkills/GHOST/Astonish/BP_Astonish.BP_Astonish_C") + .expect("parsed"); let expected = "Astonish"; assert_eq!(actual, expected); @@ -29,9 +31,9 @@ fn get_attack_gets() { let prop: &Property = gvas.properties.get("PartyAttackLists").expect("get prop"); let array = attack_array(prop).expect("get array"); let attacks = attacks_at(array, 0).expect("get attacks at"); - + let actual = attack_at(attacks, 0).expect("get attack at"); let expected = "/Game/BPS/ABILITIES/BuffSkills/GHOST/Astonish/BP_Astonish.BP_Astonish_C"; assert_eq!(actual, expected); -} \ No newline at end of file +} diff --git a/tests/pokemon/gender.rs b/tests/pokemon/gender.rs index dd58547..1bc57be 100644 --- a/tests/pokemon/gender.rs +++ b/tests/pokemon/gender.rs @@ -1,5 +1,5 @@ -use gammaeditor::save::pokemon::gender::gender_string_at; use crate::pokemon::common::get_gvas; +use gammaeditor::save::pokemon::gender::gender_string_at; #[test] pub fn gender_string_at_returns_class_string() { @@ -11,4 +11,4 @@ pub fn gender_string_at_returns_class_string() { let expected = "ENUM_Gender::NewEnumerator0"; assert_eq!(gender_at, expected) -} \ No newline at end of file +} diff --git a/tests/pokemon/iv_struct.rs b/tests/pokemon/iv_struct.rs index a256b34..eb85bd3 100644 --- a/tests/pokemon/iv_struct.rs +++ b/tests/pokemon/iv_struct.rs @@ -1,7 +1,7 @@ +use crate::pokemon::common::{get_gvas, get_gvas_mut}; use gammaeditor::pkmn::stats::IVs; use gammaeditor::save::pokemon::iv_struct::{get_ivs, IVMut, IV}; use gammaeditor::utils::custom_struct::get_struct_property_at_idx; -use crate::pokemon::common::{get_gvas, get_gvas_mut}; #[test] fn get_ivs_returns_correctly() { @@ -10,7 +10,7 @@ fn get_ivs_returns_correctly() { let iv_struct = get_struct_property_at_idx(prop, 0).expect("get struct at"); let ivs = get_ivs(iv_struct).expect("get ivs"); - let expected = vec!(&1000, &1000, &1000, &1000, &1000, &1000); + let expected = vec![&1000, &1000, &1000, &1000, &1000, &1000]; assert_eq!(ivs, expected); } @@ -22,7 +22,7 @@ fn get_ivs_fails_correctly() { let iv_struct = get_struct_property_at_idx(prop, 0).expect("get struct at"); let ivs = get_ivs(iv_struct).expect("get ivs"); - let not_expected = vec!(&1000, &1000, &1000, &1000, &1000, &999); + let not_expected = vec![&1000, &1000, &1000, &1000, &1000, &999]; assert_ne!(ivs, not_expected); } @@ -33,9 +33,8 @@ fn set_ivs_returns_correctly() { let mut ivs = IVMut::new_party(&mut gvas).expect("get ivmut"); let res = ivs.set_iv_at(0, IVs::SDEF, 32).expect("set iv"); - let ivs_read = IV::new_party(&gvas).expect("get party"); let iv = ivs_read.get_iv_at(0, IVs::SDEF).expect("get iv"); assert_eq!(*iv, 32) -} \ No newline at end of file +} diff --git a/tests/pokemon/mod.rs b/tests/pokemon/mod.rs index 3ee03b6..e3e73b1 100644 --- a/tests/pokemon/mod.rs +++ b/tests/pokemon/mod.rs @@ -1,11 +1,11 @@ #[path = "../common.rs"] pub(crate) mod common; -pub mod pokemon_id; +mod attack_lists; +mod gender; +mod iv_struct; pub mod pokemon_classes; +pub mod pokemon_id; mod pokemon_info; -mod attack_lists; mod pp_moves_lists; mod shiny_list; -mod iv_struct; -mod gender; \ No newline at end of file diff --git a/tests/pokemon/pokemon_classes.rs b/tests/pokemon/pokemon_classes.rs index 069a593..aed12e0 100644 --- a/tests/pokemon/pokemon_classes.rs +++ b/tests/pokemon/pokemon_classes.rs @@ -1,5 +1,5 @@ -use gammaeditor::save::pokemon::pokemon_classes::{class_at}; use crate::pokemon::pokemon_classes::common::get_gvas; +use gammaeditor::save::pokemon::pokemon_classes::class_at; #[path = "../common.rs"] pub(crate) mod common; @@ -21,4 +21,4 @@ fn test_class_at_out_of_bounds() { let array = prop.get_array().expect("get array"); let val = class_at(&array, 99); assert!(val.is_none()); -} \ No newline at end of file +} diff --git a/tests/pokemon/pokemon_id.rs b/tests/pokemon/pokemon_id.rs index fdec7cb..86d0e33 100644 --- a/tests/pokemon/pokemon_id.rs +++ b/tests/pokemon/pokemon_id.rs @@ -1,16 +1,16 @@ #[path = "../common.rs"] mod common; -use gvas::properties::array_property::ArrayProperty; -use gammaeditor::save::pokemon::pokemon_id::{id_array, id_at, PokemonID}; use crate::pokemon::pokemon_id::common::get_gvas; +use gammaeditor::save::pokemon::pokemon_id::{id_array, id_at, PokemonID}; +use gvas::properties::array_property::ArrayProperty; #[test] fn id_array_gets_array() { let gvas = get_gvas(); let prop = gvas.properties.get("PartyPokemonID").expect("get prop"); let array: &ArrayProperty = id_array(&prop).expect("array unwrapped"); - if let ArrayProperty::Ints { ints, ..} = &array { + if let ArrayProperty::Ints { ints, .. } = &array { let actual = vec![981811, 486465, 220984]; let expected = ints.clone(); @@ -23,7 +23,7 @@ fn id_array_fails_properly() { let gvas = get_gvas(); let prop = gvas.properties.get("PartyPokemonID").expect("get prop"); let array: &ArrayProperty = id_array(&prop).expect("array unwrapped"); - if let ArrayProperty::Ints { ints, ..} = &array { + if let ArrayProperty::Ints { ints, .. } = &array { // add +1 to each let actual = vec![981812, 486466, 220985]; let expected = ints.clone(); @@ -41,4 +41,4 @@ fn id_at_gets_id() { assert_eq!(id, 220984); () -} \ No newline at end of file +} diff --git a/tests/pokemon/pokemon_info.rs b/tests/pokemon/pokemon_info.rs index f3ce033..c4f1885 100644 --- a/tests/pokemon/pokemon_info.rs +++ b/tests/pokemon/pokemon_info.rs @@ -1,28 +1,34 @@ -use gvas::GvasFile; -use gvas::properties::int_property::{BoolProperty, ByteProperty, BytePropertyValue, DoubleProperty}; -use gvas::properties::Property; -use gvas::properties::struct_property::{StructProperty, StructPropertyValue}; -use ordered_float::OrderedFloat; +use crate::pokemon::common::get_gvas_mut; +use crate::pokemon::pokemon_classes::common::get_gvas; use gammaeditor::pkmn; use gammaeditor::pkmn::stats::Stats; use gammaeditor::property::traits::StartsWith; use gammaeditor::save::pokemon::pokemon_info; use gammaeditor::save::pokemon::pokemon_info::{PokemonInfo, PokemonInfoMut}; use gammaeditor::utils::custom_struct::get_struct_property_at_idx; -use crate::pokemon::common::get_gvas_mut; -use crate::pokemon::pokemon_classes::common::get_gvas; +use gvas::properties::int_property::{ + BoolProperty, ByteProperty, BytePropertyValue, DoubleProperty, +}; +use gvas::properties::struct_property::{StructProperty, StructPropertyValue}; +use gvas::properties::Property; +use gvas::GvasFile; +use ordered_float::OrderedFloat; #[test] fn get_sturct_at_idx_gets() { let gvas = get_gvas(); - let prop = gvas.properties.get("PartyPokemonInfo").expect("unwrap prop"); + let prop = gvas + .properties + .get("PartyPokemonInfo") + .expect("unwrap prop"); let cs = get_struct_property_at_idx(prop, 0).expect("unwrap struct"); let is_fainted = cs.get_starts_with("isFainted").expect("get isfainted"); let first = is_fainted.first().expect("get first"); let val = match first { Property::BoolProperty(bool) => Some(bool.value), - _ => None - }.expect("unwrap bool"); + _ => None, + } + .expect("unwrap bool"); println!("{}", serde_json::to_string_pretty(&val).expect("unwrapp")); assert_eq!(val, false) @@ -31,7 +37,10 @@ fn get_sturct_at_idx_gets() { #[test] fn get_struct_at_idx_gets() { let gvas = get_gvas(); - let prop = gvas.properties.get("PartyPokemonInfo").expect("unwrap prop"); + let prop = gvas + .properties + .get("PartyPokemonInfo") + .expect("unwrap prop"); let cs = get_struct_property_at_idx(prop, 0).expect("unwrap struct"); let expected = r#" { @@ -137,7 +146,6 @@ fn get_struct_at_idx_gets() { assert_eq!(actual.trim(), expected.trim()) } - #[test] fn get_stat() { let gvas = get_gvas(); @@ -232,7 +240,6 @@ fn get_secondary_type() { assert_eq!(secondary, expected) } - #[test] fn get_nature_string() { let gvas = get_gvas(); diff --git a/tests/pokemon/pp_moves_lists.rs b/tests/pokemon/pp_moves_lists.rs index 2a0e6dd..964b11a 100644 --- a/tests/pokemon/pp_moves_lists.rs +++ b/tests/pokemon/pp_moves_lists.rs @@ -1,8 +1,8 @@ -use gvas::GvasFile; +use crate::pokemon::common::get_gvas; +use gammaeditor::save::pokemon::pp_moves_lists::{current_pp_at, max_pp_at, moves_array, moves_at}; use gvas::properties::array_property::ArrayProperty; use gvas::properties::Property; -use gammaeditor::save::pokemon::pp_moves_lists::{current_pp_at, max_pp_at, moves_array, moves_at}; -use crate::pokemon::common::get_gvas; +use gvas::GvasFile; #[test] fn moves_at_returns_moves() { @@ -113,7 +113,7 @@ fn max_pp_at_returns() { let moves_at = moves_at(moves, 0).expect("get moves at"); let max_pp = max_pp_at(moves_at, 0).expect("hi").clone(); - assert_eq!(max_pp ,15) + assert_eq!(max_pp, 15) } #[test] @@ -125,4 +125,4 @@ fn current_pp_returns() { let current_pp = current_pp_at(moves_at, 1).expect("hi").clone(); assert_eq!(current_pp, 19) -} \ No newline at end of file +} diff --git a/tests/pokemon/shiny_list.rs b/tests/pokemon/shiny_list.rs index 8347cd3..27780c2 100644 --- a/tests/pokemon/shiny_list.rs +++ b/tests/pokemon/shiny_list.rs @@ -1,10 +1,13 @@ -use gammaeditor::save::pokemon::shiny_list::{get_shiny_at, get_shiny_list}; use crate::pokemon::common::get_gvas; +use gammaeditor::save::pokemon::shiny_list::{get_shiny_at, get_shiny_list}; #[test] fn get_shiny_list_gets_shinies() { let gvas = get_gvas(); - let prop = gvas.properties.get("PartyShinyList").expect("party shiny list"); + let prop = gvas + .properties + .get("PartyShinyList") + .expect("party shiny list"); let arr = prop.get_array().expect("get array"); let shinies = get_shiny_list(&arr).expect("get shiny list"); @@ -18,7 +21,10 @@ fn get_shiny_list_gets_shinies() { #[test] fn get_shiny_gets_shiny() { let gvas = get_gvas(); - let prop = gvas.properties.get("PartyShinyList").expect("party shiny list"); + let prop = gvas + .properties + .get("PartyShinyList") + .expect("party shiny list"); let arr = prop.get_array().expect("get array"); @@ -26,4 +32,4 @@ fn get_shiny_gets_shiny() { let expected = true; assert_eq!(*actual, expected) -} \ No newline at end of file +} diff --git a/tests/property.rs b/tests/property.rs index 2c08b82..98f4c56 100644 --- a/tests/property.rs +++ b/tests/property.rs @@ -1,3 +1,4 @@ +use gammaeditor::property::traits::PropertyPath; use gvas::game_version::GameVersion; use gvas::properties::array_property::ArrayProperty; use gvas::properties::int_property::BytePropertyValue; @@ -5,7 +6,6 @@ use gvas::properties::struct_property::{StructProperty, StructPropertyValue}; use gvas::properties::Property; use gvas::GvasFile; use std::fs::File; -use gammaeditor::property::traits::PropertyPath; #[test] fn test_get_starts_with_gets_level() { @@ -13,7 +13,8 @@ fn test_get_starts_with_gets_level() { let mut f = File::open("Slot1.sav").expect("open sav"); let gvas = GvasFile::read(&mut f, GameVersion::Default).expect("read gvas"); - let party = gvas.properties + let party = gvas + .properties .get("PartyPokemonInfo") .expect("PartyPokemonInfo present"); @@ -50,7 +51,8 @@ fn get_vec() -> Option> { let mut f = File::open("Slot1.sav").expect("open sav"); let gvas = GvasFile::read(&mut f, GameVersion::Default).expect("read gvas"); - let party = gvas.properties + let party = gvas + .properties .get("PartyPokemonInfo") .expect("PartyPokemonInfo present"); @@ -60,9 +62,7 @@ fn get_vec() -> Option> { }; match arr { - ArrayProperty::Structs { structs, .. } => { - Some(structs.clone()) - } + ArrayProperty::Structs { structs, .. } => Some(structs.clone()), _ => panic!("ArrayProperty but not Structs"), } } @@ -85,7 +85,6 @@ fn test_get_starts_with_gets_is_fainted() { } } } - } _ => { println!("not a struct"); @@ -128,7 +127,12 @@ fn test_get_starts_with_gets_primary_type() { match satk { Property::ByteProperty(inner) => { println!("{:?}", inner.value); - assert_eq!(inner.value, BytePropertyValue::Namespaced("ENUM_PokemonTypePrimary::NewEnumerator8".to_string())); + assert_eq!( + inner.value, + BytePropertyValue::Namespaced( + "ENUM_PokemonTypePrimary::NewEnumerator8".to_string() + ) + ); } _ => { panic!("expected DoubleProperty"); @@ -140,4 +144,4 @@ fn test_get_starts_with_gets_primary_type() { println!("not a struct"); } } -} \ No newline at end of file +} From 87ec71af33c1f7cfa15ee35d06f2c5316822e72e Mon Sep 17 00:00:00 2001 From: Cal Date: Sun, 9 Nov 2025 11:44:06 +0100 Subject: [PATCH 10/49] delete remnant tauri file --- capabilities/default.json | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 capabilities/default.json diff --git a/capabilities/default.json b/capabilities/default.json deleted file mode 100644 index 4cdbf49..0000000 --- a/capabilities/default.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "$schema": "../gen/schemas/desktop-schema.json", - "identifier": "default", - "description": "Capability for the main window", - "windows": ["main"], - "permissions": [ - "core:default", - "opener:default" - ] -} From 226e5a1f86296f5c3f4f44aabe79441a5b24e039 Mon Sep 17 00:00:00 2001 From: Cal Date: Mon, 10 Nov 2025 00:24:14 +0100 Subject: [PATCH 11/49] add generator --- src/utils/generator.rs | 107 +++++++++++++++++++++++++++++++++++++++++ src/utils/mod.rs | 1 + 2 files changed, 108 insertions(+) create mode 100644 src/utils/generator.rs diff --git a/src/utils/generator.rs b/src/utils/generator.rs new file mode 100644 index 0000000..ae2dd28 --- /dev/null +++ b/src/utils/generator.rs @@ -0,0 +1,107 @@ +use crate::logger::Logger; +use crate::pkmn::Move; + +#[cfg(target_os = "windows")] +pub const GENERATOR_BIN: &[u8] = include_bytes!("../../bin/generator.exe"); + +#[derive(Default)] +pub struct Generator { + pub version: Option, + pub species: Option, + pub nickname: Option, + pub trainer_name: Option, + pub level: Option, + pub ball: Option, + pub gender: Option, + pub nature: Option, + pub shiny: Option, + pub moves: Option>, + pub form: Option, + pub ivs: Option>, + pub evs: Option>, +} + +impl Generator { + pub fn new() -> Generator { + Self::default() + } + + /// Create a string of args + fn args(&self) -> String { + let mut args: Vec = Vec::new(); + + if let Some(v) = &self.version { + args.push(format!("--version {}", v)); + } + if let Some(s) = self.species { + args.push(format!("--species {}", s)); + } + if let Some(n) = &self.nickname { + args.push(format!("--nickname {}", n)); + } + if let Some(t) = &self.trainer_name { + args.push(format!("--trainer-name {}", t)); + } + if let Some(l) = self.level { + args.push(format!("--level {}", l)); + } + if let Some(b) = self.ball { + args.push(format!("--ball {}", b)); + } + if let Some(g) = self.gender { + args.push(format!("--gender {}", g)); + } + if let Some(n) = &self.nature { + args.push(format!("--nature {}", n)); + } + if let Some(s) = &self.shiny { + args.push(format!("--shiny {}", s)); + } + if let Some(f) = self.form { + args.push(format!("--form {}", f)); + } + if let Some(ivs) = &self.ivs { + args.push(format!("--ivs {}", ivs.iter().map(|v| v.to_string()).collect::>().join(","))); + } + if let Some(evs) = &self.evs { + args.push(format!("--evs {}", evs.iter().map(|v| v.to_string()).collect::>().join(","))); + } + if let Some(moves) = &self.moves { + for (i, m) in moves.iter().enumerate() { + args.push(format!("--move{} {}", i + 1, m.name)); + } + } + + args.join(" ") + } + + pub fn run(self) { + match run_generator(self) { + Ok(_) => { + Logger::info("Generator complete."); + } + Err(e) => { + Logger::error(e.to_string()); + } + }; + } +} + +#[cfg(target_os = "windows")] +fn run_generator(settings: Generator) -> std::io::Result<()> { + use std::{env, fs, process::Command}; + + let path = env::temp_dir().join("generator.exe"); + fs::write(&path, GENERATOR_BIN)?; + + Command::new(&path) + .arg("--example") + .spawn()?; + + Ok(()) +} + +#[cfg(not(target_os = "windows"))] +fn run_generator() { + Logger::info(format!("Generator not available on this platform: {}", std::env::consts::OS.to_string())); +} diff --git a/src/utils/mod.rs b/src/utils/mod.rs index ee1d6c7..269f5a6 100644 --- a/src/utils/mod.rs +++ b/src/utils/mod.rs @@ -5,6 +5,7 @@ use std::cell::OnceCell; use std::sync::{Arc, RwLock}; pub mod custom_struct; +pub mod generator; pub fn get_data_persisted(context: &Context, key: String) -> Option where From d85b8f52ce01c95472b5e4d540bb7e80bdb6f2b7 Mon Sep 17 00:00:00 2001 From: Cal <43823915+CalRL@users.noreply.github.com> Date: Wed, 12 Nov 2025 16:12:22 +0100 Subject: [PATCH 12/49] flip args --- src/app.rs | 2 +- src/ui/menu/mod.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app.rs b/src/app.rs index 9f70bbd..b48a061 100644 --- a/src/app.rs +++ b/src/app.rs @@ -154,7 +154,7 @@ impl eframe::App for App { ctx.data_mut(|map| { map.insert_persisted(Id::new("selected_mon"), None::>) }); - render_menu_bar(ctx, self); + render_menu_bar(self, ctx); render_navigation_bar(self, ctx); render_screen(self, ctx); } diff --git a/src/ui/menu/mod.rs b/src/ui/menu/mod.rs index aa94f0e..b0b4a83 100644 --- a/src/ui/menu/mod.rs +++ b/src/ui/menu/mod.rs @@ -33,7 +33,7 @@ pub trait OnChange { fn on_change(&self); } -pub fn render_menu_bar(ctx: &Context, state: &mut App) { +pub fn render_menu_bar(state: &mut App, ctx: &Context) { egui::TopBottomPanel::top("menu_bar").show(ctx, |ui| { menu::MenuBar::new().ui(ui, |ui| { ui.menu_button("File", |ui| { From e40891d651db647148496c367312bfc8bca22c02 Mon Sep 17 00:00:00 2001 From: Cal <43823915+CalRL@users.noreply.github.com> Date: Wed, 12 Nov 2025 16:12:30 +0100 Subject: [PATCH 13/49] add correct_name method --- src/save/pokemon/mod.rs | 8 +++++++ src/ui/screen/party_screen.rs | 4 ++-- src/ui/screen/single_screen.rs | 43 ++++++++++++++++++++-------------- 3 files changed, 36 insertions(+), 19 deletions(-) diff --git a/src/save/pokemon/mod.rs b/src/save/pokemon/mod.rs index 464036e..d8ee61f 100644 --- a/src/save/pokemon/mod.rs +++ b/src/save/pokemon/mod.rs @@ -54,3 +54,11 @@ impl SelectedMon { true } } + +/// Corrects an invalid mon's name +pub fn correct_name(name: String) -> String { + match name.as_str() { + "Metacross" => "Metagross", + other => other + }.to_string() +} diff --git a/src/ui/screen/party_screen.rs b/src/ui/screen/party_screen.rs index 0d79a16..9351b45 100644 --- a/src/ui/screen/party_screen.rs +++ b/src/ui/screen/party_screen.rs @@ -2,7 +2,7 @@ use crate::app::{App, GVAS_FILE}; use crate::logger::Logger; use crate::save::pokemon::pokemon_classes::{class_at, parse_class}; use crate::save::pokemon::shiny_list::get_shiny_list; -use crate::save::pokemon::{SelectedMon, StorageType}; +use crate::save::pokemon::{correct_name, SelectedMon, StorageType}; use crate::ui::image::ImageContainer; use crate::ui::render_image; use crate::ui::screen::single_screen::{SingleScreen, SingleScreenBuffer}; @@ -50,7 +50,7 @@ impl ScreenTrait for PartyScreen { let mut container_vec: Vec = Vec::new(); for (i, (name, is_shiny)) in names.iter().zip(shiny_vec.iter()).enumerate() { - let container = ImageContainer::new_party(name.clone(), is_shiny.clone(), i); + let container = ImageContainer::new_party(correct_name(name.clone()), is_shiny.clone(), i); container_vec.push(container); } diff --git a/src/ui/screen/single_screen.rs b/src/ui/screen/single_screen.rs index d6f5af1..98b4d6c 100644 --- a/src/ui/screen/single_screen.rs +++ b/src/ui/screen/single_screen.rs @@ -6,7 +6,7 @@ use crate::save::pokemon::iv_struct::IV; use crate::save::pokemon::pokemon_classes::{parse_class, PokemonClasses}; use crate::save::pokemon::pokemon_info::{InfoStruct, PokemonInfo, PokemonInfoMut}; use crate::save::pokemon::shiny_list::{ShinyList, ShinyListMut}; -use crate::save::pokemon::StorageType; +use crate::save::pokemon::{correct_name, StorageType}; use crate::ui::image::ImageContainer; use crate::ui::screen::{get_images_path, render_pokemon_path, Reload, ScreenAction, ScreenTrait}; use crate::ui::{render_image_container, render_texture}; @@ -322,29 +322,32 @@ impl SingleScreen { impl ScreenTrait for SingleScreen { fn load(&mut self, app: &mut App) { Logger::info("Loading SingleScreen"); - Logger::info("Getting gvas"); - let gvas_file = &*unwrap_gvas!(GVAS_FILE); - Logger::info("Got gvas"); + let gvas_file: &GvasFile = &*unwrap_gvas!(GVAS_FILE); - Logger::info("Getting idx"); let idx = match app.selected_mon.clone() { - None => return, + None => { + Logger::info("Failed to get mon.idx"); + return + }, Some(sel) => sel.index, }; - Logger::info("Getting is_shiny"); let is_shiny = match ShinyList::new_party(gvas_file) { None => return, Some(l) => match l.get_shiny_at(idx) { - None => return, + None => { + Logger::info("Failed to get is_shiny"); + return + }, Some(s) => s.clone(), }, }; - Logger::info(is_shiny.clone().to_string()); - Logger::info("Getting name"); let party = match PokemonInfo::new_party(gvas_file) { - None => return, + None => { + Logger::info("Failed to get mon name"); + return + }, Some(c) => c, }; @@ -355,10 +358,9 @@ impl ScreenTrait for SingleScreen { Some(name) => name, }; - Logger::info("Getting stats"); - let stats: StatStruct = match party.get_stats(idx) { None => { + Logger::info("Failed to get stats"); return; } Some(s) => s, @@ -367,29 +369,36 @@ impl ScreenTrait for SingleScreen { // todo!() wget ALL mon data, ivs, stats, moves, pp, etc. let iv_wrapper: IV = match IV::new_party(gvas_file) { None => { + Logger::info("Failed to create IV wrapper"); return; } Some(wrapper) => wrapper, }; + let ivs: IVSpread = match iv_wrapper.get_ivs_at(idx) { None => { + Logger::info("Failed to get IVs"); return; } Some(ivs) => match IV::to_struct(ivs.iter().map(|&v| *v).collect()) { None => { + Logger::info("Failed to map IVs to struct"); return; } Some(s) => s, }, }; + let class = match PokemonClasses::new_party(gvas_file) { None => { + Logger::info("Failed to create Classes wrapper"); return; } Some(party) => { if let Some(c) = party.class_at(idx.clone()) { c.clone() } else { + Logger::info(format!("Failed to get class at index: {}", idx.clone())); return; } } @@ -398,14 +407,14 @@ impl ScreenTrait for SingleScreen { self.mon_data = Some(SingleMon { index: idx, storage_type: StorageType::PARTY, - class, + class: class.clone(), is_shiny, name: name.clone(), stats, ivs, }); self.loaded = true; - Logger::info(format!("Loaded info in SingleScreen for: {}", name)); + Logger::info(format!("Loaded info in SingleScreen for: {:?}", parse_class(class.as_str()))); } fn ui(&mut self, ui: &mut Ui, app: &mut App) -> ScreenAction { @@ -417,7 +426,7 @@ impl ScreenTrait for SingleScreen { let parsed_class = parse_class(data.class.clone().as_str()).unwrap(); let shiny_text = if data.is_shiny { "shiny" } else { "normal" }; - let path = format!("{}/{}.png", shiny_text, parsed_class); + let path = format!("{}/{}.png", shiny_text, correct_name(parsed_class)); if let Some(tex) = app.image_cache.get(ui.ctx(), path.as_str()) { let image: Image = render_texture(tex); ui.add(image); @@ -487,7 +496,7 @@ impl ScreenTrait for SingleScreen { self.loaded = false; return ScreenAction::Reload; } - ui.label("Name"); + ui.label("Nickname"); let mut display: String = data.name.clone(); let res: Response = ui.add(TextEdit::singleline(&mut display).desired_width(200.0)); if res.changed() { From d4459a989d523cfb3e724a307c9b0996f76b0dad Mon Sep 17 00:00:00 2001 From: Cal <43823915+CalRL@users.noreply.github.com> Date: Wed, 12 Nov 2025 17:35:59 +0100 Subject: [PATCH 14/49] make ImageContainer use class instead --- src/ui/image.rs | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/ui/image.rs b/src/ui/image.rs index 0b59cac..1a7af29 100644 --- a/src/ui/image.rs +++ b/src/ui/image.rs @@ -1,29 +1,32 @@ use crate::app::Asset; -use crate::save::pokemon::StorageType; +use crate::save::pokemon::{correct_name, StorageType}; use crate::ui::screen::render_pokemon_path; use egui::{Color32, ColorImage, Context, TextureHandle, Vec2}; use std::collections::HashMap; +use crate::save::pokemon::pokemon_classes::parse_class; -#[derive(Clone)] +#[derive(Clone, Debug)] pub struct ImageContainer { pub(crate) path: String, pub storage_type: StorageType, pub index: usize, - pub name: String, + pub class: String, pub is_shiny: bool, } impl ImageContainer { - pub fn new_party(name: String, is_shiny: bool, index: usize) -> Self { - let path: String = render_pokemon_path(name.clone(), is_shiny); + pub fn new_party(class: String, is_shiny: bool, index: usize) -> Option { + let shiny_text = if is_shiny { "shiny" } else { "normal" }; + let parsed_class = parse_class(class.as_str())?; + let path = format!("{}/{}.png", shiny_text, correct_name(parsed_class)); - Self { + Some(Self { path, storage_type: StorageType::PARTY, - name, + class, is_shiny, index, - } + }) } } From 2c8463266ea79092ee21f697d992f10497ff119f Mon Sep 17 00:00:00 2001 From: Cal <43823915+CalRL@users.noreply.github.com> Date: Wed, 12 Nov 2025 17:36:31 +0100 Subject: [PATCH 15/49] improve clarity --- src/ui/image.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ui/image.rs b/src/ui/image.rs index 1a7af29..5a6f375 100644 --- a/src/ui/image.rs +++ b/src/ui/image.rs @@ -10,7 +10,7 @@ pub struct ImageContainer { pub(crate) path: String, pub storage_type: StorageType, pub index: usize, - pub class: String, + pub parsed_class: String, pub is_shiny: bool, } @@ -23,7 +23,7 @@ impl ImageContainer { Some(Self { path, storage_type: StorageType::PARTY, - class, + parsed_class: class, is_shiny, index, }) From e9e5ecd6a6709aab5d50c2b840bbf3fcdbb96486 Mon Sep 17 00:00:00 2001 From: Cal <43823915+CalRL@users.noreply.github.com> Date: Wed, 12 Nov 2025 17:37:07 +0100 Subject: [PATCH 16/49] add classes and parse_classes --- src/save/pokemon/pokemon_classes.rs | 35 +++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/save/pokemon/pokemon_classes.rs b/src/save/pokemon/pokemon_classes.rs index 8822be4..84f24ce 100644 --- a/src/save/pokemon/pokemon_classes.rs +++ b/src/save/pokemon/pokemon_classes.rs @@ -59,7 +59,42 @@ impl<'a> PokemonClasses<'a> { class } + pub fn classes(&self) -> Option> { + let array: &ArrayProperty = match self.property.get_array() { + None => {return None} + Some(arr) => { arr } + }; + let mut strings: Vec<&String> = Vec::new(); + match array { + ArrayProperty::Properties { properties, .. } => { + for i in properties.iter() { + match i { + Property::ObjectProperty(prop) => { + let val = &prop.value; + strings.push(val); + } + _ => {} + } + + } + + } + _ => {} + }; + + Some(strings) + } + + pub fn parse_class(&self, class: &str) -> Option { parse_class(class) } + pub fn parse_classes(&self, classes: Vec<&String>) -> Option> { + let mut class_vec = Vec::new(); + for class in classes.iter() { + let parsed = self.parse_class(class)?; + class_vec.push(parsed) + } + Some(class_vec) + } } From 075123fa78aef27bfec3c807731d83def98b25a4 Mon Sep 17 00:00:00 2001 From: Cal <43823915+CalRL@users.noreply.github.com> Date: Wed, 12 Nov 2025 17:37:21 +0100 Subject: [PATCH 17/49] add error messages --- src/ui/screen/party_screen.rs | 118 ++++++++++++++++++++++------------ 1 file changed, 77 insertions(+), 41 deletions(-) diff --git a/src/ui/screen/party_screen.rs b/src/ui/screen/party_screen.rs index 9351b45..6dbe35d 100644 --- a/src/ui/screen/party_screen.rs +++ b/src/ui/screen/party_screen.rs @@ -1,22 +1,23 @@ use crate::app::{App, GVAS_FILE}; use crate::logger::Logger; -use crate::save::pokemon::pokemon_classes::{class_at, parse_class}; +use crate::save::pokemon::pokemon_classes::{class_at, parse_class, PokemonClasses}; use crate::save::pokemon::shiny_list::get_shiny_list; use crate::save::pokemon::{correct_name, SelectedMon, StorageType}; use crate::ui::image::ImageContainer; -use crate::ui::render_image; +use crate::ui::{render_image, render_texture}; use crate::ui::screen::single_screen::{SingleScreen, SingleScreenBuffer}; use crate::ui::screen::{render_pokemon_path, Screen, ScreenAction, ScreenTrait}; use crate::utils::set_data_persisted; -use egui::{CursorIcon, Direction, Layout, Response, RichText, Sense, TextBuffer, Ui}; +use egui::{CursorIcon, Direction, Image, Layout, Response, RichText, Sense, TextBuffer, Ui}; use gvas::properties::Property; use gvas::GvasFile; use std::ops::Deref; +use crate::unwrap_gvas; #[derive(Clone)] pub struct PartyScreen { pub(crate) loaded: bool, - pub containers: Vec, + pub containers: Vec>, } impl ScreenTrait for PartyScreen { @@ -25,21 +26,31 @@ impl ScreenTrait for PartyScreen { return; } - let gvas_file: &GvasFile = match app.gvas_file.as_ref() { - Some(file) => &file.read().unwrap().to_owned(), - None => return, + let gvas_file: &GvasFile = &*unwrap_gvas!(GVAS_FILE); + + let wrapper: PokemonClasses = match PokemonClasses::new_party(gvas_file) { + None => { + Logger::error("Failed to create classes wrapper"); + return; + } + Some(w) => {w} }; - let names = match get_names(gvas_file) { + let classes: Vec<&String> = match wrapper.classes() { None => { Logger::error("Failed to get names"); - Vec::new() + return; } - Some(n) => { - Logger::info_once(n.join(", ")); - n + Some(v) => { + v } }; + + let Some(parsed) = wrapper.parse_classes(classes) else { + Logger::error("Failed to parse classes"); + return; + }; + let arr = gvas_file .properties .get("PartyShinyList") @@ -48,13 +59,26 @@ impl ScreenTrait for PartyScreen { .unwrap(); let shiny_vec = get_shiny_list(arr).unwrap(); - let mut container_vec: Vec = Vec::new(); - for (i, (name, is_shiny)) in names.iter().zip(shiny_vec.iter()).enumerate() { - let container = ImageContainer::new_party(correct_name(name.clone()), is_shiny.clone(), i); + if parsed.len() != shiny_vec.len() { + return; + } + Logger::info(format!("Parsed: {:?}", parsed)); + let mut container_vec: Vec> = Vec::new(); + for i in 0..5 { + let class: String = match parsed.get(i) { + None => { + Logger::info(format!("Failed to get parsed at index {}", i)); + continue; + } + Some(class) => {class.clone()} + }; + let shiny = shiny_vec.get(i).unwrap().clone(); + let container = ImageContainer::new_party(class.clone(), shiny, i); container_vec.push(container); } + Logger::info(format!("{:?}", container_vec)); self.containers = container_vec; } @@ -74,34 +98,46 @@ impl ScreenTrait for PartyScreen { }, ); } - for container in self.containers.iter() { - let res: Response = ui - .add(render_image(container.path.clone())) - .interact(Sense::click()); - if res.clicked() { - Logger::info_once(format!("{} Clicked!", container.name)); - - let mon: SelectedMon = SelectedMon { - storage_type: StorageType::PARTY, - index: container.index, - }; - set_data_persisted(ui.ctx(), "selected_mon".into(), mon.clone()); - - app.selected_mon = Some(mon.clone()); - - Logger::info_once("Set selected mon"); - action = ScreenAction::ChangeTo(Screen::Single(SingleScreen { - loaded: false, - mon_data: None, - buf: SingleScreenBuffer::default(), - gvas_file: None, - needs_refresh: true, - })) - } - if res.hovered() { - ui.ctx().set_cursor_icon(CursorIcon::PointingHand); + for option in self.containers.iter() { + let container: &ImageContainer = match option { + None => { + continue + }, + Some(p) => p + }; + if let Some(tex) = app.image_cache.get(ui.ctx(), container.path.as_str()) { + let image: Image = render_texture(tex).sense(Sense::click()); + let res = ui.add(image); + + if res.clicked() { + Logger::info_once(format!("{} Clicked!", container.class)); + + let mon: SelectedMon = SelectedMon { + storage_type: StorageType::PARTY, + index: container.index, + }; + set_data_persisted(ui.ctx(), "selected_mon".into(), mon.clone()); + + app.selected_mon = Some(mon.clone()); + + Logger::info_once("Set selected mon"); + action = ScreenAction::ChangeTo(Screen::Single(SingleScreen { + loaded: false, + mon_data: None, + buf: SingleScreenBuffer::default(), + gvas_file: None, + needs_refresh: true, + })) + } + + if res.hovered() { + ui.ctx().set_cursor_icon(CursorIcon::PointingHand); + } + } else { + Logger::info(format!("No such image: {}", container.path.as_str())); } + } }); }); From babf8ace21e14680b5ba559bce83d8bdee15bc75 Mon Sep 17 00:00:00 2001 From: Cal <43823915+CalRL@users.noreply.github.com> Date: Wed, 12 Nov 2025 17:38:09 +0100 Subject: [PATCH 18/49] use parsed_class --- src/ui/screen/party_screen.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/screen/party_screen.rs b/src/ui/screen/party_screen.rs index 6dbe35d..e7678e4 100644 --- a/src/ui/screen/party_screen.rs +++ b/src/ui/screen/party_screen.rs @@ -111,7 +111,7 @@ impl ScreenTrait for PartyScreen { let res = ui.add(image); if res.clicked() { - Logger::info_once(format!("{} Clicked!", container.class)); + Logger::info_once(format!("{} Clicked!", container.parsed_class)); let mon: SelectedMon = SelectedMon { storage_type: StorageType::PARTY, From c3607b018333adbd697d2e55a431df5caf2450ce Mon Sep 17 00:00:00 2001 From: Cal <43823915+CalRL@users.noreply.github.com> Date: Wed, 12 Nov 2025 17:38:19 +0100 Subject: [PATCH 19/49] update Cargo --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 66043ad..55b9946 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1664,7 +1664,7 @@ dependencies = [ [[package]] name = "gammaeditor" -version = "0.1.0" +version = "0.2.0" dependencies = [ "chrono", "criterion", diff --git a/Cargo.toml b/Cargo.toml index 16730d6..ba414fd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "gammaeditor" -version = "0.1.0" +version = "0.2.0" description = "A PkHex esque app for Gamma Engine games" authors = ["CalRL"] edition = "2021" From 1a4c009511ee697827241958b9ffda62cca78871 Mon Sep 17 00:00:00 2001 From: Cal <43823915+CalRL@users.noreply.github.com> Date: Wed, 12 Nov 2025 17:40:26 +0100 Subject: [PATCH 20/49] include version in app title --- src/main.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index 4a746a0..9e0541f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,15 +2,16 @@ use eframe::NativeOptions; use gammaeditor::app::App; use gammaeditor::logger::Logger; use std::process; +use egui::TextBuffer; fn main() { Logger::init().unwrap(); let native_options: NativeOptions = NativeOptions::default(); - let app_name: &str = "GammaEditor"; + let app_name: String = format!("GammaEditor {}", env!("CARGO_PKG_VERSION")); eframe::run_native( - app_name, + app_name.as_str(), native_options, Box::new(|cc| { egui_extras::install_image_loaders(&cc.egui_ctx); From a8a3e1219700f159656124d4f9aa16a76f1f26c0 Mon Sep 17 00:00:00 2001 From: Cal <43823915+CalRL@users.noreply.github.com> Date: Wed, 12 Nov 2025 17:48:54 +0100 Subject: [PATCH 21/49] Add Changelog --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..d1646cd --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,7 @@ +# Changelog + +## [0.2.0] +- Added nickname editor +- Added icon in singlescreen +- Added shiny toggle +- Images are now loaded from cache on startup (rather than loaded at runtime) \ No newline at end of file From b661b2357e80a79968ac56b5e956f4ffabd179ee Mon Sep 17 00:00:00 2001 From: Cal <43823915+CalRL@users.noreply.github.com> Date: Wed, 12 Nov 2025 18:46:49 +0100 Subject: [PATCH 22/49] remove images from gitignore --- .gitignore | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 4804dba..8370dee 100644 --- a/.gitignore +++ b/.gitignore @@ -136,5 +136,4 @@ dist # Generated by Cargo # will have compiled files and executables -/target/ -/images/ \ No newline at end of file +/target/ \ No newline at end of file From 5d2c2c17ca536bcdb3642f0b0ac07c2cbc938e9f Mon Sep 17 00:00:00 2001 From: Cal <43823915+CalRL@users.noreply.github.com> Date: Wed, 12 Nov 2025 18:47:51 +0100 Subject: [PATCH 23/49] add images --- images/non_shiny.png | Bin 0 -> 3845 bytes images/normal/Abra.png | Bin 0 -> 553 bytes images/normal/Absol.png | Bin 0 -> 782 bytes images/normal/Aggron.png | Bin 0 -> 1049 bytes images/normal/Alakazam.png | Bin 0 -> 764 bytes images/normal/Altaria.png | Bin 0 -> 707 bytes images/normal/Anorith.png | Bin 0 -> 624 bytes images/normal/Armaldo.png | Bin 0 -> 1058 bytes images/normal/Aron.png | Bin 0 -> 337 bytes images/normal/Azumarill.png | Bin 0 -> 543 bytes images/normal/Azurill.png | Bin 0 -> 520 bytes images/normal/Bagon.png | Bin 0 -> 443 bytes images/normal/Baltoy.png | Bin 0 -> 359 bytes images/normal/Banette.png | Bin 0 -> 488 bytes images/normal/Barboach.png | Bin 0 -> 509 bytes images/normal/Beautifly.png | Bin 0 -> 624 bytes images/normal/Beldum.png | Bin 0 -> 427 bytes images/normal/Bellossom.png | Bin 0 -> 474 bytes images/normal/Blaziken.png | Bin 0 -> 870 bytes images/normal/Breloom.png | Bin 0 -> 746 bytes images/normal/Cacnea.png | Bin 0 -> 610 bytes images/normal/Cacturne.png | Bin 0 -> 809 bytes images/normal/Camerupt.png | Bin 0 -> 746 bytes images/normal/Carvanha.png | Bin 0 -> 627 bytes images/normal/Cascoon.png | Bin 0 -> 434 bytes images/normal/Castform.png | Bin 0 -> 324 bytes images/normal/Chimecho.png | Bin 0 -> 403 bytes images/normal/Chinchou.png | Bin 0 -> 533 bytes images/normal/Clamperl.png | Bin 0 -> 558 bytes images/normal/Claydol.png | Bin 0 -> 666 bytes images/normal/Combusken.png | Bin 0 -> 754 bytes images/normal/Corphish.png | Bin 0 -> 636 bytes images/normal/Corsola.png | Bin 0 -> 523 bytes images/normal/Cradily.png | Bin 0 -> 770 bytes images/normal/Crawdaunt.png | Bin 0 -> 910 bytes images/normal/Crobat.png | Bin 0 -> 668 bytes images/normal/Delcatty.png | Bin 0 -> 687 bytes images/normal/Deoxys.png | Bin 0 -> 743 bytes images/normal/Dodrio.png | Bin 0 -> 972 bytes images/normal/Doduo.png | Bin 0 -> 627 bytes images/normal/Donphan.png | Bin 0 -> 808 bytes images/normal/Dragonite.png | Bin 0 -> 989 bytes images/normal/Dusclops.png | Bin 0 -> 677 bytes images/normal/Duskull.png | Bin 0 -> 522 bytes images/normal/Dustox.png | Bin 0 -> 621 bytes images/normal/Electrike.png | Bin 0 -> 453 bytes images/normal/Electrode.png | Bin 0 -> 426 bytes images/normal/Exploud.png | Bin 0 -> 1031 bytes images/normal/Feebas.png | Bin 0 -> 488 bytes images/normal/Flygon.png | Bin 0 -> 918 bytes images/normal/Gardevoir.png | Bin 0 -> 642 bytes images/normal/Geodude.png | Bin 0 -> 424 bytes images/normal/Girafarig.png | Bin 0 -> 774 bytes images/normal/Glalie.png | Bin 0 -> 708 bytes images/normal/Gloom.png | Bin 0 -> 647 bytes images/normal/Golbat.png | Bin 0 -> 664 bytes images/normal/Goldeen.png | Bin 0 -> 652 bytes images/normal/Golduck.png | Bin 0 -> 756 bytes images/normal/Golem.png | Bin 0 -> 834 bytes images/normal/Gorebyss.png | Bin 0 -> 575 bytes images/normal/Graveler.png | Bin 0 -> 760 bytes images/normal/Grimer.png | Bin 0 -> 553 bytes images/normal/Groudon.png | Bin 0 -> 1113 bytes images/normal/Grovyle.png | Bin 0 -> 855 bytes images/normal/Grumpig.png | Bin 0 -> 731 bytes images/normal/Gulpin.png | Bin 0 -> 371 bytes images/normal/Gyarados.png | Bin 0 -> 1048 bytes images/normal/Hariyama.png | Bin 0 -> 886 bytes images/normal/Heracross.png | Bin 0 -> 754 bytes images/normal/Horsea.png | Bin 0 -> 439 bytes images/normal/Huntail.png | Bin 0 -> 724 bytes images/normal/Igglybuff.png | Bin 0 -> 329 bytes images/normal/Illumise.png | Bin 0 -> 666 bytes images/normal/Jigglypuff.png | Bin 0 -> 437 bytes images/normal/Jirachi.png | Bin 0 -> 561 bytes images/normal/Kadabra.png | Bin 0 -> 870 bytes images/normal/Kecleon.png | Bin 0 -> 678 bytes images/normal/Kingdra.png | Bin 0 -> 784 bytes images/normal/Kirlia.png | Bin 0 -> 557 bytes images/normal/Koffing.png | Bin 0 -> 636 bytes images/normal/Kyogre.png | Bin 0 -> 833 bytes images/normal/Lairon.png | Bin 0 -> 736 bytes images/normal/Lanturn.png | Bin 0 -> 659 bytes images/normal/Latias.png | Bin 0 -> 764 bytes images/normal/Latios.png | Bin 0 -> 839 bytes images/normal/Lileep.png | Bin 0 -> 614 bytes images/normal/Linoone.png | Bin 0 -> 603 bytes images/normal/Lombre.png | Bin 0 -> 569 bytes images/normal/Lotad.png | Bin 0 -> 436 bytes images/normal/Loudred.png | Bin 0 -> 853 bytes images/normal/Ludicolo.png | Bin 0 -> 887 bytes images/normal/Lunatone.png | Bin 0 -> 584 bytes images/normal/Luvdisc.png | Bin 0 -> 289 bytes images/normal/Machamp.png | Bin 0 -> 1022 bytes images/normal/Machoke.png | Bin 0 -> 702 bytes images/normal/Machop.png | Bin 0 -> 488 bytes images/normal/Magcargo.png | Bin 0 -> 642 bytes images/normal/Magikarp.png | Bin 0 -> 644 bytes images/normal/Magnemite.png | Bin 0 -> 356 bytes images/normal/Magneton.png | Bin 0 -> 764 bytes images/normal/Makuhita.png | Bin 0 -> 550 bytes images/normal/Manectric.png | Bin 0 -> 608 bytes images/normal/Marill.png | Bin 0 -> 495 bytes images/normal/Marshtomp.png | Bin 0 -> 639 bytes images/normal/Masquerain.png | Bin 0 -> 679 bytes images/normal/Mawile.png | Bin 0 -> 675 bytes images/normal/Medicham.png | Bin 0 -> 622 bytes images/normal/Meditite.png | Bin 0 -> 504 bytes images/normal/Metagross.png | Bin 0 -> 828 bytes images/normal/Metang.png | Bin 0 -> 812 bytes images/normal/Mightyena.png | Bin 0 -> 768 bytes images/normal/Milotic.png | Bin 0 -> 846 bytes images/normal/Minun.png | Bin 0 -> 435 bytes images/normal/Mudkip.png | Bin 0 -> 516 bytes images/normal/Muk.png | Bin 0 -> 768 bytes images/normal/Natu.png | Bin 0 -> 343 bytes images/normal/Nincada.png | Bin 0 -> 524 bytes images/normal/Ninetales.png | Bin 0 -> 789 bytes images/normal/Ninjask.png | Bin 0 -> 660 bytes images/normal/Nosepass.png | Bin 0 -> 490 bytes images/normal/Numel.png | Bin 0 -> 503 bytes images/normal/Nuzleaf.png | Bin 0 -> 545 bytes images/normal/Oddish.png | Bin 0 -> 385 bytes images/normal/Pelipper.png | Bin 0 -> 675 bytes images/normal/Phanpy.png | Bin 0 -> 409 bytes images/normal/Pichu.png | Bin 0 -> 395 bytes images/normal/Pikachu.png | Bin 0 -> 523 bytes images/normal/Pinsir.png | Bin 0 -> 767 bytes images/normal/Plusle.png | Bin 0 -> 459 bytes images/normal/Poochyena.png | Bin 0 -> 520 bytes images/normal/Psyduck.png | Bin 0 -> 495 bytes images/normal/Raichu.png | Bin 0 -> 728 bytes images/normal/Ralts.png | Bin 0 -> 393 bytes images/normal/Rayquaza.png | Bin 0 -> 923 bytes images/normal/Regice.png | Bin 0 -> 769 bytes images/normal/Regirock.png | Bin 0 -> 867 bytes images/normal/Registeel.png | Bin 0 -> 831 bytes images/normal/Relicanth.png | Bin 0 -> 658 bytes images/normal/Rhydon.png | Bin 0 -> 921 bytes images/normal/Rhyhorn.png | Bin 0 -> 716 bytes images/normal/Roselia.png | Bin 0 -> 658 bytes images/normal/Sableye.png | Bin 0 -> 558 bytes images/normal/Salamence.png | Bin 0 -> 798 bytes images/normal/Sandshrew.png | Bin 0 -> 524 bytes images/normal/Sandslash.png | Bin 0 -> 758 bytes images/normal/Sceptile.png | Bin 0 -> 955 bytes images/normal/Seadra.png | Bin 0 -> 677 bytes images/normal/Seaking.png | Bin 0 -> 848 bytes images/normal/Sealeo.png | Bin 0 -> 656 bytes images/normal/Seedot.png | Bin 0 -> 435 bytes images/normal/Seviper.png | Bin 0 -> 778 bytes images/normal/Sharpedo.png | Bin 0 -> 646 bytes images/normal/Shedinja.png | Bin 0 -> 566 bytes images/normal/Shelgon.png | Bin 0 -> 552 bytes images/normal/Shiftry.png | Bin 0 -> 871 bytes images/normal/Shroomish.png | Bin 0 -> 433 bytes images/normal/Shuppet.png | Bin 0 -> 381 bytes images/normal/Silcoon.png | Bin 0 -> 458 bytes images/normal/Skarmory.png | Bin 0 -> 881 bytes images/normal/Skitty.png | Bin 0 -> 559 bytes images/normal/Slaking.png | Bin 0 -> 901 bytes images/normal/Slakoth.png | Bin 0 -> 533 bytes images/normal/Slugma.png | Bin 0 -> 455 bytes images/normal/Snorunt.png | Bin 0 -> 512 bytes images/normal/Solrock.png | Bin 0 -> 861 bytes images/normal/Spheal.png | Bin 0 -> 451 bytes images/normal/Spinda.png | Bin 0 -> 548 bytes images/normal/Spoink.png | Bin 0 -> 433 bytes images/normal/Starmie.png | Bin 0 -> 763 bytes images/normal/Staryu.png | Bin 0 -> 556 bytes images/normal/Surskit.png | Bin 0 -> 367 bytes images/normal/Swablu.png | Bin 0 -> 503 bytes images/normal/Swalot.png | Bin 0 -> 578 bytes images/normal/Swampert.png | Bin 0 -> 1014 bytes images/normal/Swellow.png | Bin 0 -> 704 bytes images/normal/Taillow.png | Bin 0 -> 452 bytes images/normal/Tentacool.png | Bin 0 -> 504 bytes images/normal/Tentacruel.png | Bin 0 -> 868 bytes images/normal/Torchic.png | Bin 0 -> 463 bytes images/normal/Torkoal.png | Bin 0 -> 859 bytes images/normal/Trapinch.png | Bin 0 -> 369 bytes images/normal/Treecko.png | Bin 0 -> 577 bytes images/normal/Tropius.png | Bin 0 -> 1036 bytes images/normal/Vibrava.png | Bin 0 -> 619 bytes images/normal/Vigoroth.png | Bin 0 -> 790 bytes images/normal/Vileplume.png | Bin 0 -> 653 bytes images/normal/Volbeat.png | Bin 0 -> 683 bytes images/normal/Voltorb.png | Bin 0 -> 346 bytes images/normal/Vulpix.png | Bin 0 -> 621 bytes images/normal/Wailmer.png | Bin 0 -> 524 bytes images/normal/Wailord.png | Bin 0 -> 640 bytes images/normal/Walrein.png | Bin 0 -> 875 bytes images/normal/Weezing.png | Bin 0 -> 876 bytes images/normal/Whiscash.png | Bin 0 -> 649 bytes images/normal/Whismur.png | Bin 0 -> 450 bytes images/normal/Wigglytuff.png | Bin 0 -> 615 bytes images/normal/Wingull.png | Bin 0 -> 425 bytes images/normal/Wobbuffet.png | Bin 0 -> 595 bytes images/normal/Wurmple.png | Bin 0 -> 478 bytes images/normal/Wynaut.png | Bin 0 -> 463 bytes images/normal/Xatu.png | Bin 0 -> 534 bytes images/normal/Zangoose.png | Bin 0 -> 747 bytes images/normal/Zigzagoon.png | Bin 0 -> 708 bytes images/normal/Zubat.png | Bin 0 -> 535 bytes images/shiny.png | Bin 0 -> 5287 bytes images/shiny/Abra.png | Bin 0 -> 553 bytes images/shiny/Absol.png | Bin 0 -> 782 bytes images/shiny/Aggron.png | Bin 0 -> 1049 bytes images/shiny/Alakazam.png | Bin 0 -> 819 bytes images/shiny/Altaria.png | Bin 0 -> 707 bytes images/shiny/Anorith.png | Bin 0 -> 624 bytes images/shiny/Armaldo.png | Bin 0 -> 1058 bytes images/shiny/Aron.png | Bin 0 -> 337 bytes images/shiny/Azumarill.png | Bin 0 -> 543 bytes images/shiny/Azurill.png | Bin 0 -> 520 bytes images/shiny/Bagon.png | Bin 0 -> 443 bytes images/shiny/Baltoy.png | Bin 0 -> 359 bytes images/shiny/Banette.png | Bin 0 -> 488 bytes images/shiny/Barboach.png | Bin 0 -> 509 bytes images/shiny/Beautifly.png | Bin 0 -> 624 bytes images/shiny/Beldum.png | Bin 0 -> 427 bytes images/shiny/Bellossom.png | Bin 0 -> 474 bytes images/shiny/Blaziken.png | Bin 0 -> 870 bytes images/shiny/Breloom.png | Bin 0 -> 747 bytes images/shiny/Cacnea.png | Bin 0 -> 610 bytes images/shiny/Cacturne.png | Bin 0 -> 809 bytes images/shiny/Camerupt.png | Bin 0 -> 742 bytes images/shiny/Carvanha.png | Bin 0 -> 627 bytes images/shiny/Cascoon.png | Bin 0 -> 434 bytes images/shiny/Castform.png | Bin 0 -> 336 bytes images/shiny/Chimecho.png | Bin 0 -> 403 bytes images/shiny/Chinchou.png | Bin 0 -> 533 bytes images/shiny/Clamperl.png | Bin 0 -> 558 bytes images/shiny/Claydol.png | Bin 0 -> 666 bytes images/shiny/Combusken.png | Bin 0 -> 749 bytes images/shiny/Corphish.png | Bin 0 -> 635 bytes images/shiny/Corsola.png | Bin 0 -> 529 bytes images/shiny/Cradily.png | Bin 0 -> 770 bytes images/shiny/Crawdaunt.png | Bin 0 -> 903 bytes images/shiny/Crobat.png | Bin 0 -> 668 bytes images/shiny/Delcatty.png | Bin 0 -> 687 bytes images/shiny/Deoxys.png | Bin 0 -> 743 bytes images/shiny/Dodrio.png | Bin 0 -> 972 bytes images/shiny/Doduo.png | Bin 0 -> 627 bytes images/shiny/Donphan.png | Bin 0 -> 808 bytes images/shiny/Dragonite.png | Bin 0 -> 989 bytes images/shiny/Dusclops.png | Bin 0 -> 677 bytes images/shiny/Duskull.png | Bin 0 -> 522 bytes images/shiny/Dustox.png | Bin 0 -> 621 bytes images/shiny/Electrike.png | Bin 0 -> 453 bytes images/shiny/Electrode.png | Bin 0 -> 426 bytes images/shiny/Exploud.png | Bin 0 -> 1031 bytes images/shiny/Feebas.png | Bin 0 -> 488 bytes images/shiny/Flygon.png | Bin 0 -> 918 bytes images/shiny/Gardevoir.png | Bin 0 -> 642 bytes images/shiny/Geodude.png | Bin 0 -> 424 bytes images/shiny/Girafarig.png | Bin 0 -> 775 bytes images/shiny/Glalie.png | Bin 0 -> 708 bytes images/shiny/Gloom.png | Bin 0 -> 647 bytes images/shiny/Golbat.png | Bin 0 -> 664 bytes images/shiny/Goldeen.png | Bin 0 -> 663 bytes images/shiny/Golduck.png | Bin 0 -> 756 bytes images/shiny/Golem.png | Bin 0 -> 834 bytes images/shiny/Gorebyss.png | Bin 0 -> 575 bytes images/shiny/Graveler.png | Bin 0 -> 759 bytes images/shiny/Grimer.png | Bin 0 -> 553 bytes images/shiny/Groudon.png | Bin 0 -> 1113 bytes images/shiny/Grovyle.png | Bin 0 -> 855 bytes images/shiny/Grumpig.png | Bin 0 -> 731 bytes images/shiny/Gulpin.png | Bin 0 -> 371 bytes images/shiny/Gyarados.png | Bin 0 -> 1048 bytes images/shiny/Hariyama.png | Bin 0 -> 886 bytes images/shiny/Heracross.png | Bin 0 -> 754 bytes images/shiny/Horsea.png | Bin 0 -> 439 bytes images/shiny/Huntail.png | Bin 0 -> 724 bytes images/shiny/Igglybuff.png | Bin 0 -> 329 bytes images/shiny/Illumise.png | Bin 0 -> 666 bytes images/shiny/Jigglypuff.png | Bin 0 -> 437 bytes images/shiny/Jirachi.png | Bin 0 -> 561 bytes images/shiny/Kadabra.png | Bin 0 -> 870 bytes images/shiny/Kecleon.png | Bin 0 -> 678 bytes images/shiny/Kingdra.png | Bin 0 -> 784 bytes images/shiny/Kirlia.png | Bin 0 -> 557 bytes images/shiny/Koffing.png | Bin 0 -> 636 bytes images/shiny/Kyogre.png | Bin 0 -> 833 bytes images/shiny/Lairon.png | Bin 0 -> 736 bytes images/shiny/Lanturn.png | Bin 0 -> 660 bytes images/shiny/Latias.png | Bin 0 -> 764 bytes images/shiny/Latios.png | Bin 0 -> 829 bytes images/shiny/Lileep.png | Bin 0 -> 614 bytes images/shiny/Linoone.png | Bin 0 -> 603 bytes images/shiny/Lombre.png | Bin 0 -> 569 bytes images/shiny/Lotad.png | Bin 0 -> 435 bytes images/shiny/Loudred.png | Bin 0 -> 853 bytes images/shiny/Ludicolo.png | Bin 0 -> 887 bytes images/shiny/Lunatone.png | Bin 0 -> 585 bytes images/shiny/Luvdisc.png | Bin 0 -> 289 bytes images/shiny/Machamp.png | Bin 0 -> 1022 bytes images/shiny/Machoke.png | Bin 0 -> 702 bytes images/shiny/Machop.png | Bin 0 -> 488 bytes images/shiny/Magcargo.png | Bin 0 -> 634 bytes images/shiny/Magikarp.png | Bin 0 -> 649 bytes images/shiny/Magnemite.png | Bin 0 -> 334 bytes images/shiny/Magneton.png | Bin 0 -> 719 bytes images/shiny/Makuhita.png | Bin 0 -> 540 bytes images/shiny/Manectric.png | Bin 0 -> 609 bytes images/shiny/Marill.png | Bin 0 -> 495 bytes images/shiny/Marshtomp.png | Bin 0 -> 639 bytes images/shiny/Masquerain.png | Bin 0 -> 686 bytes images/shiny/Mawile.png | Bin 0 -> 675 bytes images/shiny/Medicham.png | Bin 0 -> 621 bytes images/shiny/Meditite.png | Bin 0 -> 495 bytes images/shiny/Metagross.png | Bin 0 -> 828 bytes images/shiny/Metang.png | Bin 0 -> 812 bytes images/shiny/Mightyena.png | Bin 0 -> 764 bytes images/shiny/Milotic.png | Bin 0 -> 846 bytes images/shiny/Minun.png | Bin 0 -> 435 bytes images/shiny/Mudkip.png | Bin 0 -> 516 bytes images/shiny/Muk.png | Bin 0 -> 768 bytes images/shiny/Natu.png | Bin 0 -> 344 bytes images/shiny/Nincada.png | Bin 0 -> 524 bytes images/shiny/Ninetales.png | Bin 0 -> 789 bytes images/shiny/Ninjask.png | Bin 0 -> 632 bytes images/shiny/Nosepass.png | Bin 0 -> 490 bytes images/shiny/Numel.png | Bin 0 -> 503 bytes images/shiny/Nuzleaf.png | Bin 0 -> 545 bytes images/shiny/Oddish.png | Bin 0 -> 385 bytes images/shiny/Pelipper.png | Bin 0 -> 675 bytes images/shiny/Phanpy.png | Bin 0 -> 409 bytes images/shiny/Pichu.png | Bin 0 -> 395 bytes images/shiny/Pikachu.png | Bin 0 -> 523 bytes images/shiny/Pinsir.png | Bin 0 -> 767 bytes images/shiny/Plusle.png | Bin 0 -> 459 bytes images/shiny/Poochyena.png | Bin 0 -> 520 bytes images/shiny/Psyduck.png | Bin 0 -> 495 bytes images/shiny/Raichu.png | Bin 0 -> 728 bytes images/shiny/Ralts.png | Bin 0 -> 393 bytes images/shiny/Rayquaza.png | Bin 0 -> 911 bytes images/shiny/Regice.png | Bin 0 -> 769 bytes images/shiny/Regirock.png | Bin 0 -> 867 bytes images/shiny/Registeel.png | Bin 0 -> 831 bytes images/shiny/Relicanth.png | Bin 0 -> 658 bytes images/shiny/Rhydon.png | Bin 0 -> 921 bytes images/shiny/Rhyhorn.png | Bin 0 -> 716 bytes images/shiny/Roselia.png | Bin 0 -> 658 bytes images/shiny/Sableye.png | Bin 0 -> 558 bytes images/shiny/Salamence.png | Bin 0 -> 798 bytes images/shiny/Sandshrew.png | Bin 0 -> 524 bytes images/shiny/Sandslash.png | Bin 0 -> 758 bytes images/shiny/Sceptile.png | Bin 0 -> 955 bytes images/shiny/Seadra.png | Bin 0 -> 677 bytes images/shiny/Seaking.png | Bin 0 -> 855 bytes images/shiny/Sealeo.png | Bin 0 -> 656 bytes images/shiny/Seedot.png | Bin 0 -> 435 bytes images/shiny/Seviper.png | Bin 0 -> 778 bytes images/shiny/Sharpedo.png | Bin 0 -> 646 bytes images/shiny/Shedinja.png | Bin 0 -> 565 bytes images/shiny/Shelgon.png | Bin 0 -> 551 bytes images/shiny/Shiftry.png | Bin 0 -> 871 bytes images/shiny/Shroomish.png | Bin 0 -> 433 bytes images/shiny/Shuppet.png | Bin 0 -> 381 bytes images/shiny/Silcoon.png | Bin 0 -> 458 bytes images/shiny/Skarmory.png | Bin 0 -> 881 bytes images/shiny/Skitty.png | Bin 0 -> 559 bytes images/shiny/Slaking.png | Bin 0 -> 901 bytes images/shiny/Slakoth.png | Bin 0 -> 533 bytes images/shiny/Slugma.png | Bin 0 -> 465 bytes images/shiny/Snorunt.png | Bin 0 -> 512 bytes images/shiny/Solrock.png | Bin 0 -> 861 bytes images/shiny/Spheal.png | Bin 0 -> 451 bytes images/shiny/Spinda.png | Bin 0 -> 548 bytes images/shiny/Spoink.png | Bin 0 -> 428 bytes images/shiny/Starmie.png | Bin 0 -> 763 bytes images/shiny/Staryu.png | Bin 0 -> 556 bytes images/shiny/Surskit.png | Bin 0 -> 361 bytes images/shiny/Swablu.png | Bin 0 -> 494 bytes images/shiny/Swalot.png | Bin 0 -> 550 bytes images/shiny/Swampert.png | Bin 0 -> 1014 bytes images/shiny/Swellow.png | Bin 0 -> 704 bytes images/shiny/Taillow.png | Bin 0 -> 452 bytes images/shiny/Tentacool.png | Bin 0 -> 504 bytes images/shiny/Tentacruel.png | Bin 0 -> 868 bytes images/shiny/Torchic.png | Bin 0 -> 457 bytes images/shiny/Torkoal.png | Bin 0 -> 859 bytes images/shiny/Trapinch.png | Bin 0 -> 369 bytes images/shiny/Treecko.png | Bin 0 -> 577 bytes images/shiny/Tropius.png | Bin 0 -> 1036 bytes images/shiny/Vibrava.png | Bin 0 -> 619 bytes images/shiny/Vigoroth.png | Bin 0 -> 790 bytes images/shiny/Vileplume.png | Bin 0 -> 648 bytes images/shiny/Volbeat.png | Bin 0 -> 683 bytes images/shiny/Voltorb.png | Bin 0 -> 346 bytes images/shiny/Vulpix.png | Bin 0 -> 621 bytes images/shiny/Wailmer.png | Bin 0 -> 524 bytes images/shiny/Wailord.png | Bin 0 -> 640 bytes images/shiny/Walrein.png | Bin 0 -> 875 bytes images/shiny/Weezing.png | Bin 0 -> 876 bytes images/shiny/Whiscash.png | Bin 0 -> 649 bytes images/shiny/Whismur.png | Bin 0 -> 450 bytes images/shiny/Wigglytuff.png | Bin 0 -> 615 bytes images/shiny/Wingull.png | Bin 0 -> 425 bytes images/shiny/Wobbuffet.png | Bin 0 -> 595 bytes images/shiny/Wurmple.png | Bin 0 -> 478 bytes images/shiny/Wynaut.png | Bin 0 -> 463 bytes images/shiny/Xatu.png | Bin 0 -> 534 bytes images/shiny/Zangoose.png | Bin 0 -> 747 bytes images/shiny/Zigzagoon.png | Bin 0 -> 708 bytes images/shiny/Zubat.png | Bin 0 -> 535 bytes 408 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/non_shiny.png create mode 100644 images/normal/Abra.png create mode 100644 images/normal/Absol.png create mode 100644 images/normal/Aggron.png create mode 100644 images/normal/Alakazam.png create mode 100644 images/normal/Altaria.png create mode 100644 images/normal/Anorith.png create mode 100644 images/normal/Armaldo.png create mode 100644 images/normal/Aron.png create mode 100644 images/normal/Azumarill.png create mode 100644 images/normal/Azurill.png create mode 100644 images/normal/Bagon.png create mode 100644 images/normal/Baltoy.png create mode 100644 images/normal/Banette.png create mode 100644 images/normal/Barboach.png create mode 100644 images/normal/Beautifly.png create mode 100644 images/normal/Beldum.png create mode 100644 images/normal/Bellossom.png create mode 100644 images/normal/Blaziken.png create mode 100644 images/normal/Breloom.png create mode 100644 images/normal/Cacnea.png create mode 100644 images/normal/Cacturne.png create mode 100644 images/normal/Camerupt.png create mode 100644 images/normal/Carvanha.png create mode 100644 images/normal/Cascoon.png create mode 100644 images/normal/Castform.png create mode 100644 images/normal/Chimecho.png create mode 100644 images/normal/Chinchou.png create mode 100644 images/normal/Clamperl.png create mode 100644 images/normal/Claydol.png create mode 100644 images/normal/Combusken.png create mode 100644 images/normal/Corphish.png create mode 100644 images/normal/Corsola.png create mode 100644 images/normal/Cradily.png create mode 100644 images/normal/Crawdaunt.png create mode 100644 images/normal/Crobat.png create mode 100644 images/normal/Delcatty.png create mode 100644 images/normal/Deoxys.png create mode 100644 images/normal/Dodrio.png create mode 100644 images/normal/Doduo.png create mode 100644 images/normal/Donphan.png create mode 100644 images/normal/Dragonite.png create mode 100644 images/normal/Dusclops.png create mode 100644 images/normal/Duskull.png create mode 100644 images/normal/Dustox.png create mode 100644 images/normal/Electrike.png create mode 100644 images/normal/Electrode.png create mode 100644 images/normal/Exploud.png create mode 100644 images/normal/Feebas.png create mode 100644 images/normal/Flygon.png create mode 100644 images/normal/Gardevoir.png create mode 100644 images/normal/Geodude.png create mode 100644 images/normal/Girafarig.png create mode 100644 images/normal/Glalie.png create mode 100644 images/normal/Gloom.png create mode 100644 images/normal/Golbat.png create mode 100644 images/normal/Goldeen.png create mode 100644 images/normal/Golduck.png create mode 100644 images/normal/Golem.png create mode 100644 images/normal/Gorebyss.png create mode 100644 images/normal/Graveler.png create mode 100644 images/normal/Grimer.png create mode 100644 images/normal/Groudon.png create mode 100644 images/normal/Grovyle.png create mode 100644 images/normal/Grumpig.png create mode 100644 images/normal/Gulpin.png create mode 100644 images/normal/Gyarados.png create mode 100644 images/normal/Hariyama.png create mode 100644 images/normal/Heracross.png create mode 100644 images/normal/Horsea.png create mode 100644 images/normal/Huntail.png create mode 100644 images/normal/Igglybuff.png create mode 100644 images/normal/Illumise.png create mode 100644 images/normal/Jigglypuff.png create mode 100644 images/normal/Jirachi.png create mode 100644 images/normal/Kadabra.png create mode 100644 images/normal/Kecleon.png create mode 100644 images/normal/Kingdra.png create mode 100644 images/normal/Kirlia.png create mode 100644 images/normal/Koffing.png create mode 100644 images/normal/Kyogre.png create mode 100644 images/normal/Lairon.png create mode 100644 images/normal/Lanturn.png create mode 100644 images/normal/Latias.png create mode 100644 images/normal/Latios.png create mode 100644 images/normal/Lileep.png create mode 100644 images/normal/Linoone.png create mode 100644 images/normal/Lombre.png create mode 100644 images/normal/Lotad.png create mode 100644 images/normal/Loudred.png create mode 100644 images/normal/Ludicolo.png create mode 100644 images/normal/Lunatone.png create mode 100644 images/normal/Luvdisc.png create mode 100644 images/normal/Machamp.png create mode 100644 images/normal/Machoke.png create mode 100644 images/normal/Machop.png create mode 100644 images/normal/Magcargo.png create mode 100644 images/normal/Magikarp.png create mode 100644 images/normal/Magnemite.png create mode 100644 images/normal/Magneton.png create mode 100644 images/normal/Makuhita.png create mode 100644 images/normal/Manectric.png create mode 100644 images/normal/Marill.png create mode 100644 images/normal/Marshtomp.png create mode 100644 images/normal/Masquerain.png create mode 100644 images/normal/Mawile.png create mode 100644 images/normal/Medicham.png create mode 100644 images/normal/Meditite.png create mode 100644 images/normal/Metagross.png create mode 100644 images/normal/Metang.png create mode 100644 images/normal/Mightyena.png create mode 100644 images/normal/Milotic.png create mode 100644 images/normal/Minun.png create mode 100644 images/normal/Mudkip.png create mode 100644 images/normal/Muk.png create mode 100644 images/normal/Natu.png create mode 100644 images/normal/Nincada.png create mode 100644 images/normal/Ninetales.png create mode 100644 images/normal/Ninjask.png create mode 100644 images/normal/Nosepass.png create mode 100644 images/normal/Numel.png create mode 100644 images/normal/Nuzleaf.png create mode 100644 images/normal/Oddish.png create mode 100644 images/normal/Pelipper.png create mode 100644 images/normal/Phanpy.png create mode 100644 images/normal/Pichu.png create mode 100644 images/normal/Pikachu.png create mode 100644 images/normal/Pinsir.png create mode 100644 images/normal/Plusle.png create mode 100644 images/normal/Poochyena.png create mode 100644 images/normal/Psyduck.png create mode 100644 images/normal/Raichu.png create mode 100644 images/normal/Ralts.png create mode 100644 images/normal/Rayquaza.png create mode 100644 images/normal/Regice.png create mode 100644 images/normal/Regirock.png create mode 100644 images/normal/Registeel.png create mode 100644 images/normal/Relicanth.png create mode 100644 images/normal/Rhydon.png create mode 100644 images/normal/Rhyhorn.png create mode 100644 images/normal/Roselia.png create mode 100644 images/normal/Sableye.png create mode 100644 images/normal/Salamence.png create mode 100644 images/normal/Sandshrew.png create mode 100644 images/normal/Sandslash.png create mode 100644 images/normal/Sceptile.png create mode 100644 images/normal/Seadra.png create mode 100644 images/normal/Seaking.png create mode 100644 images/normal/Sealeo.png create mode 100644 images/normal/Seedot.png create mode 100644 images/normal/Seviper.png create mode 100644 images/normal/Sharpedo.png create mode 100644 images/normal/Shedinja.png create mode 100644 images/normal/Shelgon.png create mode 100644 images/normal/Shiftry.png create mode 100644 images/normal/Shroomish.png create mode 100644 images/normal/Shuppet.png create mode 100644 images/normal/Silcoon.png create mode 100644 images/normal/Skarmory.png create mode 100644 images/normal/Skitty.png create mode 100644 images/normal/Slaking.png create mode 100644 images/normal/Slakoth.png create mode 100644 images/normal/Slugma.png create mode 100644 images/normal/Snorunt.png create mode 100644 images/normal/Solrock.png create mode 100644 images/normal/Spheal.png create mode 100644 images/normal/Spinda.png create mode 100644 images/normal/Spoink.png create mode 100644 images/normal/Starmie.png create mode 100644 images/normal/Staryu.png create mode 100644 images/normal/Surskit.png create mode 100644 images/normal/Swablu.png create mode 100644 images/normal/Swalot.png create mode 100644 images/normal/Swampert.png create mode 100644 images/normal/Swellow.png create mode 100644 images/normal/Taillow.png create mode 100644 images/normal/Tentacool.png create mode 100644 images/normal/Tentacruel.png create mode 100644 images/normal/Torchic.png create mode 100644 images/normal/Torkoal.png create mode 100644 images/normal/Trapinch.png create mode 100644 images/normal/Treecko.png create mode 100644 images/normal/Tropius.png create mode 100644 images/normal/Vibrava.png create mode 100644 images/normal/Vigoroth.png create mode 100644 images/normal/Vileplume.png create mode 100644 images/normal/Volbeat.png create mode 100644 images/normal/Voltorb.png create mode 100644 images/normal/Vulpix.png create mode 100644 images/normal/Wailmer.png create mode 100644 images/normal/Wailord.png create mode 100644 images/normal/Walrein.png create mode 100644 images/normal/Weezing.png create mode 100644 images/normal/Whiscash.png create mode 100644 images/normal/Whismur.png create mode 100644 images/normal/Wigglytuff.png create mode 100644 images/normal/Wingull.png create mode 100644 images/normal/Wobbuffet.png create mode 100644 images/normal/Wurmple.png create mode 100644 images/normal/Wynaut.png create mode 100644 images/normal/Xatu.png create mode 100644 images/normal/Zangoose.png create mode 100644 images/normal/Zigzagoon.png create mode 100644 images/normal/Zubat.png create mode 100644 images/shiny.png create mode 100644 images/shiny/Abra.png create mode 100644 images/shiny/Absol.png create mode 100644 images/shiny/Aggron.png create mode 100644 images/shiny/Alakazam.png create mode 100644 images/shiny/Altaria.png create mode 100644 images/shiny/Anorith.png create mode 100644 images/shiny/Armaldo.png create mode 100644 images/shiny/Aron.png create mode 100644 images/shiny/Azumarill.png create mode 100644 images/shiny/Azurill.png create mode 100644 images/shiny/Bagon.png create mode 100644 images/shiny/Baltoy.png create mode 100644 images/shiny/Banette.png create mode 100644 images/shiny/Barboach.png create mode 100644 images/shiny/Beautifly.png create mode 100644 images/shiny/Beldum.png create mode 100644 images/shiny/Bellossom.png create mode 100644 images/shiny/Blaziken.png create mode 100644 images/shiny/Breloom.png create mode 100644 images/shiny/Cacnea.png create mode 100644 images/shiny/Cacturne.png create mode 100644 images/shiny/Camerupt.png create mode 100644 images/shiny/Carvanha.png create mode 100644 images/shiny/Cascoon.png create mode 100644 images/shiny/Castform.png create mode 100644 images/shiny/Chimecho.png create mode 100644 images/shiny/Chinchou.png create mode 100644 images/shiny/Clamperl.png create mode 100644 images/shiny/Claydol.png create mode 100644 images/shiny/Combusken.png create mode 100644 images/shiny/Corphish.png create mode 100644 images/shiny/Corsola.png create mode 100644 images/shiny/Cradily.png create mode 100644 images/shiny/Crawdaunt.png create mode 100644 images/shiny/Crobat.png create mode 100644 images/shiny/Delcatty.png create mode 100644 images/shiny/Deoxys.png create mode 100644 images/shiny/Dodrio.png create mode 100644 images/shiny/Doduo.png create mode 100644 images/shiny/Donphan.png create mode 100644 images/shiny/Dragonite.png create mode 100644 images/shiny/Dusclops.png create mode 100644 images/shiny/Duskull.png create mode 100644 images/shiny/Dustox.png create mode 100644 images/shiny/Electrike.png create mode 100644 images/shiny/Electrode.png create mode 100644 images/shiny/Exploud.png create mode 100644 images/shiny/Feebas.png create mode 100644 images/shiny/Flygon.png create mode 100644 images/shiny/Gardevoir.png create mode 100644 images/shiny/Geodude.png create mode 100644 images/shiny/Girafarig.png create mode 100644 images/shiny/Glalie.png create mode 100644 images/shiny/Gloom.png create mode 100644 images/shiny/Golbat.png create mode 100644 images/shiny/Goldeen.png create mode 100644 images/shiny/Golduck.png create mode 100644 images/shiny/Golem.png create mode 100644 images/shiny/Gorebyss.png create mode 100644 images/shiny/Graveler.png create mode 100644 images/shiny/Grimer.png create mode 100644 images/shiny/Groudon.png create mode 100644 images/shiny/Grovyle.png create mode 100644 images/shiny/Grumpig.png create mode 100644 images/shiny/Gulpin.png create mode 100644 images/shiny/Gyarados.png create mode 100644 images/shiny/Hariyama.png create mode 100644 images/shiny/Heracross.png create mode 100644 images/shiny/Horsea.png create mode 100644 images/shiny/Huntail.png create mode 100644 images/shiny/Igglybuff.png create mode 100644 images/shiny/Illumise.png create mode 100644 images/shiny/Jigglypuff.png create mode 100644 images/shiny/Jirachi.png create mode 100644 images/shiny/Kadabra.png create mode 100644 images/shiny/Kecleon.png create mode 100644 images/shiny/Kingdra.png create mode 100644 images/shiny/Kirlia.png create mode 100644 images/shiny/Koffing.png create mode 100644 images/shiny/Kyogre.png create mode 100644 images/shiny/Lairon.png create mode 100644 images/shiny/Lanturn.png create mode 100644 images/shiny/Latias.png create mode 100644 images/shiny/Latios.png create mode 100644 images/shiny/Lileep.png create mode 100644 images/shiny/Linoone.png create mode 100644 images/shiny/Lombre.png create mode 100644 images/shiny/Lotad.png create mode 100644 images/shiny/Loudred.png create mode 100644 images/shiny/Ludicolo.png create mode 100644 images/shiny/Lunatone.png create mode 100644 images/shiny/Luvdisc.png create mode 100644 images/shiny/Machamp.png create mode 100644 images/shiny/Machoke.png create mode 100644 images/shiny/Machop.png create mode 100644 images/shiny/Magcargo.png create mode 100644 images/shiny/Magikarp.png create mode 100644 images/shiny/Magnemite.png create mode 100644 images/shiny/Magneton.png create mode 100644 images/shiny/Makuhita.png create mode 100644 images/shiny/Manectric.png create mode 100644 images/shiny/Marill.png create mode 100644 images/shiny/Marshtomp.png create mode 100644 images/shiny/Masquerain.png create mode 100644 images/shiny/Mawile.png create mode 100644 images/shiny/Medicham.png create mode 100644 images/shiny/Meditite.png create mode 100644 images/shiny/Metagross.png create mode 100644 images/shiny/Metang.png create mode 100644 images/shiny/Mightyena.png create mode 100644 images/shiny/Milotic.png create mode 100644 images/shiny/Minun.png create mode 100644 images/shiny/Mudkip.png create mode 100644 images/shiny/Muk.png create mode 100644 images/shiny/Natu.png create mode 100644 images/shiny/Nincada.png create mode 100644 images/shiny/Ninetales.png create mode 100644 images/shiny/Ninjask.png create mode 100644 images/shiny/Nosepass.png create mode 100644 images/shiny/Numel.png create mode 100644 images/shiny/Nuzleaf.png create mode 100644 images/shiny/Oddish.png create mode 100644 images/shiny/Pelipper.png create mode 100644 images/shiny/Phanpy.png create mode 100644 images/shiny/Pichu.png create mode 100644 images/shiny/Pikachu.png create mode 100644 images/shiny/Pinsir.png create mode 100644 images/shiny/Plusle.png create mode 100644 images/shiny/Poochyena.png create mode 100644 images/shiny/Psyduck.png create mode 100644 images/shiny/Raichu.png create mode 100644 images/shiny/Ralts.png create mode 100644 images/shiny/Rayquaza.png create mode 100644 images/shiny/Regice.png create mode 100644 images/shiny/Regirock.png create mode 100644 images/shiny/Registeel.png create mode 100644 images/shiny/Relicanth.png create mode 100644 images/shiny/Rhydon.png create mode 100644 images/shiny/Rhyhorn.png create mode 100644 images/shiny/Roselia.png create mode 100644 images/shiny/Sableye.png create mode 100644 images/shiny/Salamence.png create mode 100644 images/shiny/Sandshrew.png create mode 100644 images/shiny/Sandslash.png create mode 100644 images/shiny/Sceptile.png create mode 100644 images/shiny/Seadra.png create mode 100644 images/shiny/Seaking.png create mode 100644 images/shiny/Sealeo.png create mode 100644 images/shiny/Seedot.png create mode 100644 images/shiny/Seviper.png create mode 100644 images/shiny/Sharpedo.png create mode 100644 images/shiny/Shedinja.png create mode 100644 images/shiny/Shelgon.png create mode 100644 images/shiny/Shiftry.png create mode 100644 images/shiny/Shroomish.png create mode 100644 images/shiny/Shuppet.png create mode 100644 images/shiny/Silcoon.png create mode 100644 images/shiny/Skarmory.png create mode 100644 images/shiny/Skitty.png create mode 100644 images/shiny/Slaking.png create mode 100644 images/shiny/Slakoth.png create mode 100644 images/shiny/Slugma.png create mode 100644 images/shiny/Snorunt.png create mode 100644 images/shiny/Solrock.png create mode 100644 images/shiny/Spheal.png create mode 100644 images/shiny/Spinda.png create mode 100644 images/shiny/Spoink.png create mode 100644 images/shiny/Starmie.png create mode 100644 images/shiny/Staryu.png create mode 100644 images/shiny/Surskit.png create mode 100644 images/shiny/Swablu.png create mode 100644 images/shiny/Swalot.png create mode 100644 images/shiny/Swampert.png create mode 100644 images/shiny/Swellow.png create mode 100644 images/shiny/Taillow.png create mode 100644 images/shiny/Tentacool.png create mode 100644 images/shiny/Tentacruel.png create mode 100644 images/shiny/Torchic.png create mode 100644 images/shiny/Torkoal.png create mode 100644 images/shiny/Trapinch.png create mode 100644 images/shiny/Treecko.png create mode 100644 images/shiny/Tropius.png create mode 100644 images/shiny/Vibrava.png create mode 100644 images/shiny/Vigoroth.png create mode 100644 images/shiny/Vileplume.png create mode 100644 images/shiny/Volbeat.png create mode 100644 images/shiny/Voltorb.png create mode 100644 images/shiny/Vulpix.png create mode 100644 images/shiny/Wailmer.png create mode 100644 images/shiny/Wailord.png create mode 100644 images/shiny/Walrein.png create mode 100644 images/shiny/Weezing.png create mode 100644 images/shiny/Whiscash.png create mode 100644 images/shiny/Whismur.png create mode 100644 images/shiny/Wigglytuff.png create mode 100644 images/shiny/Wingull.png create mode 100644 images/shiny/Wobbuffet.png create mode 100644 images/shiny/Wurmple.png create mode 100644 images/shiny/Wynaut.png create mode 100644 images/shiny/Xatu.png create mode 100644 images/shiny/Zangoose.png create mode 100644 images/shiny/Zigzagoon.png create mode 100644 images/shiny/Zubat.png diff --git a/images/non_shiny.png b/images/non_shiny.png new file mode 100644 index 0000000000000000000000000000000000000000..b9ac6bc6377c4c182bdb9c5b15a66ffba2c4e07d GIT binary patch literal 3845 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 Hu0mjfwS_Zj literal 0 HcmV?d00001 diff --git a/images/normal/Abra.png b/images/normal/Abra.png new file mode 100644 index 0000000000000000000000000000000000000000..0e1183c2f41833ddeb13d6ab96e6ec48fccedfee GIT binary patch literal 553 zcmV+^0@nSBP)FtTp#5(*dGPqvsq}bVnEfk;PeHWKyQvPxV{D24eOf_2Cv?>HYF_a z%E>VV^5cUrAF^jWM)Z;QnJe?O=r;g*GF?ZRwrP+Bv;xw&ato9@AqpsrTR`0}0A;%g zgb)B^>(k)V{eJ-VTU9Ji0AMMd3;VY!p6W~z))kA!&>j%owq`=MT zSbaU+F5u22!0+Qw?dxfXG=pCW;LM@g-#Fum0umsT&7rRE7BE4sn`IixqJKOdhj^li zFS>aJMLCp%0s6>u)>Vv(Tmd74fNj}~t54o8g*yS+?+REuhSlU}Xj)846bK7~3Gm%B zz=jdjP9Ojrq(RK!>6|<=>yn*N3ep7S5Zvk|;tWQ&Qzcr9-a&GtXUUl{Ssq=Nxx~Mf r#pb-0JtcDn{uNNtD~TUx!W-lttBs5%4xj-900000NkvXXu0mjfDqZz6 literal 0 HcmV?d00001 diff --git a/images/normal/Absol.png b/images/normal/Absol.png new file mode 100644 index 0000000000000000000000000000000000000000..ae7f136536bbe70e982deb4e97f342a38ecc50af GIT binary patch literal 782 zcmV+p1M&QcP)`1sh^=$V{XFdH?slic3G1Wl8Ce9SKk+&SB~%Ez93UsNAGU8Y`0S z;C;nW`OQGu@+!t&yr%ux?G@jPSJ5{N#TR}_(Cr1^S@=Z*fAUuRtqS~*UufSe*oS-> z?5Tj3N_Kbe)I=aN<004!q(?+Fcc(rO*j6B;vMMwc=&3;QGs7X^v!HmV9|l|(m=PLi zH^vo%jHF?=4POY`aiGaJnBZAhuo7uWDF9?WCZ0Fz^AsYp(c+St@{2Ls= zFaS0}aaw?n#gSK|MxLGm-(-;3P<&>|><2 zDo_H$;1}*^VD?@B_e^gM%Pyz`Yz1IG=(4^L6CS>LvfsArlXWkUp5J05Lz>fu;bzK2vy1VmJ z0kM7-e#@}UV!+aPEjI$Q!J3(ax+S18Me71?35W`LgWewmFP{ki0f?j=JA>^Ar~m)} M07*qoM6N<$f?kqn4gdfE literal 0 HcmV?d00001 diff --git a/images/normal/Aggron.png b/images/normal/Aggron.png new file mode 100644 index 0000000000000000000000000000000000000000..bf54c0f41172a8e5aceaed5940e0ad60f7ee03f3 GIT binary patch literal 1049 zcmV+!1m^pRP)=>7>^F1lZ9C*e_R`+d0y0G|xyOX|X%MN=w(Aq^UzVNTFFIDu|k&=$qLRWm^{L){( z8qEvaC*A_Os9zkX*jN7>tOAl>0_g1gq-=vYcs>*`@c^JRer`m5>w-}X z!Q^A|65kr!r1e1?g0Rtp=mJFN$x>W=BajZ&wlPcKC;;d@$Dh(;uI)N3w;K;02qHgd z>!$qEkkgic>-BQY4kb3yVTH|BD+5(}S= zM0WICfMT8Dto@O188FB*0U8FFhE7DZXoF|85e82VFGP6c{D}1cOD2NIpWUX4H#-5g_ga2_RZ9LcwCu8W~iMlhU&Q zrEm$v#^`*Pw7dsZVlfF|HS43#2AGx6g%mWBonHbG-2$Y6Vd5CJgm1XVAu zj9}Im1%1q`403KA07d~$l5Vx?<&hDZ8Cr82d?gSh5ra4DIC@C0>im-+XPMjJhanQ5 z0&)~ifG(uq(U2qaiA_Uh2|PHP0)Tqr(?9@D^wy_?4+7o`@Fd7c1eo0;@MxeBLl6KF zfRcYv0FAlGFi7`;hVei%5K!`O6payBf~6ptU5Q~sAhf-YA_y#lL`uv6I0Oi2JBhHS zW1`D3&}G+l7AYb?0+PhTk=P7y&buN5LaEF2Pcq0DeV|VHQW(reu|CgAzGW+T!mF4$ zOEChfPX@1902wKNA4#1zNt^UsTxCQpl`Q4Vu(thvcZ0QhEx0zT3v!9y<^lc#RKY{Y TMSe*F00000NkvXXu0mjf!JX2W literal 0 HcmV?d00001 diff --git a/images/normal/Alakazam.png b/images/normal/Alakazam.png new file mode 100644 index 0000000000000000000000000000000000000000..14a8abe539cc9cc4bac9c1ba41d2fd3e9e2deb05 GIT binary patch literal 764 zcmV5L<5L!yw?8z?_NtoJ#8+o1AXm2gb9;#&0OuLH1Q}oXtAS%uCRLH-0coDcHK8 z$Fl@)8<{czWEwY1sEEn+auA3~38|E|8Rb zOf;ZWN(N}JX7KF7JRU>i?&(wxdaccXY^3y-pp1us*_yl8G?o}UYn zmt1F+6;U%m;(&BknFvr*gU%kQE~Q{6z3PLPy8wUa^!{#|%n;NLJ uZ5{afr`5>14ev(BI$Sm;3`bWGez57`RXX00006z`)R`u)uJz=wOJzfPj!dXqbQ?2q-vM0000#=uS-l0004WQchCuxI{3^wm%OV-|Hfx z72r!9s$0bq>wecoQbRVUF@o55*Dy2+a zd{n^0=!to0BA@t|h1-O44nE%u6tod6;}y_VS8XkjqL>dBqw-a5tQWod=+3a z6+kjsC4UhJ0rty45(<>JWjF_eh;kh>e^X!+a|RO?j{HT!bRvjRqOnroHlG4;e=R^2 zOQ;wl5a0ge%6AyUZ@g4$$9o&lGy=W_>S}1vjZcz#0ab3N!ofK&kk4TtRoVhL)@RIb zHXQ{hbbJ8~DeTX9ug6Fs&c4%p2R!C{V){{l#sXlzQ|16g=Pa=IrGySyf!+&zaQ;5O zy!@Pb_%!^vKz#}_kd4~tGL6FUrvSY!hq}gDa&U%U$2j0O-{I+x3OVP2Yldz9AP@gG zFbb;yKbkNK%R8Vp%zn%t1nB7>6nMK2kkJD>T+iDMx(U#pW;cC6bmq@g{pzFSKET@% z`rO?vLE*@c`AA0+jt=c_fA)`7fJc%RaL5=wF!>WI;)NY9;{l59`|(d8i5GrF@JK)c z;0@kR@RwL-j_+tnVm}X5f4aVD8@g@TtdZf2R6(qIXO002ovPDHLkV1jI;Ll6J} literal 0 HcmV?d00001 diff --git a/images/normal/Anorith.png b/images/normal/Anorith.png new file mode 100644 index 0000000000000000000000000000000000000000..a2c037381cbea4f2bdddf891d84b95dbba3f02b7 GIT binary patch literal 624 zcmV-$0+0QPP)vd;{dJrx9==7%8!Ulx6uU(gVeqrq678d6Gx!195>wdJ1z_-uh% zE64i{n9S!=3eXk=1678OO?^jDN*0mWL^K3qj6gF$ly#%zdZWLH zMFKDyV5kp4e7gpv^aE(mOSG;4b<8Zry76ZH+TtT0tpPR~L|JpAUbN3yq}qlDgP$k# z6}iZ7NW)Wm@Oa-)^<%`sb%8x^?SKKjfcKMt%K^+V>jE0KgYFYFYQ1_N5bGK{Z=il$ z&`13L0IaJZLe2FMFba4paA6n%lXZ;(bn2} z*uLQv?z~9ud%Ay)Z5R#VIv@D;a#BNEoEQ5x%N;y~Kufr)IxWtz%`J2jq;!;Bwl*(c zCh(RYf&ohKX#poe3Sq{OdR{r@Ck1}w&w{{xfr6eMglWMBCxQE%09Ez#x6?M55V$IT zf4e)&eNg!E^JGe3_Cvrj1OEv4SYRx3aCOo=jQn%p`;X_#dwv5IpC(}@f|ZZ}0000< KMNUMnLSTZ&Y#3Gm literal 0 HcmV?d00001 diff --git a/images/normal/Armaldo.png b/images/normal/Armaldo.png new file mode 100644 index 0000000000000000000000000000000000000000..485948e68281abc74bcd8fbb8381fc771227c763 GIT binary patch literal 1058 zcmV+-1l{|IP)^ z)8BC`r8v_s)E%FGkOch1-R)OFEv1+_kxpv@Donn|pHKXT05{B-NNeLUi&`l>cet^F z{-2mdettY2GtIEjUOP9cTAnPR$GooTaS{~2lbH0=z9}fqh?|2#Ft^XjeFL@j zymH2!_4$14aKDGTGQGy7;Jo3lm9iqduZ3>!WYl1ccF!vrw#D?Rd#OQESTGtee5rAl6o=9Q{ z_%JX!JPST*M9ts^iH{CB362(Ut*081gj;T0bZ*$0aqI_Z#s1#}1kO3{M?OY41Z@e2fSeimH-THkM`K-(H-X2i9S#BZ zDZmCJuO`SD@R5IwK)o8E!HX8oVF2%W>JZf6T`;C418UjS{|d|qK_v{I0xujhWO7HZ zbI|RTdW`TnKrawlK{-RquW20$TEjI2VYn24MC3Q5*Nr0e%}}Wxg6&g4F{Bv4VT)UN zO@R{D1Rer5B7Z_4(N%7yT_BBoTq_jO1R0tie-|W)V>Rm6vVzosB!FmW!y|t{l1?W= zIV+ukl*IT-`AQ%$@*#LLkV(Xsa>$WC!^$`i4YO`|DU?G{`blks;Kaz=ID1k)6jIAq z$`BCwD;yYSPs*VfKd7OuAz-=$B@stG3@@nFUZ;}j8rs0rKxajN3lPugKOhOb209#4 zrB+h-LvRg%QwPxJP>fwsO6r2?|M&=wy$(YKRMdd)f@q4ym}&gPi6N%0+=tpET307*qoM6N<$f)YU0)&Kwi literal 0 HcmV?d00001 diff --git a/images/normal/Aron.png b/images/normal/Aron.png new file mode 100644 index 0000000000000000000000000000000000000000..0d4af442b2e31917996000cdbdb7b0a58eeb603e GIT binary patch literal 337 zcmV-X0j~auP)pY+nE(I)0d!JMQvg8b*k%9#0NzPN zK~#9!?bSPO#4r#9(W#z~CEowQUM?Bf8L0&};>){$kp#$&<2a7*Xsy*JbB}Np_E4X@ zUU1aDG8U9)8^BJ>C2 zmbMdcbq>q`pdVXA&H&eyNQ_(7kAU#8=ekgpCT!9F09n;`1ECl4eFB*|8f<>Z0Hw;V zdc&6Gyn&MF)9MY!cHRRiY3#!*DfgX1I7li;6mnoIV0cIcW)Pviqz5(t$$X?^3AP2W j8NfaQ=MQxp$FbxWGX@193z94y00000NkvXXu0mjf41|ut literal 0 HcmV?d00001 diff --git a/images/normal/Azumarill.png b/images/normal/Azumarill.png new file mode 100644 index 0000000000000000000000000000000000000000..913eb689130bc8f15c934c085fce2ff3a63d4f9d GIT binary patch literal 543 zcmV+)0^t3LP)pqJBg-z|k&%)N}xp!c;*2{W;s=0nmX}p9)jZtnN~({;ZCymxAGi4@9*<2GhPtD83>+ zFgQPeYkVM~1SA_>Kb(tBa}r1ofE=Cy`Ft)|A#Dd?C!+xa1MR`!3{3>_ZD6zj&|U`u zfqp%A|r!ZNkl zvcM7LR0EblClJ=<7SNJ;tPzUe4eV}Q0hYkJ>-n8&ey31@8KCU1a`q6;j(GF?1sVXk zzA8&{zf^*>(+Pd{njiqJ=lvzMif1nRiPa$}ClpFYB@sqYg^w3dn1OH}%Crytw%;FM h9!mQBXZY}I`~$jQ7=-*%h;9G?002ovPDHLkV1jiQ>}UW0 literal 0 HcmV?d00001 diff --git a/images/normal/Azurill.png b/images/normal/Azurill.png new file mode 100644 index 0000000000000000000000000000000000000000..645d2c8a37a390c34c5a1a473ccaf74f0c87943d GIT binary patch literal 520 zcmV+j0{8uiP)|WXps2WU|3jy@JMj@xJW=aShz4iSO5S3Kw!Y$00001bW%=J06^y0W&i*I zl1W5CRCwC$mO+l=Fc1SBg%M5m|NpyDOBQx7BMW;R*D*j9*nlDAczAgD5!wHxvy?Im zj)+aa;4GlK&Qid=0&#vYB$visLFN3s!S1M(^91OPfN{P7<>hYv=L0G>0)&*qBV6#E z^WF;_M(F@X3v4b>xd6mg0JIU%%hLylhUD8m9iIC;)Xo4RkUI48rTe~LUM~zB0RWY$ zZv`v~U~mMEfn%Lg0l@Rj_1{{lm5O2eSO<`d!0St8e$>tWvJMD|FceB55YhgPJZj+j+(^ zAhBm8H2O~*;==C*IwhkYq(+K4V1+G*odJ$HnqDN!LMqX(57|?>bB0yXsFa&;Ys)_j z%(uw466bo~`IcQ#5;VxBQ_L^O*@$B!P|5TaLv+MCfb?geFK`Cd7i3{l>*Yt>e$}j6 zFTD>C<$TL-7g#$am5kTmE@82wB-K44tihPRkE8SaS$uf-Mf?G_7#7tq-sW!r0000< KMNUMnLSTZ*(e97{ literal 0 HcmV?d00001 diff --git a/images/normal/Bagon.png b/images/normal/Bagon.png new file mode 100644 index 0000000000000000000000000000000000000000..4c6c287254ac2714a4e9bfedde6d5a147c0866eb GIT binary patch literal 443 zcmV;s0Yv_ZP)f?zpt!(*V1SU2czD=&aF9qyU>Fz}GX=CB00001bW%=J06^y0W&i*I zMM*?KRCwC$mced>Fbo9)Cd>2q|Npl*gl>;(s$MEaBFbe33;95MczF0*_T)GEn%qvL zo^;^W@KYZbsK0%m{(3^y=k!@8ojZZfKJ|V#F!eiuA?-bNz(39VoG78JA+f21-DKpy(%h6aCkLLc#U+nZA>I)jkA$ zvydmAfxdoP2wnKHY~hKrK&uvfyL^etcZ~4Y!J$Xv^kv0mBo5L+$t=|2@SZcN?s z^kTxzkeNgt@}yM247&mdB~%80Gax|j%DYzrCd@X|m>=0eWrVrL+vWpKU-5asXJ8a? zC6z#9h_9pY%782JXyw8HKcTg9A$}A}1B{_lAtIpe&;4r?ihc_ry&YT!wZfoHkeOQ+ l?t+9eaGOY;-`|J-%NLLZ6%Wm}$M66E002ovPDHLkV1hjc&prSE literal 0 HcmV?d00001 diff --git a/images/normal/Baltoy.png b/images/normal/Baltoy.png new file mode 100644 index 0000000000000000000000000000000000000000..3bfb2164edeab9fd9679616de048aacc42c8dd01 GIT binary patch literal 359 zcmV-t0hs=YP)h67?{9^x5;5Nq@D8UC)q`v#J1GwQu}d%lQ!1ea^+ zJ?Z@fY;*&-ta^HqxW0gMPoT|kVpo*_`>sGcqimmB5vH&bRhO;I5LgqWIlnE8TH6-* zdYpdwYBPtsmE<1vlf+st5o8002ovPDHLk FV1m?gl|29e literal 0 HcmV?d00001 diff --git a/images/normal/Banette.png b/images/normal/Banette.png new file mode 100644 index 0000000000000000000000000000000000000000..128ce4e87c1ff58ba972a9c5a841bbb9acb2dd54 GIT binary patch literal 488 zcmVP)5TLnt|&W zdO%qA=}PWnc8cL@CxA+ZFOoG=SAffbALJg$6+Z_RU?-sCn43S2gYG^9j;%|ezd$4SEL<8G)|X zTFP=jK7e}!&}Yc8g`I+gagt_++-bHP2!N5XQ8?Fq$FzGzfpiqn(e@80(K7q e&u{L-!y><^r3;Bzbpm1l0000#I6zPU002=~I_dxb00DGTPE!Ct z=GbNc00DtXL_t(|+U?e{lG`v0gkgvPu?81-|JM!0%XvIW!=t;zUn4d955-FI@$v7% zczHPhqbz8Y6W{yMC~pPq-8~Kijjy5eK*OJbG06t-*?IMVP23GQjjHPY+}pHQASiwj zysk^tBjje5X3WiiU)Q}~1?_j@0n#!zzX2q{tJZ!c>VbsqUcx|Y4b;-#T(tls%^tFW zZ8A{5rQU^wvLOv+cnySVF946N{YWgXPpQ54B4tN4BY;7^1TwvcY^p*``HPEqzG&6z2pc9^vHf17(mYTTLBC`x_MjqTCo0&z|sh{kHW@Ci+$xrseG0ei3JlG3u!d-}xBg1SA zWM;`3&N(nJN)B=DQF4qJsFF8S)#tza<3I5W4MGw;csa`u00000NkvXXu0mjf?uzMr literal 0 HcmV?d00001 diff --git a/images/normal/Beautifly.png b/images/normal/Beautifly.png new file mode 100644 index 0000000000000000000000000000000000000000..43288f559026394ae4f81fc8bd7993069d6399ed GIT binary patch literal 624 zcmV-$0+0QPP)G6M;d$H)CiNnlIil)D8n;_~Io zIq+frM|>tw5x@uekLrM?c~c-&jd-_!V!<`<=WG1^26!z4{3<}N=3|U(^61sPGz{#P zzc$YE!?3RW4#&o02P#y-YC}-MDalF6+vH(>p55SiTN&}BEomr@0=dBR)_S1EXXjLb z>XlK7tGS>U=&LuuRX`MhgAX$$%OMhgv@JQwtWfIh0UOwBtl3sk2q4(J)d7!h?Y)ncjwIB7;2 z1LfQ%6#(hy=fuGF+;e#o07+*8N&&-m1ou4#=kf`__XFk2|KlHJuqptDWc@e*0000< KMNUMnLSTX((JUDN literal 0 HcmV?d00001 diff --git a/images/normal/Beldum.png b/images/normal/Beldum.png new file mode 100644 index 0000000000000000000000000000000000000000..98989458405346feac971e3f5fe7fd75f8da6618 GIT binary patch literal 427 zcmV;c0aX5pP)%Et(9lRwaAD? z;1no&3W%`%uutba5+KAmfekp@M|Lid0!7WO!2AkseF31SfXE}V1J(!>W>*01JSJ!= zV*@7dIIhQ-kt)!9-+W%LyzA#AlqoYCHcjnS5k>gnS*lx%GS|u-El^J@S0p)$85wU3Ygs-XFgK V73RPp6YKy0002ovPDHLkV1i>VwaWki literal 0 HcmV?d00001 diff --git a/images/normal/Bellossom.png b/images/normal/Bellossom.png new file mode 100644 index 0000000000000000000000000000000000000000..1535aae011bc9c907fdf5dfcd7a64af8f84d5adf GIT binary patch literal 474 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 literal 0 HcmV?d00001 diff --git a/images/normal/Carvanha.png b/images/normal/Carvanha.png new file mode 100644 index 0000000000000000000000000000000000000000..5c4e84c0af5be82cfef4571f687c369a7c7d7eac GIT binary patch literal 627 zcmV-(0*w8MP)%D(Qz) z^r@e5S$P!rG?eIiK;HsaXbSDtbsJ#blBFEbZ+SeZeD<^@ms}f?lt##5L z0X+iD3?&@C=wyJ=x8_(XF^&LF2bB8OeaVd7m&rhA=m8GK07^7d;C)}d8`!-O7~g=1 zF9eimyJHMMq|*UELf#w^kV^q?ZM(a-6|BB6O%=Rq_&u=Mwbq6{KqOBCt?KTRw@&Q^ z(K+91RSrpMy^TPFGS3ZAtH+y?x1HYsni*gvj0NF4&D)={(@Apff;aUCP-Jn#yB~Ui-iP!KYF+s z&~#w;0*rJQjs2el@J|A`85n N002ovPDHLkV1lwH4fg;5 literal 0 HcmV?d00001 diff --git a/images/normal/Cascoon.png b/images/normal/Cascoon.png new file mode 100644 index 0000000000000000000000000000000000000000..f03396f36dcba5f570ff5ed5f1115bbd274548e0 GIT binary patch literal 434 zcmV;j0ZsmiP)@W245sIaJ*xQK|5nVA4+U~srF0B`^R7#J9XI5%zp0004WQchC55CnC4?b*ip|L?s8+#_z{%4zP6G72wMK#YmgU@#c`FK&J_ z0NgE@?rq7<{7S%IS4F0e4fP@O_r&Ctznwr<4CTOFk@5z*5#Z7+YlYd&rT&6s=9YQ; zh3zUrb-S<^G6lB+&yfI%H5 zTm}YFNhy&iEXWj}K~g%)=X?uV z3wX}pF;O?tY5+l*GePg`0d+_MdeUpZ9GH6ammY5Gg}CM=ZHc9s=m)no)^BO6e6lY- z*%w={Z0;pnb@A37+&+S0f*N=;^w|1_LnI|i{L W<_6YuV|f$+0000P)n#7|69 z0rOvhoUao=p$No8vjI^JAAyFSz)Tm9{rJf(C@g?V`1yoGCPq9-?jloXFtLLTkiHn{ zGX*|i68LsN6m$Tf1F(Y&H0J`14-_tdN{s;UO8|3*Q$en=KpM5iQrg0)0y)AN31_}F-$$oSB(ScsVTu!uNdc+iMo7(iI4W-|bp0000ua1am>DRqn>00001 zbW%=J06^y0W&i*IlSxEDRCwC$mdkd-APfanqaZ2Q<^KQQHpXw0#7&nyo=pyi%m7+h zE-o(qJ+}vD5r5W!GJt@5PD)s{ZNUt{Cwe8y;+G0=Qm4br-1QAz)@hK<`w|%MJXV=PQ`CBkw2QDV9=# zAXM+u3k<6B6hJ{rUPrclL!W0~kRAY06*K!bGt~ST81}te0&C%c--m#u6oD`RHU$im zAB<}#{l<>Pa$`U>!a!7;^Hko XAUqh-Dm0Y<00000NkvXXu0mjfj?V4g literal 0 HcmV?d00001 diff --git a/images/normal/Clamperl.png b/images/normal/Clamperl.png new file mode 100644 index 0000000000000000000000000000000000000000..9b3302128a3a8b70db77481a3a1c52bf45c2ef20 GIT binary patch literal 558 zcmV+}0@3}6P);y8r+H0d!JM zQvg8b*k%9#0k26!K~#9!?Uvz=qc9AFJ9Ti0@#Os<_Z$P;o^-mpcYjt|J|Pmj%p|Ft z!0qDV;s;>Hvt$1x2apcg;m3N&7$Tt~5IyiyJw_l#TK0gt18F&IpkfA%PELkoNx!aU z)I*2UNofHKdIDnPA;i}NXj1w!iTSvu!4rTg5-s2BHD@dszX9w&fQ1PJs^iIP1}x0r zFQ`=3@L&49^8QGz9*rbqoNU3Xp0vUi5y5X(HbXZpfFk1jRTjQ+^ w$u%%bVM3<94tW?H^4sU|h3k9m;^O=B3uYc8=b>p2ivR!s07*qoM6N<$f=!_Lh5!Hn literal 0 HcmV?d00001 diff --git a/images/normal/Claydol.png b/images/normal/Claydol.png new file mode 100644 index 0000000000000000000000000000000000000000..a88c4db77a3cfe5c94d7dd384cb45cbbdd01c3c4 GIT binary patch literal 666 zcmV;L0%iS)P)TLg&LDaw!iP)BN=(=wA3Ma}S^1AOE! z8}@;3@{NBtAYTFFPX**h!1%ylOmN>e`G*4Bx1WW34cS+{0^ih493D}4o5*H_lpi8P z)sGvm4>+fQnE^ZlHoOudaQYKOy#=Dod8Of-ZXV+}9&cjZ)vsHpy#~;4 zbU}SeNl2HcefMn4iSG>h-;cSR^a{Tu{-z`_J7m7|2(Ch z0U~}T`hj{4EIaN=5Pq%lCcp#V{q!j80l+%9uw3%+qYvx>Ltp)Ofda{EK)MuCjrVUt z@onMZ`wKw2DPUH8IzDEM&p`O&IAMU?_{{AFfYD9?N+1Ez?-tOv$w=%0W11pR3V
    xdWoxq*pR>1*00K&f=*bbrdUO>Rh{^4)t7xQ;HR1a>vvj6}907*qoM6N<$f}Fc8 ATL1t6 literal 0 HcmV?d00001 diff --git a/images/normal/Combusken.png b/images/normal/Combusken.png new file mode 100644 index 0000000000000000000000000000000000000000..3841ca9123265fab0fe019f6c3fb0b62fa924996 GIT binary patch literal 754 zcmV1 z;JlxBA*F+X^gfW3js+5@cY*Y^A22f_%AC_vV!4Od4cJ#})jG^ijTGIFI5a_Xi20$B zZXMN_Y3DA?cCBNE!T83Bs!EPC^xXo6-8@6QklYXvm-hyM(<_b#wghq90y_X8^2PE7 z5%a--1GDG=4+-Pr0c*_wLTh*$Bsz4+p9|}eOtjxXt-S!N zHiDEhi!OoAw+(a2JTNj2x~Zzd9CI9eN?2_Tvuh(D5|Ftgs>)1=&N_zKyAAZKmjbHA z{HH*8#(hS>n#h^x<*op*T5SaSF*)P|uy-Qn_vEF}p$|Lgfzl845tNiwC*|ycEs-6w zH~UbEjR!~_(aF)cPK>-#UkWI9V09Fxf$u)TeTV^>y%y{qs9x9t8Xpr&ptkn9icugd zR#dkFqQh%}y5FqU*8;Wx={=z;6cK?iKqSDg4}2H_-G^?75);A-{J{9Qz8wL;v#(03 z2+!cfUq@K%krB}Wg+sus0JAP482SL=2-X^UX6OjeYk`1S4<`egAKYoEzXN`oj#Ja2{A|g~;WLptWYjFmo+nzKml2ba4#^6l)Du+NFY9 kfHeS@0s-3z|L(8oA5{!0WcL_QmH+?%07*qoM6N<$g7geq8~^|S literal 0 HcmV?d00001 diff --git a/images/normal/Corphish.png b/images/normal/Corphish.png new file mode 100644 index 0000000000000000000000000000000000000000..0820aee929bab05b16edba3c1f283fc857f6de74 GIT binary patch literal 636 zcmV-?0)zdDP)5sq_`pE;`1s7s%;>N{$f#(La6sV5knrfhs89$1008Xy9?Sp$00DGTPE!Ct z=GbNc00IC>L_t(|+U?fSuHrBZ1kl)S7d!F%|L-p2M2l8el)&p{5DK)Nqa>9m?VE3Y zS291VwUs>3_9OYIeFhx)s9pB21@>f)`Zhp;fTBj@@Sb2f0jWNLPlPm8dT1VfxTqh;VG7&<&4YcuQ?crY5qK)-!M>T2;JqYJ zDIs}Q)J&fPR$)VwK=nmR5b}!Rp7gDcr&Ck`s|h$V(Vhb$YRa4hZ1>6pY`+ z2M|vHQ4@Dj2Dk&Z0Gu*!r%E69pgk3&cV4TC^Hfft0ImV7#~7DDs|!Rpi?xEaga!Cu zqFn>M699KigaZ2tRgCKiFg}V1QE>=5twKp8P8Cg5nV1p+30 zlwbrD3h#BMT_;#`hh>ZcVhRGUpuGyBuG0lXC%{k$w2c5kVEACaKLntD4fc%8F+A8O zz?br%s_h94$<3_95`am_n*evA`W_x6c7>QgtW7|8I0Ym&0Sdl$5pXX7Oxp@ZM0Cc1 zsCx+CZKsOV8Y&|0tg0e2cLcrNOboI5H-m?&D1}YH3_uIcTyFdpH3OC05%M;lMo1uH z0v=8wu?wIPNB}bX>uCdQ0K$F&916fXunVA7@Zgw9;xz#LoX_Lb`vJcHlfU`qW&Q#c Wog7%YN-E6&00006J_ zm<5@?Ut~aAiDXfrGzE|YETA($^S2K&t2Mb={+%S_Ny|V~7b@a~8CnCwZwTK!@{+26 zBqMO@1aSIv_p>fqRcH+`OE-Oxe${E@LSW{Wj3nhnKztT&w;u%=v2dKCNM3#xa&Ws( zxIirnPkzt$-+U#o;|;;*I(g-zHAk?&3S7NT1dsuL{NC>Y zY793%`Mn;1W)=aPci?JxeSVj$00}Mp2#l2gnFTYu_fcdo1Br{IF$)6r9a%{K*lOHG z!-U5OW8?reu8ttqCzV$*{L!;ebM)TB?}0%22zvje@E|{Z|0yu~i(|NNK9>E^$B0V& z+Iv6z%%;B>=*Q+kkFA)@n&WXs27bj;$-q8}Ks8O_m$-jluOA;Ze*oIx6P8mI3rzq3 N002ovPDHLkV1l{z=hpxL literal 0 HcmV?d00001 diff --git a/images/normal/Cradily.png b/images/normal/Cradily.png new file mode 100644 index 0000000000000000000000000000000000000000..7b2ff1170a1585a0e039f9bc62b53e1fdbda326e GIT binary patch literal 770 zcmV+d1O5DoP)!ac2K*iUqS{DO-a5#^O(>JhYKL(bt3oqEE`%7onT6-8B zR;U*6i#6ZYX^XA?*}WP7`Uus&wr}AFQGi^br5ylZqJuiy01RLZ1rj$<_PpRTC45697O=2_cpQl@)Sv0__nfh<1QIo5GM)a0vJh|}>4uzs zO1^*j|Yip?G=! z22Z}?_LE`Z$(El$xEA2>lRmH9!CHVm{`%yn z6b1J&_m6jbA?JJq&Vs`AdBEYYvSWcLP}S_E00-uZ6;!NXzH+TV14T-F(W*FVtOPhv zV1pKerRZuPz~H*lC_rVtgn7;^Xl&vK{QR~34_i(jB*z=4Jpcdz07*qoM6N<$g6pYb ATmS$7 literal 0 HcmV?d00001 diff --git a/images/normal/Crawdaunt.png b/images/normal/Crawdaunt.png new file mode 100644 index 0000000000000000000000000000000000000000..ee723782c2b351866b0caa49cfe1c1b19c22b613 GIT binary patch literal 910 zcmV;919AL`P)#PJjSzvef+OuV^bwvQ*d$iWQ#Icl8 zBfkP_*@NnyX?JXEz(Y~oGadP5L8nxo0NW~v@?K_M!n&c9Iy-=!WkV|^N@PC4vS8eT zDOfk4cnC@g04*C3=SEZjfi!4U0J0lWu9Z}$RgLMQqquv*^`yTnPF8Im{?r!goA>2~%b?y1A;3;^&Lc88-p(zav z^tK?*eT`!mzye8c&wzHjUN4dFhE}U0?@ol^E&2#O9vvcIF$A_C$QiDkR)>Hx0P4I> zD%o&!!^kHh36tF2q*rk!Ks##d@m2>Q37H4>bPif6ZVVLLc*dn6kh_-pLq*h9hk`i;w&(+6nrz#&a;mR!A>lF;O=|~NJu0N+XOan5gG!KREGnZ zYvxmcp}=^8|yXFT&;J6aMKLKSGkU?hHj zQM8uvY@N@&bOg1^3Eb}pXw);oF^4`>>&x*en(~Q7D5s_V~-)mtB?TY;i+Kc31|=k5nI0QH+Hgy zo*5uJmyBgF7Cr7en7k6W5!hybWilU=iT*6e#dDvH15ZI#P=X!53ygUA9dOxq1kWnq k=T|%hXSp?izxOZwKlWB2s#pY*^8f$<07*qoM6N<$f;>`_M*si- literal 0 HcmV?d00001 diff --git a/images/normal/Crobat.png b/images/normal/Crobat.png new file mode 100644 index 0000000000000000000000000000000000000000..536314c9e8e415aa26b1a76e1afb4e31be4c3443 GIT binary patch literal 668 zcmV;N0%QG&P)4~5J+$k5D@SrdD{R000DGTPE!Ct z=GbNc00JOML_t(|+Qrq;V%jheL{UJ^wBynI|L?Zax-4leOTiD>=iI}}3i$S&L;6ZC z0=}60QeNx(ea{2aP|p21)Kw} zRRIhHp7q)R9|9qG0@T`9@a<@Y5C&~r!Wqy7K*xPi2iWeQ$^k5|kbwFfCa}5!3toY( zjsb%{S^(}q4PYCeVT&`6`h5QkAo}47{d`d0`Be}S7~~-YKsTV!xd0M~d<5hfUIhUO zL_YxB9)qA>73_itKmkNQ6x?n?5i&kjBGES}pf|9gO021I97uks6I$=Rzx&Knu{2C#Vig@oWkz6OFC=&>El@Jer zPJq-xkIw)D2m#bW?|%UK?`k}Mh2^iH{$C&j%mf0Czsz1vU?#*NQ(*K7bV0*j<;jaN z(I;^J7??m@yz*t1Dxi}En1SrfcT{cy2Lb~aPxG2Uj}}<@SMwP_Ql1JL07M5C1bWbe zvON_v1k_tE9AW@)nohq4*8u7gAoz9-pe_Pm>VE?OXDf~^3bpkB0000=@_00001 zbW%=J06^y0W&i*JElET{RCwC$m)mZvFbqXqQeWb;J^uf{J>w9SN^K#`^DK!(3fhYu zL>{0wZ|)Ivg-7i3?|F$a#owY3^B{5w`oUZd7t0fYn0c7Q?>9YM#60Q3VD^_lWOTd` zn2G=FZzAGm=ALvySW#u;M|`yN(*oo^1*7Y+D08KVILVKvAdf&H6HiqBtV2G5A*bQ9 zkcmZ>ps=7b;8}*sGxIcfl-wOz&?)ICgNtx$jlbpLpas&a0^$%@@SgXi6;Kt>!i1T} zr^$@U?*(F|0)W=Stkl1m>H9J_K_Fp_<&^!yzcc zO+l~d)PN|JlkTBY(02jf7W5MI5{&Md^r9f?HFVpOsO!rD>RH1!1uv8N{?mDL$$$D5 VB>FNMj{g7v002ovPDHLkV1g*QLhAqk literal 0 HcmV?d00001 diff --git a/images/normal/Deoxys.png b/images/normal/Deoxys.png new file mode 100644 index 0000000000000000000000000000000000000000..a2977e44d9f0a5a2bf1ac501d49fba2d67334bcf GIT binary patch literal 743 zcmV?P)d`e8{iPeH*^>~~R5kKo|!4m-Pe*{9rE)oIPj<09}cvu{K z5tBISk=|;*i8_D_I6l>3EpRAA>VSFY{jP;>fmFrE=|hCJ5Yc7RsvGH**X#Wv99!Q= z#U3y+m;sRpP1~AY3JG8dymA3Q0tM>Lr&to!3fVBLb_aC684b47d}5TlKXcdDIzu&!09*Wy@-KJ zXag<_$;^QJ0hTWc@T-HV7){gxR|SRpSODb;QuQ%VKp${DLN5vvw+q0?0+z1;|NVdE ZzX7tLA&m?ay`umC002ovPDHLkV1l65O0xg} literal 0 HcmV?d00001 diff --git a/images/normal/Dodrio.png b/images/normal/Dodrio.png new file mode 100644 index 0000000000000000000000000000000000000000..3a70788f439b6dec2b9f872df2349a829de8d2f3 GIT binary patch literal 972 zcmV;-12g=IP)%*@Q_z;N(@ps=8L$e2)ofPkQQNU%UaU|2wCP&hz9KmY&$l}}tu00001 zbW%=J06^y0W&i*KN=ZaPRCwCOlu@$cIt)aeYm9_YyZ67_XUTDqnt{BT@G<>iQ&8vF z5=zRyjJtn_R}q#!2_KQ(*?+;E{1f~T(27mGiu3>3eV^w8+O(M>a2K9a87`b;fuc1u zRn$|yJXrR0#?l#h$>XslFTsBn^n;3-GGc>ophDz?Pi$SGuMd+S!L})a2TuRAzOM2T ztO}X}E-;=8nER18wPA>u0d^wDw)MHO91SaG!JmbR=K2c$&Ol=)kF6R|uxiQUlpkr(p_q1&3hp_n+N> zB^Y5CYzQbhGr>1aCv+zGNS47ldqXhzmIeSG9TR{e(D^m?CgwOJ_$(s@+6K+OW(T!~ z01!~dZh#H2rYsf4$%lc**$sn1M0{}1r+{9EEiD?~a|sxHB=~GHNlji28n literal 0 HcmV?d00001 diff --git a/images/normal/Doduo.png b/images/normal/Doduo.png new file mode 100644 index 0000000000000000000000000000000000000000..99e8438155e219e867bc434f88bebd7311738b9d GIT binary patch literal 627 zcmV-(0*w8MP)p%d%{eh1HOFG9)ilM3~yd6Xpk8?bdh!wTG&B_B)Q8)!tM|zmmFLz>VV`uU*Qb} zYZMgQzBz#M1BuoE#C_l5@bO0M9 zErkL#17X*MKzDCvojXZMvlxsU3AGq%mM`z%niQg4K#F5zbcQfWt^4xDfL#$aW`Jve zt6w?-F5LSaOE$5=eR=>^z!|p!2#^76+lEgd)&%j&-^VC}h2cQb3{cJGf^7c)4cP%k z+Z3V8f0F_Gz+-_B;`GJ17_jg4^+iBmuKga6uyf(8QzYXeka_aKDYYzd0$l}QUl^R| zqhEg&D`6+Vg?IqFqF`qt_$7M4Q-a_JMAh>Guo}Uzs5b>86u>l5`KB<&;r()niuRHsJ*XV^A@ZNe-D)ZoqvKI5MbO{BU}Ig N002ovPDHLkV1i56AMXGF literal 0 HcmV?d00001 diff --git a/images/normal/Donphan.png b/images/normal/Donphan.png new file mode 100644 index 0000000000000000000000000000000000000000..e4610b470c4270a262953830640e79e0e1140bba GIT binary patch literal 808 zcmV+@1K0eCP);=z<5}Icz957a9CJakT@tXP*4yM5Kq0y@c;k-0d!JM zQvg8b*k%9#0;x$vK~#9!?U&KA+aL@?W3ZQ6iuV6Mw;)y)e&mgT z%*#RYl_#G8=R9fbghM*U5Jdi0Lni3uhTatubb+|%Ss8}toIomo&_6j6g6k$X+(4T^0m2(8il&E`t1FlN2 zVFZm-MRx84K<~lu1}``axDza@R|3^ca?iLE=(4zigTM$~RxV3gcPMUpfW;M~fPi~f zH{dD{?E+2pZo(-LV-s*)8fhhf_kwOng|whhNIu<=LVybaI2uy2z6nBMn>?(k=2tXS zM+pW&peqhR%rV>atF9G#JUg>sL~UFI#`dVP=UK@Z@;`>zTyPGe3*st^FthmyKk0&r zz6upSL!bb+Ls0F+fO0laI&2G^K>*t(O&}tZfW}!+hEdEp^4vBO8KipyodlN#syW4Cfer#O{$-)*Ckhg|5(&QYMsdM)AAOj}CIE-o8}cF-0)4%KQgH)wOromNEflj5 zOnJX82eb-(+u=La#+{WgyMUbYIfKEFUk^c>Y#x0gKoXN6Dh2j^Zw4}~l~nUy{Mjcs zanM1lHBnXfKh31NnEj!EpAaiYfojb|Q*!YLo&HjV*QBezX&~CnDLGf@oAF6E mD5*6MKK=t%zJG|mbbbR@`$OOMj8P8&0000_yP-s{<@X&Dh=#bFR*ifLLc)-9gaA?fTnVFep`0&X1`1o*eaDYGcrT_o{0d!JM zQvg8b*k%9#171l)K~#9!m6w5Xq#zJPZ5qw4%KZQ59y35Mo|h}P%a{`DJ%b}`~qJXY^x4nE4Dgc{Gt>r&x4wU zwqaefRXn9srOjZEMO=|wU^&&md}fumr;}k?J-NmOT;LPyg(N-@ zc;zpGn4?MyUC?U`TQwUVT#5?|~5ihz6RKQiB@z)4Gd{Q{^uMqGz{*9c( zQwE54fl3fBJnRm40VNPG!OR1A2VR4ThvqPN2{`cxo8!?)js^hJ9K?s;V>kq6dE9bX0ci4&nbrlAH!9kAVPAF2FO4Mk!}VFu3>38RMW z2^M3`hDk6C{xcpLbcCL{b>8uMmuUDdkIv+Up&=CH^6tHy({*ej+xnNrV1zlV*oe7K6bGt z@KtIXoWBbErY<=PVjCVjOZ!glE$|^-LV_@aBRa^;%2$C|dM@Z;f3I{wK^G7g0o73n zWMJ?zX6fg_sKVbndniv9w z?JVECE!`7sz@3M#1DD_)a1sa=uSjqYfr;mDJeS`y3n2b`f%t=bHUotdPqa772fP9; zf`%X6!AHDGAQqtG{TEw+Xa78U05&=*iGw%%fsBqj4+#I>a)bW>a|1Q@ozvR=00000 LNkvXXu0mjf(wDQq literal 0 HcmV?d00001 diff --git a/images/normal/Dusclops.png b/images/normal/Dusclops.png new file mode 100644 index 0000000000000000000000000000000000000000..aa2e4b5c78004f63d1edbe6ac2d1beff1d255616 GIT binary patch literal 677 zcmV;W0$TlvP)CApU`lbPRclErg7|8C%Z1(Y=0Z((E$<8I!y8Z2=)pGe|vJ`v(hekk)} zNRF%dnbufTNg7uT9<}m#JW$>Q`?U>w@R=Ih&XmUlX8F zN_m!2QhK%Y=bX9*GsumPV7 zR{!)YgR##tvuq5|r=fFJewW8m<9Wu0RM2_?`WT=TN{d4Q727Owx=A0O657c#0n{p-yA?5oh@^Bpb*^hNeNR{Fa7{9~UqNjC`P_sxh%mPD|#G0cFXn%$(_LB6AVB zo)Agu#%}?!T?grpdvKZk9>})@OheVe!FGcPB@x?Ah{eyJ$A8B!rTZd!FpD6h00000 LNkvXXu0mjfq@FbI literal 0 HcmV?d00001 diff --git a/images/normal/Duskull.png b/images/normal/Duskull.png new file mode 100644 index 0000000000000000000000000000000000000000..235f067eb3e8d3ecd6ed51c4922010472cf84006 GIT binary patch literal 522 zcmV+l0`>igP)I)vXdO9Fz~R6_-x{FozQT$%b|p~U-+hs0cO8cL0;)*xUVuyo zh!~e!p+YiDV2ssI3AYJAGwMXZ{U3!`bk<)MFE}Me<)?mh|EZ8tiY8M7RJa97D?mRT zzzZoo7D@u5ej2dKc9AzyiZWPkT0ep1N-NO3a6bnDz6~(N?yHEtC=|t@5VQwuT}9Xe zunx$kDk?Gz(T>>%?Hfc6@WAL9rHWzBY0qA93W#{`YWvd z3YnNHSlsqNeE=vF4~!P!x{0cq8tlF*$dT_bw-KDp?|6cg!5c7d0qPU1sLFdk=Ve(` zC8v}{U%>DV$&59S{R!ojKUf1 M07*qoM6N<$f=V3Xg#Z8m literal 0 HcmV?d00001 diff --git a/images/normal/Dustox.png b/images/normal/Dustox.png new file mode 100644 index 0000000000000000000000000000000000000000..49640527dda815dd5f574cc7fb1638746cfe4da7 GIT binary patch literal 621 zcmV-z0+RiSP)k!6FyO$@u+VVGz%bB|z?iU@xR6kQkbtmgknm72z)&z)NJtnM7(rkXyZ`_I0d!JM zQvg8b*k%9#0q#jeK~#9!?Uuoo+aL@8ixU&TjQ;;~E5u@At8LaVucytNyoVVH$YFnd z`0#&O*EjuT;jI8~2G9*wu1Ze=X;~82mu7B|(t0_dF#L9em8-{2De=7kfDfeo?MSQA zYo45WD4YW-S)r7oF=geCb`BxIZnqou&0p+)1lrViQ%1nsr+_~Mu@xdI0nR=K z9MA$*urJu{`;n}O^A(6aP@t3;dA3ukwWf1m4(Ns03$ZBr#ctPu{_!{j9?Ct0aKGyZ zu@~Y1)5q-Rz+9je!WYCH?7Q&gTj;BkzY}0tI0dTtJ#cuUafWT%n10R+?JBTW${xshWd_oIhQ|oF!o39;N9Y0E zC5$(40egwE(gUmt1>krK^H<~x5CT>}Vpr7y+zn{J70^?KU~D#|RAy z41e3IP*4rX=AQ!o=R}2WQ#2s8GG-$p(|2HnK6Erh4wsO#MW*iyEg)1(FQw(ERfg~9 z`?o;MqBL6W>~nB@!In@3pjOncf<6B$e-tERBdG(jkYDUS0LhK!Q|5K}Gc%AdI6zQ97#J8_&?aC20004WQchC9z? z`2t|ZP_a+8yD#8?)sGtKJ$o21)?rTbBm4e47f!(dfO7PV0#c0W zQqEe;Ba@+zVx*Uw;?-YMss$J{@a?b?^?11Lx%AMoFrFkwT-QV^h$FqS zEI5v*-SikiGiAN^o8CwcC7St4KWG3F~)pd@!4fVnqBCV&J$3BPfbX8?Ku3rU3_ z?fWji=o#_@hQSsVg}}W)f41C=-;e vm6@}`UFhFY%f1b7+}rPI{--CC$sgbcnTHm2m>FE|00000NkvXXu0mjfghR)C literal 0 HcmV?d00001 diff --git a/images/normal/Electrode.png b/images/normal/Electrode.png new file mode 100644 index 0000000000000000000000000000000000000000..82fe723629bb0aaa788465f059ef16a584bb6d7f GIT binary patch literal 426 zcmV;b0agBqP)j_1*$OJX0D={a*+3KdWdL(8a65u$KN;X>f~(BDPvA!2vB$* zkUgLv2c%cLOdwB3&CuO%LMULyyAVKvg$6mM`}LQ489r6h$GD z>PHQ9b}*t5sDLQd7w7sT5N*E79>4=ie*+^FPlPH6#ZJj58uhI}f{1oEX#gZ>LEH!w z6_KZH0cmGo2x8VzWSE}aI1(;oH-(%MqW)|`cH8t>vaud}i^VVS2Wd?a U`1ttvfPjGba8S@lFqk+PXfPPqut@mWSeS4aR60tA00001 zbW%=J06^y0W&i*Kg-Jv~RCwC8m(iNDHVi}=jcmX`{QhrSOTr-#k~aO@x!BESbzcvy#D1hwvb1yz46Fpxwqz|^ApQ-PsDqDtd6S(Nfi0WrQ&>U;=@e|-N#;JxMG zWf#Emg>P%G;9fwPB5Hi-Hw&KgEhj#%b}xYRTA=!kLEM=bkMmN`_n$;is_CTw!1l`( z6^*ZJpT3^ZHTV#ub8Hy9pyGu;86cW-wt1fDoJ|l7Y6!OAF9OM)&MQO=w`cmntQJ^- zZvx4VuLasS;tRj_4YrG5nbmpP7houM3ge#@jQ1FS5it3z3+AW54Dl8q0ImWIXMyuBnA;x4Td-B227u23 zTMUgSg~bG3zymK3aRaGJoCUETKti}&1TAt1ER?H2Lrh|L7m#uhC?)f+=VXCry$+0pr_B!>kgn2atK7kMy~~uUIo3t zA|`-0+zW`@3qb6GQr5NfKnds31xmRHqJVTk%t`t&2!5XL1k~rU z&iBA*IM37t-7wEC02L(F!mD6_Ut$<q8PIzS=Ys50_UA# zOaF-bED%Ya)spih#=$XF`NBtpP-RO~r~~Z0fB*!(z~|T;Vc|2dxS`9wRv;i2r%3M8 z*dt#B(>T(Y2%H*@Kzi_zA7vcdx7#5h`Q0$(JUO2;Zbl$|!EyXh0f0L)fV+NK><@@f z3?I@+qi@pL37AaqTVg@D1;f7-c(bSn{D=SM{{`krIVESes&)VX002ovPDHLkV1iI< B+A#nC literal 0 HcmV?d00001 diff --git a/images/normal/Feebas.png b/images/normal/Feebas.png new file mode 100644 index 0000000000000000000000000000000000000000..da6200101de665bc47eb90026b66a89494cf4d6c GIT binary patch literal 488 zcmVP)m1_{iA!P*8B7sK9>I7%Tt)00DGTPE!Ct z=GbNc00C@CL_t(|+U?dsZo@DPL{X6wvC3;0rLYzJGmx$a>Fx zPas$X`pSTH1haVpo^lB=$8jj!+(wGr*D~wlW#;;PJ^>qqy9uTKGg^WkKY>vZuxtYI z1y}+Rbs(?T38senEr^+mE#LqQ2?)sxfFxiz4!{+fK$HcD`vQ8is>`96{a__@owN-6b`xeeR+oGL0000CuBO2S<8eo|x%yy&Z2ZvEaUAOM(Md}=?nasEE^5WcSH0UVN9SFLQC&OS z?()kRkzse4h<*p+=Dypd6z%fB_vm`FsS-jMh3vlTsrboexIScK6ymPQ_3FpCZSw+} z9zLNSh)4~Mxhw-Wz0yX=5!(EcOWBJB=7n2;dZ1itT(P$HY=L7U~ueLWvpsuhCpKgnuVhImO4WRnj{9B<1)`^190x`dB`)c^l7q)|( zi}(u4p7V$QO!tC>7KqvTD7gL=xKF4q42xLdp${?N1Hi}ixR2LEUx=vdqY=OP_UUOl z3yBr%w?$-J&lg|yI4lu31fdOJREva$g+KXR^%fwhK7fs-IvX~5J%EGz7T_A-4I(U7 z00`fG2_c#90VWcmlP|DSr2r-40| z-SENy^$n>iLqmTvm(}Jc*r^gR3n)?uIuAH;kA4hW#4V6|Ah-u*oh`w93t$yUsd<3T z0@1e+&A$cO8MJ%z7l;xoW%46^k6_+{t5S;Jfv@1cMP}BOt=HxG63K{VG6F3hkE*h^ z*?@ii$qr4lC|pX!Zaat+!sHZ4)C!6p2lv(d*yL=HU>XU$C$IL<2dhnEBvMMKkYV~` s0A+Pj#bQH$o`4Qu_CJ8mfBBF87w9)RV^x7;>Hq)$07*qoM6N<$g3E)iy#N3J literal 0 HcmV?d00001 diff --git a/images/normal/Gardevoir.png b/images/normal/Gardevoir.png new file mode 100644 index 0000000000000000000000000000000000000000..9106c408c385888475f1f4f21d2bb98e26dec59d GIT binary patch literal 642 zcmV-|0)737P)#0EGEE;qO!;+xF{DH6E=at7=w zaQ`s^3mE0rFk`+(2nEEXB@{RkTsRP57BRD&>uY<1dqOxC@D+01u)QGMZ59h$#Vlqt z3h$S~gnJaRKpxbpnM}mQ{lE^5I`$w!&`)3ywgxH@RiK|n?LRR2Eg(_7iS>Ke+ihF2WTf<3y6uL9Ixif=1GAJFyYeaoK%GpGUZflmEQK zwUk3LmZr2}n#{xP8RjXIXP`Mpp*F#AMz`L=|& zj)IzbVe*dzk;^A8JKpfX>|Y??n0L$7ehUB?TSo$yuRux|$16cfvp)y)vOD8=CWwIN zfZG!|s%D^@FEW4U9rg?wHt=aqzvF=?U?)&d)Wa8i{6w<@fEpI@9USyC*WF(NGVLD* c9ZUbp7t*aHp_-EW0000007*qoM6N<$g8f(;hX4Qo literal 0 HcmV?d00001 diff --git a/images/normal/Geodude.png b/images/normal/Geodude.png new file mode 100644 index 0000000000000000000000000000000000000000..62438ce313349bc58907a90e9accb66993ecb69b GIT binary patch literal 424 zcmV;Z0ayNsP)^ zFc1Y`FVMMD_AdDWMrE#g=d6|DcV3Zf!)jG=?(dg$3qfA0Zg~R??~?%WWb@23e+{N~ z-&xmBO)ww_(@GF(1EWLMCg@dAT3|+EZS(>}htl{=hG-LGVLi&F5NF>SKgA^)g>=oho%Ipck_aJ5jKXym@ zIJ|mz1~!xEgVv>V2U^1n=oMxAhcOw?i&g+ZjnVB!D6vUm?Rdpf%g%@>JCoBupFCS< zc9I-j^-M&b_9uHGUnw(DBJ6^fM9ks<$x_U&$XLo!fm^>X^mp+(Jx`}+{xLsC8)u-V S2yBx80000J literal 0 HcmV?d00001 diff --git a/images/normal/Girafarig.png b/images/normal/Girafarig.png new file mode 100644 index 0000000000000000000000000000000000000000..7e5a79f62ba71ebe9d79697da07adb547f565c7d GIT binary patch literal 774 zcmV+h1Nr=kP)K6rsDH;2_AY%2?1#J1#93c^~ zh2S&wK(|r(QBIyD^^(=@aB*^q0Jsu+u z0b3j6g#pQ?lVIbuFat5hF3{;%(G7myo{C7n1J03{!dfv6Ow}Z*PLDJlD%E@%Hvv)*Id)u=`P4Qw<9Bx5e2RdHF15b&!`uBn| z$GcfC`CkMj@KTBvedTSCpMomz8l`{>v#1&n{FuOBZ-$j(?l44x|IJWd1!#1Q*&P9P zLBaMa7!!n{l;SV^Zs-ad_#-w!p%C~X@M**l0ycR6Kk*^(IFAS#5AXNmBp4ck$x~1Y zrkjF@nFP;+{5jjpNe>>rpT|<-Av$>YO@1cYCurtgc@e!KXgvGd22^hdKtzl#@TZ{0 zhxv!q;5kum9K=M_NBQ%QVWK)L5R=o7&3$|az4rf-KRF#U2;PCkP_@K!6c%a}&h``Lu%y@W!P*7MXC^!)sY^eYM00DGTPE!Ct z=GbNc00Kx!L_t(|+U=K7ZsRZv1x-Fmwqm{eUw1>&se)}Rr;Gh5kZHdv&6rV@23bcqG~ND^>^U;fFMv6MTQI)h?&xUfI`v%~JAP~4|0Ea985M}Xw%IdRWIcfX{s z-+i8+GkdPH*6IP*k3jmz`gtG=d+~r5iZcf2OqO||RHqEgiZJwPAPa!iufPB(O3q$D zLM>muD#{aP8omc6XesHdlJcZG;dkn+;13NS%aPHS?c)Tkt z^h8M4F9X#B?t4Ir4FJ6iK(*e9K<}j3Gl<0e3_z9$xK1KG5mn8CGrLIENr^W?fYe(f zphrMB3xI5mrDUPP%=Ol?Wuf=0!1gHQB&}`RMgn=2rU9)ktQ+OHPbQ7qx~?0^cLL%8 zt}C0AfNgE=%MlPd!t+4wq^w($>b_7`_ctB^gm3485+jIgtX=>q`TPt3porP*5Gp!J ztsXENe@6rs0X3Tiq}~BsSJCmJfoETrbBLP10KM%u@y)78z4tM|1QH%lxd)^d6iENFpr+JYjzFZA0U_lw zU{(yB`^_69Tua{(E^idf3rPnI5`Mtt8j(?;!3zew`TT?;22XT1bAZ&}N6ZOdd9eHl q9b-@A86r9o%fG?o^N+-bU%($J*(*2AP_~1RA7dI{r`V^*+3J0u-HD`leiv=Cal## zZQ}Oh#~+}O`+ClayeG`;Yya6u$)$uBUqtY=Px=ffFNyC8C6!X1t^iGcKZl7e_2xdi z6+&owAEaCup-`a{LILn3EF6Kb3Z$V>PK`1~I4to2OW(QY^au~+TrSi1ei10#KK!GQ z7@%hKmw`l%fNQUj8X0C5LhwFp%K!(Mf#D|CE+P_GuvLHxFZ7Q<$_(_v!Z$PI+?0nK zwwr+hA!g^gG)BNZsB_^v4geEip@%RF$Z6o3n+yH*b7bE8Q7|C40%yqG2gdoa@JFHV zW`RBdVDlTmSs;u6qyywm0aO(LeednW=LT++j$xvM3S(bB2EZd4*9LWcr}B^|KLd*3 zGL8X_gQ^D@aeNM-FXL$e-F@HNwN_w`uwfNITaEyI7NSn5;xu4jAT(bi=)V>!N8l|! z0*H)rG7$HPG-59R+c^M^W7gR4Uc?LyVIaoH#u@}erH_d{9y$yBD3??gG)6HH5vQ&t zpvnN&{=U=WZXv4L3Qn~`d07YgeR#i#PU=gU#!Qq)0qC)F-y}-mVK#aImpf&<`3QW8N`1*39a+w9zZUZIQ?t>Y) h4;sI}{y+X>{sC@)DIk1xj6DDV002ovPDHLkV1o3<8w~&e literal 0 HcmV?d00001 diff --git a/images/normal/Golbat.png b/images/normal/Golbat.png new file mode 100644 index 0000000000000000000000000000000000000000..3bacc208b39fa3949b6e2f5ffd291b7f760ca679 GIT binary patch literal 664 zcmV;J0%!e+P)271USH(hj)Vs9OZjKZ@A}8Vbsw0Ye6&I^Y?;# z13~WuqXt3uf@aWn0@<$y!o4Z{LJ%#QUmD;k7Y0SEKPPxuf?0Gw?LmpnaYC1Z{FeKP zL9xai2sahfmktJRygL+bD`*Ox@SgZiKy`x5w|CWdP#v7eg;N?h%HxGb5Mq)8$Y-!6i}d3?JJ*^uy-Bygp8j0!g;)NK}*h1x=Ro4rfnB3=dN zK<;5LQ20H{e2ix9)Rg(o3b y=>g64C-_#uH3cd9P5^+C^sOLJs?Y!b8~PvGj3{-nxR>Jq0000b0QKgs0^qD5$QquKnWI2=R|Np( z`Mm=m0OZP-z)t7E2-Uza_%2|a-Tfc{hRoJO;I2TPettNjvNoZldwW?RXwBVQYc6XM znOkH&kwmN+O7oq$25wtCpF`kgAb>ru>dujm7e_uJzu0dYYrBVc4L%5lfcZ@ zpv!Ph4U^ zG+^Cd)xGytg4vmwIeq-U;0uf9-nz&Tv??&kz0je-o_{y!SnBNi!67>a);ma^6>*xv}aatKtc|5Bf~!8oePSnA<5@&rD{n_2$|-_4^XZ m61+o-y=%z){NMlZoB0QvAQU$izU27;0000cS000mW5PoBwq5uE@0d!JM zQvg8b*k%9#0(D75K~#9!?U&1vqc9Kz(Zkb}C*A-5xr-XjfISnI?7i$^>!J&p6oOU+ z%l`}_`tmMch{brB?7Y#JH|`vuh~*7|5un=ghJa$C@q$-)Nhd+@X3Y}_F1UT11QG*Y)LqaF7|n3v#|4zAiYov2cRLfsM6AqajbsFiZ&k1!>;=1fBykKf(igCFKfLy=6K51CI3NT}u< zeLLTRcUq+xHYE`9iU4+see3APi!P?^B>FDfN?`F7THG z3fPw>v1vhs;3Zct?G~9A5V%VnK`$LeGH*FgE{ZV4CtE9m^Wcc!eTsKqG1bb!W1?^A zFzs9W$$y8rQSf!;;s@VHbM`Sjd00-P1u~=cx?Cm3eNnn`(0000tx(|%WC5>d?C=)>KN9JVs^i(WmXt3VJSpD+@%RAdiTrahTlEz18@K!)^7K$y+nB%pP72>FRCz}`Cn_n#FQ5rFGX(Gz{QqSXR*wT|y{a9vkh z97U{2Pk`aK1PNoLN!$bM>%g>hhd&BD{XAoE?TlNX{3H!)T79fV9|SQ1P;FcUN!$aK z7y-R+`Rgq})+d4lu7T*$uYvOk6d*=m+d2^2Mz8`>MX(Fg0Em9|71-Y(BR@j{+yXHs zQ~))QfF8I4Btsd(4c9;_2=WZ3X zpo09+ISzDo1oVYF5~6$=cOppnlL2Z^7zBSFU{K&S32fWGM{u@8WPnM;YX*=Bq(3V# zfY1_56Y?ho5qNz_L@;98x6gF#-}}D3|D=E|3-UiA-3|Z$8U3sL0HJ%=P)hB2NS&A)w*EHHb*Q^S(frh;u=JX)GASY?oxbFOZQS!$cH9#v4JDAOpcl z)0T|4i5z7h&>fBO7KZ|D7Vq*jEWmZ~yMkIE(-(rl1X{e`6S2=*%J`*VR1NFXmRo{a z08rYZxGkVUUnrC?DnKdBOuRl0SJJ*xd7Xh4+3sNXa#4h+9dEm*U<>H6(nBgpIPxm1yCbMJMgnWW_&RP zSWD;?z;Y;G8+0}XO@SmpM-b!rqXbbE)B<@6{){`96gZBM4VnUZh#RK>H1Xn=$iV<> ztDqK0@#-_3?sHItO%Nip7G(X-9(l{3)EnVM5S+N>4Ds_07Ty@fY5fxKcU2`BBrInv za#dzFMNof=@}_+XQuc<-*N`y>-fAH}5}(I_7!e9zvlp<{`r;tbO%XzCFgpa8+8`y5 z12OJ-O2^znT}vJ)&OBrKF3_oKz;rjjjt8bc1jSMD+rgUmU&5PznP1EyA*00G_oe^< N002ovPDHLkV1muR{}})P literal 0 HcmV?d00001 diff --git a/images/normal/Graveler.png b/images/normal/Graveler.png new file mode 100644 index 0000000000000000000000000000000000000000..24a803e6ae1c89c887583e2ad9faf3129569b714 GIT binary patch literal 760 zcmV z3@Gz&v*90vQzyR{61%fm5Y>8Xd0}#i?A1HD9ws>v4i`# z+x_?-z!6AOyMwU@#!^ZI5MZ-5Jsvu|V+m%Sn<;w$&~g>XnbW=CJY0mOcM(p>)CkZX z!vP?NgNMsO?geuhdhNwqa)82SN-%e96@V(K3e*~*+zWz=P12zf$onZa2k}+N(gT(f zgiVu&(F0ntsDcdTLFhj7nxTUw10_lGX7z<`DPa>Olew89+CYwl9A`4nAEjA`jpdk` zNuiWX9N7q4CQ2cfFr&+@U`pZ*pIJ%p*nk zh7|LRL`GN&IhvelEFM-qppb!#zq+&*_W&NdNICHOWNd)w q9*ew`SJn+@4tGL}R`)OZ0sjIZ6-)|`=k%8V00004ys26$Y00001bW%=J06^y0W&i*I zvq?ljRCwC$)`;HQmqR>p%py0o>XyWDT%@01Uux?b4bhsO5PAz2nifwRSZu z0ukVfyEue>-dO~M%Rv%=XJ9W0mV^rzPkFZb671lrvN`$y2sq#xO(g)V0fxj-j}ild ztQ{b>aXl4-mVwy&0WPBf7_kZnBkuFt@2%}d_}=10NXHYn{LZ%6j*}(8T?0_nF+Twa zuB;pY+bB-}c2K+k#AXU)+m87OkYWLd!S_hEQLqan;H?mdwF_j#0D=J3+gk|f0z#a?LXrfFnM){B>|8sY^MrIB2{Gq zuP@_c5rb1@+d-mimmvZCO7IN8M@c+^(d)I8y5&a?&}FagwTegkCYm|%C@X6%b?^D9 rQa?4|a@EggB@>(Q`4xP2_V@k(baW!b6Cx;100000NkvXXu0mjflcVz# literal 0 HcmV?d00001 diff --git a/images/normal/Groudon.png b/images/normal/Groudon.png new file mode 100644 index 0000000000000000000000000000000000000000..f62784f66813e49d3fdb469f89d28d2ddc8e229e GIT binary patch literal 1113 zcmV-f1g86mP)H z0WBpdvi(D7JT`pn??~8*#LxX5qN(GvKotmf#ojxCj|PyA@H_XN#NbzcN5}5|ETHdu z#m@tR4$<%{2VM|Q{K8kr)Md^v5(Iwarw)nvNqUA|gnh76z@Pa^UOwP5311&u6Z0Lcgd>$>%3AP);7FxMySU4+uT zfW&nvZ-F7FuvCQRBRCNl_~Hgr#k}r?kV|RwKy$UU;u+|02_OP{#k^E`8{s&PLe4-L zt@!}iDI$0mP^xm!%&-EhK?o)7BD@8ZmoFY@P6TM>1**t-l6VZLbSme;Q~dAk7=$lF zW)~6P#?#h&K)aFar4uJk4+JWE+M#`*D}Z~TaRCSHRrA0^F_%T2>iAI;dbiNSuMeE6^_g3=C-Dr<|(~&^t+` z87qP~ni;Tk9JJTF$HHd|-vd=BBcLAWopmCjTmgS}*w-D*K+dQjdI!~L#cy^7XdVb! z8UA6*FTRIm`puBxPghe~PJ^5|FcTI(mGd>jk?=zCW=!CLY<3P&IRlObRfN%NTT8?D zhJ_!*9hjZF(17rp-vYU|Kv4Wtwi)n?+$MH7)6Y300?o|i73eyJmQVk9>9kXS`3-cx zvG*&WYSSR|!OI8Fz^NbZ`*ibdGS87_WCZ36TUh}W5f8Xz=6XBGQe5x7^JJaDDx47q z`|g1SgED9gM#2Wy8N65nq*1UEcDZPc7PGM{V+-dQ+=0Xd{SMBL z9<$ai*`bZJ2MkIP(ro(oKrnn;%z&38PNmtkgEv6;m7$e*Sis)Hj{tb>;2ly`$=X(7 z!oHv?A9m0I9jMwg?*)qhhyDO6l|)tYj|QpkYfOmN9s^WDmDB+Tb`?z37{AzTdjb)d zOB5GM&&JB<0X(l}q^!WgZKDnhfwj literal 0 HcmV?d00001 diff --git a/images/normal/Grovyle.png b/images/normal/Grovyle.png new file mode 100644 index 0000000000000000000000000000000000000000..bca15c29fc6927c85780b79a0b29dda207ac049f GIT binary patch literal 855 zcmV-d1E~CoP)A4=(1=j@a8OvVXi%WI;6NxifRMOAKsbOvfG98!P)Gm(0I7xHKL7v#0d!JM zQvg8b*k%9#0@z7JK~#9!?bqE->o5=mV4J0rpUuqsKklh_-C9i=ofK{v34u!X(>S(~ zD1Z4u82S0|GDTFb#@$OMhd-XL)#B-#&hT^|Ai1A6)1`5DN38~M;Xot+;+U4shRv)R zTC_X~m=S=^rZYqoHSk;CUj&yH=6olcsgrqB%kWE8Uw1(d0kwiaBd5r_6QFDv1TtJQ zO`u3X0Ynz^0AL@n3#=+pfea$EBM5BUx~|&>v-UH{u`f)GZpfLJm4JRrItM1t5t5c7;1C1{-R|7FVxfYkt~iAAl>wF*UZ3YNfg zGm_Ai3MrVyd`Y1bQn^&&c3Zc;{8Gd$aXopig2??$;S(T)MnEBmd66$hw@BUr96+zIg0&I^yEbv5ia3BmU)PnS7#$==4#JYaq}Us2$Y^niJ3(&>w6Fbrb3_JELg@K{I%2^x&ba?&O!vHjPP#*)%tdPVH0600O^!XY* h3j8M0-@m*k`3HzLJrlCmZNmTn002ovPDHLkV1oRJcI^NF literal 0 HcmV?d00001 diff --git a/images/normal/Grumpig.png b/images/normal/Grumpig.png new file mode 100644 index 0000000000000000000000000000000000000000..8114163508ff9735568e018bfbe129105f666532 GIT binary patch literal 731 zcmV<10wn#3P)A^W_;`4DnVFeLNJwU8W&i*HBIRRc00001 zbW%=J06^y0W&i*JSxH1eRCwC$m*J`-Aq+-GXH2x3eDD9ZYeqZH?zSDA8KtU8L zoJ^8jb?>pv05wvIVJ9*}a(3SQ`9O+An_mNJ{#ya_ZyB+{ZGaWad>}?GN1*!_m@RPC zfOrn9Zv}#C97tAgf%yV!U%&`h!OaG!Euh29s?G{J8{pFdQc6Tp3(o2M03pOq!tK@y z`i_4D_|^i1$}$P9+qQZijT>NoW3r%r+gV)=5ODY;0!;YDZ#Ch!)e1}}T`Pi1zqr+H zn_Fvu&%SoxDldFhwP(8rPPWLsAX~*hOGu0&E#ci^=Tgb{1lookCMZUZEH;G$x?ct| z0{-C;#34j0?10VBsyYgN3G0*dl2Qm1Mu3^r4&za{pKIs*;}L*Ffh>@L6eBYQBb%H} zS8==e{6qq<5B8136xae{b_1*L1^a$QiWZif5_H!g@S}h$-$<$Y z{TZW0W&=fg0@yvxeG^u=T7vnvg4h8-?LoFe58&c1D&hgD={+DV;4TiUo&rqL{T;Z= z6=Y^04`16`(h)HK1xl=%so!-X(QJCBy1+6K$YizwHAdhHlp<=7@kL-XWZpNVw88-I z1#}#-QvoTGm_LE;JO3*IFhwg&1#nocfl9If+XV9kLjdefVophHf+--~7r7e=VqlpB zfDB{&gk_#1Fu+^B=G+ROVQW__;A20;sDjT2NP$_gd<=Ge|Hu9ae*nRMH*s$9GuHqB N002ovPDHLkV1in3M56!z literal 0 HcmV?d00001 diff --git a/images/normal/Gulpin.png b/images/normal/Gulpin.png new file mode 100644 index 0000000000000000000000000000000000000000..a3dd393e31b52a3d6dfe6cad60158ebb67cafc3b GIT binary patch literal 371 zcmV-(0gV2MP)eDR(l~HhiIQ^2p-Ki{*cOY$1J3swQ~JK| z6M@hJO#0{e{9zx*F)={cGyYlqslbVCocEM2={zNk+Vlzs8e|E)Vgw%gUdp{djQGXJ z3UvSQ-JTTWLDh#wpm#9i3)um>JP8o}K(as&pHxWTKtLX-ULl%*Jqq-X@Ip2~$v%B! zKETpjV{Q*pJpu1NX(W+Yf$S@bwRR({_BsTB{E}Gx%I}rN_(N6*Bk6Gn3XjzY}#bWUf_yLRA3Y8bd R^40(V002ovPDHLkV1jA^p}YV9 literal 0 HcmV?d00001 diff --git a/images/normal/Gyarados.png b/images/normal/Gyarados.png new file mode 100644 index 0000000000000000000000000000000000000000..312e4e9a99de6931d2c68bc781dd91c5cc7dd77d GIT binary patch literal 1048 zcmV+z1n2vSP)Dz}VpM(1>8nGc%AN0LaLI`1p`$Xju68_y7O^Am>(F00001 zbW%=J06^y0W&i*KmPtfGRCwC$)Z2~}F$@IIl#@xeCztyFza_Sl?q;Q7hvAhHQW`CF zuq{FOy8z*zf}X<}e9|AeY$A7j(w_nla>$SIDS(JP@*}?mJRaYHQXnV_^*4aW;LTED z_TvQd81MD(z%Zd3(C3Tr29R$+(QiP34j{bKFPXRB_&3DcZv(!+PxGJ(F}@F2Nx$qH z>LI0w9|iwAXQ}sL07lNp2DJF&41RM3N*{&5qm+`f^@B8tGyDPQV>|$qTryL7c;6=% zq$EEs!7+5uQVNp+Aot{GNUui_EC5lEb1noDfT(c+5??PN`#e}crmXhW!i4Z*2{-`l zQ|lCoQ3cU}YX=>MF9Do=h}gUk58=L~?^nQnMaxO&=hc@J5W5juOTZm)SfB@*{R9yv zo_*N@bsq&F$-Z_>(;qsZ3#62|`WJv2wWmKwE?mGqt{{5f1nXabpv5R5=#!%G0wNtK z5Fm;J_w&y#ZJUk7yo?1`go;dROkYxN!CZve+AI{Rb^xk3W>x^mgAHgLpaP;%z|N&1`wSqmfOP}l1o{NHffbe+fV3;v3Mxz-Sb%6B z4m|Y;7eKPC^blx(3)%w^)uI8`?|dG|@m#=ekD1vI_Ynm1p+KquKEUiBUtd$0Ko?=2 z86E}=F97<`U+xX+;MdFoSTuR}m(ZH_0drU@^w}q@<8YwYN(Wr%VW;~Ccb>6ceJo#+7uZ{^KGX(Gv$p?>2P5&~9b7+wYvb{x19fSrO2e**BLZ|S7f|13Zs?SB@C2jSyD6aMFa-pemMfHZK? S8Ee7-0000S?S(KP+t=-NT3vSfRXzVkVWl< zTndX5{w6?$eJof2a{!n2S|BlUTZ6L&glFGu3y9JaC6G@6H~UrB?-$t!Ex>Rrv;Zv= zWOn%+#{uYxEU=zT;BkOCP;3oA-VAF54g9hV6P)VmPmuaH!Asy@O(2v9zYKN-T;Au< z0xN+v@XHWe{1$)(ru*C!2s(mbL&ye}xbWR7z;$8;nh>Y5CBvv zWahd*l=%zUGq->i&;lKZeJl{6y;B;xKrLik1`01yA&|{#ext84a5`^dZ0el08we zI|DF0EO`dNZvlp}@-qOMaU-1s7}M|2snVGn$?%^8(A>?!AAmDL0Nn8fpq;;oX8?52 zT#^8t1CZGQ(m4S61Iyh{i`fJKo6Z3sdN1c^41lc^VD^K9X0DH>i9JI28^9sX1EK;N z(Fq3whDkz(@3%l^1WCX&fh2yY*3DA9K?v!iR??UU5JHL{5b#JKQkn?AtsonObzP?- zkiOJql!6?9wUo;`5rO8cr4wLlQ3qU#euWUJcm7%ymU_)^0YC=$l`d+2GpCek_mc{G zDHXf}a@Pb5znOy}bN7S|yU|$+A$5SQ7a|Pndf5V)yWD-WI6$U9zLTs(_qVk4oCFCW zH4kG&v-AV(Wd{u425>f{i$L19Pb&OWV5O0mfcaJ^dINa=23-L|IKppcLF8i-xOYHX z(wnd;H;h8E`8_jnBj65T0>ISp14IWz#xY~f4j6L$!VWb9k)k9a0ZAwe;w3QD+tB;P z=J*E)K%Rm`mjZB&j;W;*(Bn1sOMo$dMjHSy0iAFR z$jveWumO4mXa*2Y8d6D+d>-Jv?qDhhLGG9X002izhe)YUJ~VZU64aNePG%1E)FJph z8)pFEi=CX5phJK5pPnY0sKZhU!~g1NgpT~RzB(z%QtMm5wbshlrDDDDukUC1eW9fi k&y;T@1>j4>fAtUfA2#7HN@2>q#Q*>R07*qoM6N<$f>{_${r~^~ literal 0 HcmV?d00001 diff --git a/images/normal/Horsea.png b/images/normal/Horsea.png new file mode 100644 index 0000000000000000000000000000000000000000..5e383148343dea3933ea58d9a0819004f022756b GIT binary patch literal 439 zcmV;o0Z9IdP)D1g(AkZ0HmFj4C6Z0z@pwG8kbnC>i#7wG zB9!Kyjy(cIBq~_o*hQ66Fc4sDQ%M-^`#6@6l<*Oty8N*k$O({p5{bx^9E$|Kh>ovu zk~{OnEAZ-=0ZOsueV$o3&$9>EDK-P10r$Y9?EpRkBCuN!I-YM1GQjl&DHSA6jYtMxdx3&M48lYQUXQFjaWZ>jH(E(@Dl zCt&VdYuodq)+zuw&xk{|miJ?J1=^9CO6TQ$tNHK=)awpH>7d0x%Tc`p?GR>wUJHzU z3j?UNw(&T`g2h01+`NSeAoo=eM39apZu8w|fgFL(%)lbs^WY@X9Dz-DVxEdG*y1F| hmpnZmN{`3C_5+4b4~_~MX^H><002ovPDHLkV1gnO$QJ+r literal 0 HcmV?d00001 diff --git a/images/normal/Huntail.png b/images/normal/Huntail.png new file mode 100644 index 0000000000000000000000000000000000000000..407a13bd116c48ab8e8005fa715bfe6abd9a9e30 GIT binary patch literal 724 zcmV;_0xSKAP)e;9I|cS%@C(JMhzjySF4P;wP%Bs;3_!Viyvnx+V_DAg=g@4Mdnl>{6g?0Qtg1 zY!-3BFT1sdJzx@ZKD%yuORB(iW-@TR7_ic(KnBnbAX1+soEhy%OzZ+rT5HxjGcG?2 z?wq)1Kp5GZeH=^Igc;~r$lhz=^Y^BO^C)l?W^h)mLcVT=Zd?U-{}|9iK#{j`OZd1q z(}nUIf`}zaeX8K9RRPAvVHucZ0BAD}eYp?_DFE*h9}+P@OO6e&qIWU;Nw=PeM6?3{ zz^W>}OZ-8XJ`i~wb?j}g!1)Lv(hD&&LFt;NLmyZL&V1Q@W;a9at|EQuB8F4H3L;FT zRXFI9al?C`SrTT>07%W^Ie=AOP6JHDk}46Kj(`Q6hn@Y@MJ?X?rbJo+HP>7p$e?!~ zADb?UlfW>PHq}*aL;9f3n=WYY16GEXT7FG0q7^`U5A2mdSovmLYA%6x!iw1K0Pyrp zN1*i601;9|fM^|oDpcUpFTz4g5D`|Q1r;b%KiD-w+!tDbZ9!O3qfdbQ{k{NL7bLcW z)TaUoiV8$++}QwdyWOy@@gx8C1nFbmZ`k}_gAoYDl>yc}(k*U~3|#SP_t#uP38JRWa#@WMRFH0Vt4u=#_x<2o%wK`O^UpIbz{jfhn9l z!giu`^)?+~&IUG|lN#Vs0nej4p2r^?j~r-U0N|haBl{a#B`nLBnM0TW0000+=P(BQwx zPne`)w1IaJ;2z+CP4pf@-gCJH$fT?!qOk`_fp>_`o~G3mxB;3y!CZ@k%_gAr3Nc$t z5*9oNEyYL;|RMj0VUlGD2@@CQvy-fZ6;ZIdfkFE^h&oJG%uu8&%*b z04ew?Bmmq2fFp`Or17_V-xnNLEvtWk-FOPaah0=#%n_FAf`Q2LI4$5YN~YR~b1^ub bPT$lo2XqEFUw1&a00000NkvXXu0mjfJimjC literal 0 HcmV?d00001 diff --git a/images/normal/Illumise.png b/images/normal/Illumise.png new file mode 100644 index 0000000000000000000000000000000000000000..b24454976c8fa77940a560613d490abd6e397b39 GIT binary patch literal 666 zcmV;L0%iS)P)L<-`b z*jDCYzCL{Tag_3ZFP4p?f@S-yz(vHDby%=2YZw5{IqL!ZdNyMKa?lNN{>E{^wytaG z;Z9lC4g8ui6wLtS0Km3wP#rg*L;{jdL|Vjk+<=^ct)<{H$Z7CFK@8tpx{(0mB_O6J z&%CNg8!sUQO;m3Ipy(xFD32%r3ZxE}MIr7O>;W1DK$oQ(WS0fvhZUm&)h2>P_C7%F zOOq(eCj<~#cFM`VH*w8+R?rS!1g`2iL)yNJH0ijWfGMR{0Tek5o$hdGKncM>4~IZo z51Yts07YK%?ZCsJr$E}3CmjIg;6)H6_S3xGO*GP-qGlx-_?&+250 z{HwsTJFTqSALu#L%=nTI1L;|nwyqC@d-huEfPq%4tGd}5hSKxJU0K86@A(5N&B`Gt zt(ba=iE*36W$xrY|0St zhoIBr^S=f@xBW8C8Tj0G;|%2Adw%|JeE1i?02rw!N|0>h!~g&Q07*qoM6N<$g1#p+ Ac>n+a literal 0 HcmV?d00001 diff --git a/images/normal/Jigglypuff.png b/images/normal/Jigglypuff.png new file mode 100644 index 0000000000000000000000000000000000000000..676c518dbd38c7e7a8dc51f74d4c936b8ab00e6b GIT binary patch literal 437 zcmV;m0ZRUfP)i&zAr_`mh&J4Lp`5 z3*bCwLA8CbzekGzc6?8HK#$#$gI>*p(=Rw?i({N!GxeUj`*xmVa6$~SR1=7UTs0~PWY z4J6g7^tCo8v@+4h-iC8uC(_6B6S=>V$bit!lEh&TKo|C;Fy!AqOUKm#&@Kf`p00000NkvXXu0mjfx|Y8N literal 0 HcmV?d00001 diff --git a/images/normal/Jirachi.png b/images/normal/Jirachi.png new file mode 100644 index 0000000000000000000000000000000000000000..e66d8efe0ff8a08ebe8f53c5c5f1c1dc31c0d554 GIT binary patch literal 561 zcmV-10?z%3P)v5QJgRED*1E-v4=PW7GIjAc=a*cj%$={3VrQ;t+im%yMf1JU98dj0qgW>fO;?Rd0|^^fb?<$>ox_jN8S#QuMQ7Pe7R31awDc#~_7vTiTwD)w2#yp&6hPv~kk#81qR5@pwjBS_uZtFl;c{mkmCp*E;00000NkvXXu0mjf1BnGq literal 0 HcmV?d00001 diff --git a/images/normal/Kadabra.png b/images/normal/Kadabra.png new file mode 100644 index 0000000000000000000000000000000000000000..f87af70aa12b1ea164a3ab6d16e42de3b5bd3f3f GIT binary patch literal 870 zcmV-s1DX7ZP)5as{a3PN8QMe#Gs6`m@|vq700-) zOU=`7zxPc>1@wqtE|(7vBBClO^TPsleSd#ns%L{H@Etg{Hq;N%nP6@4M#}@U$ zyP?L2Ng~YDalWt3N)f5*4r)ze7(b>-47y5hr6O<&FbE-Z$WKGpOa)Br8w>30Slv4=TU|Iph(jG5UK2R+3P|BsNY2 zklbkvWsFto7e~Zu3`RUWj%mQQMZPr5FMi>LfYRl})d1=2UcQAO@>4VH0uo3Ax}lOh z6DS0hf~lybyFreaf_jBBftgw!^E@SY0p(&2p;y3R+U9wNyIC6MSv{Wu>QSJBd}}@D z1P6{Z~aUl-CbSqb4X1Gcd?^L zGh#7{l=SVN(9>O<`Fyv5U|b~%TDw&MCiX1S+vX}d$x#4e6lB>f$N)(M$r5^NxwWl^ zsb^sqmt!Rx1@b9SP=>xWgu;=MsjA$}M?qGQC6=PIp@+SFEaj^J+e35|S4+;d>Wv|o zYpGQvhvS$_*c+f0$tUp!lf4}n>7yJmLKRVEYpwU?yp!TQ4?7#2r6rO*SX}kH{VK21^NrLZ#jT|4?9~)99^$it3tVT^8Y*a2hQIY^1<}j+X zL3Q;^MRpo-z!KDv#7aZQ3d$@ZhL8@Mus-n7F8D0Ju0XNJxMX5D>ePWv&1K00DGTPE!Ct z=GbNc00NXrL_t(|+U=FWa@;TsL(L6?4P5a5f43n;InH4tyPe*O$wa!mXK*czw|^6o zbMt3B+*O-gZ-(3mN*a8`4RAgaR2ShzyuqS%Jpu6Hc$do zt8}kG7p4%oR-5AQ2|%(0l1LVRcZN@9yu^sO%Qv~{{A`jpD{NAV6vH7iUO$ILk^(ak z8)a@rU8zFjsDL^N6~R3Xrj0=SJQB^h2^r?U=BJ?r0>EnmqyV0gq%U4CPAAM=37|s_ zO#vDMh=|t{I7a7z4*}UAV=ga3rog8_)`HPj)1$?8_6(CZ3-1CXwJ0z`$T0-*Vc}i{ zNHcp!G`|w$AVk=Qil^iTGwTz!yp0+H{Yt(BPFe}bbgTu*L4yZbMl&dJv!wtU0#sNH zASwBGvz39Mm*C(-Qr~ddS|Df&nCUCs{6bKn4ql2N4}sjwuoQe15Hn|i8%Bk-pbIdg z7KFQVJ%oyHunmWR?iU1&YnuXU2$FYmm~q8R(eGp$L`Gk9TMM*xbQ~rz063X5NYW32 z^B2Lr4OA`eE{O!Bmq(d8@h1bbf>iqe;+5cg0TPEHGY_XCUfhK9jd$ncZJ&mTZ$Ctg zI2YjK@%G$@K&e=MY*pXmv*4(p+u!={0#Sb@5U6kSlhR5c=X2lp{1I3~h?=<4x>5+$ zpl85ohVo_Nnt;ftfyrMn@R@?~B2R}v#b2vX4N|~9OOsz3TCjg+R44)CvY-unR(RXl zJmZUxxFX=5g6G~mLkF)GEDS^N+*y%GHP6M}8VT-?Uhza%fdItPIuk#xg>oVHLq_5oo O0000rDC@0x0qV3i8%b95L~Xk7_;9npl)XYj#xg+`0xrVLkUuWA z3o{gc6*9rvA4ZT91LQT3U6|WOU<`dfC vVDAOQI^GMQ6Y^$2em7um2MnJVu>XL+Q(+qybeni{00000NkvXXu0mjfGm84C literal 0 HcmV?d00001 diff --git a/images/normal/Koffing.png b/images/normal/Koffing.png new file mode 100644 index 0000000000000000000000000000000000000000..3aac7286019b6226ee8d395a8da5841f59d38942 GIT binary patch literal 636 zcmV-?0)zdDP)=LxOlMmU`UWqh|oA7SSU~s5D?-1EF%B_00DGTPE!Ct z=GbNc00IC>L_t(|+U=LYlBzHeMT0hW&-M2I|L&u&gkdo};;@*Frz%Qmons^^#P;FC zAZB(=cXM0#y7fjr%{b>x(+ zz?2gs2tgpvx2+bwlhcFjboZA^+=(2*euj9}DJgJ%GUCPg+0uOCS&=pn(4v_?1#abI26DhR&j^?SRsdC)7hi!k6p$<2%{2)C z^XxtpFb5>pSSYt}O~CBTcej_RLJt6|fA-^OE>)P3@`W>p0+OY>5t&#a`(?R}dj=A*w2@v0=0EAD{#G8^E|=!l^)! zJs~2>%s2Nrc z6!bxWK^=hS^zJ84cZHGgE%X2lwh@57>+av~Ek3UTG!jl%b0>`m#sJiJy(}Vv{bQkX z!u7n7Qfq*2#HPonm;<2i;hZ2U-)^$g64?CM*ax6Q3Fmw2rt=+R3yVx2(@%T~a4xxX zEr8B9Cg#flF7AJSe&*utoy{aPpmMDv2LrGhopj3>}xpgU*18h~5== z3pfD6nOcepcLZPfT7*yNY6#C*OHVWwEME)G1zOyHg0+H~t*QWYQE_yBE4cqc!L+m5 zjdh8UQ-{!@r%(A-xS$d6LLPqvJWrHMAR?x%(0Fh>k);*C3 z!TX7hufS^f0Cx?F4clv>O;@S{QvKcW6K5NiGXwdwo;Rx~O5)va?b00000 LNkvXXu0mjf3QU7N literal 0 HcmV?d00001 diff --git a/images/normal/Lairon.png b/images/normal/Lairon.png new file mode 100644 index 0000000000000000000000000000000000000000..51037a378b5080df8cc195afdac76fc3fa252791 GIT binary patch literal 736 zcmV<60w4W}P)Hq)$0d!JM zQvg8b*k%9#0%1u+K~#9!?Uqq)>p%!a3%I<20Q+C=3wNB18n=n1O8v_H7(0&6F_6(H zAMd>L&g-b^uXrXR`-O{%m~GwL>ADvqQtLj?zLygo@Ka#Zb(UwnGoaFz>jW>%k_M)u zWtd~A~hk+#7}Bf&jjF60wbA;3A90#%#2y;RRbV< zp=(&M8ZK%W=8FOlWrSv!L+2dqi9lBYD4vmqXEIZn?Ps2470^S_sfh5#-NU`DSwHbi zw0OaWYJ7CU9R^R9I#WRN#GJslYj(r%_dMO_m)txWSb}BH zdftJi?WXu@Ko8@!;C4;S9z$4j9PYXJ6-$}|O}+7+UtE$LRfC}XufFrnALKtrnP)8Sq01yxmh6ObG00001 zbW%=J06^y0W&i*J5lKWrRCwC$m(7x+AQVOsyiM+3zW0CI5rJsg=p^G}7Tsr+(mKa0 zr6dWz{0~%b`dR#r?^zT#2T~NIBx&*$1xS$ZY{)1fG~EedPB5#}=@}CZ7c+T1ac) z`2>@7x%h7cQh6XN3{dKRo>kpl7fxjnZ zcm-VZb)Zj>vvvLXd^}7V>e4qVK^WuhtuZEITM>b`ZKxCqSHCiW`u*WWEhwNJ1fU%Y t=b)W+0QGZCG^-x`6cm2{;{5Ux_yZ>cFC-w48hHQ!002ovPDHLkV1lKcCz}8O literal 0 HcmV?d00001 diff --git a/images/normal/Latias.png b/images/normal/Latias.png new file mode 100644 index 0000000000000000000000000000000000000000..1809f1229d1854c8e15d03a87aa8c88748fe65a7 GIT binary patch literal 764 zcmVR`3{8%vbnS@EGDHKBYv8FVCD^kZSLoukk4` zL>nLd6b};-GmFfH0uWgi(UREXSNQ7!t}irzg9SL`DZu?6)35+xEQ+H7Meuk$?qdNI zG%P!Y&;<9#&z^uJRCWwfc|82*KD+}6Y7ZUH0B@iQQta_Jz8QuyAVDcWB0my%7pThE zpiErHM+KPC3`pfO1_Frqnjg+k(ZT>a6!d?0cS?pc;O;rDlRtO{x;KN_N_;z@3moGa zJ^5Xrcz;iOo1sI6Zv{|o1wMAjxP*tW5vVJ4GZ4+wt)ra3|4*s_HTTs0^E+`6 zzdj8Z6FNFhw%;Od$8lkxQi5K86=#936<`z~#*UwQIzlPX!k6TnQbXsTZVoe35KrvT z4Zs-za^V3h6Pf@bPU(!n%t1t!#R}5+66eV$1a7(V(ghF(JYiykvw+D$BoQb7dhwW} z&Q!qfYqE=we?DJAwM_|7DPv_w$@8g2AZ`-^H^Y)Z9+`OMML9wvW(u%73?N?nYr6$; zpAzsE01#u!epRi4+k~KmbcwXQ81lGH1lB@B5AnGItk9zyhp5i+j$htPnTngw;c#0S z7-h)M(2UzCK39ED0f+k`ZY{(C>b5w~`wk-3B=9VKGbqHQx%7bpKf$J{4=2W>2F(NWd*t1 z51=H_{FYc)f%^?=16W6s6llcz z__+Qost&n8!1VQ>2XHjcxN^O zJTE@Nmr!K6fLze*ex3%HA>wNSIu>SshImSt+mpXu5SX>X6j&{2P1GH{g%W#Wj6|3x z)&@wC_wL6Shk}E9pFL0uac7R{EUXP6dpuW=c2A`;1r`T59C5!Cl9bh?e?QZK(_aSp!}3!rb{CTYtGMp#6*cnvlkTR&_Y4m z;adu6L(ZkJ97vi?%~8Zy1Gz226t{kiWN&W|>xo3U6k0&N5cpasmQ!CD9{^3rcNt_E7%xY3?ET6$e;LLm=A?` z*rz{F5PZ0yfVtrIj3NMmg1;Ps)!hV9SONaJK=m7m@MFj*&@TdYB%<(t@fWmkKq^t? R{|^8F002ovPDHLkV1i=Ze-Qux literal 0 HcmV?d00001 diff --git a/images/normal/Lileep.png b/images/normal/Lileep.png new file mode 100644 index 0000000000000000000000000000000000000000..3b0ab1d561ad3d7f060c8f71c234bc4e2ba9d4a1 GIT binary patch literal 614 zcmV-s0-61ZP)!D^AsFJW4X}Zq>1kyPvu!F?*%MSs- zXS%B517Ae4@btXcPvk}b+IR^ha^06*MfP3w)d#j42avs?Bbfe{XyOK+x8NGb6 zu*dbfpM{ZtZc9|>2n3O&Uu#65t=GwNgflSBsHN2OU-n?Vg@APPH82t2?QNjaY?8nT z%#Q$FEdunU)k&xb((C~J5!(It0bs0A5(Bhj1y2Hy_lqzGtmA7;Rgiw7Bt5nbSS`|+ zWUBd`fridiTHTI&1L-I6UGUfj>i~?@Jt2u1y%Ok`1I>oTWK`v9Kv3O=MAF^I+t+>* zMc}M;IPSHww#n+HKmsSraLmYB301uo=!@!K$7tC}B{BSUVDEu?6imNV)(YU-6vu^l zlmft#ngOqC|8>utR*Dr%Sd7fTEj-Vj0g|;C)4zw;^g6Ysf17YlBDP1wXvFrMAl+m8 zfG9Qn=Y%n~e|>_F3T|KZ@fbbAX(!CY{fLuc$8ofR2O0MRejKxKH;{yzb>AMXv)eb! z!fpRJQXIb7-9ngIgh#{U!4V?j?^nP7z5ZYR04;+bgE&48rvLx|07*qoM6N<$g0_Jx AVE_OC literal 0 HcmV?d00001 diff --git a/images/normal/Linoone.png b/images/normal/Linoone.png new file mode 100644 index 0000000000000000000000000000000000000000..29f5028dcdcc4748a5ec8651f2a266bdd7a14ef6 GIT binary patch literal 603 zcmV-h0;K(kP)4`*00001bW%=J06^y0W&i*I zkW9fK%-dT zv`qPiM!we&q@VoAiip|-XEtPoRVsq+X-O-tXr2=elKl>kC^Y1POmFZg{FXVP-Vk%b zK_1nHEI4?K3F=-cNWYFK`E2kpfl;|2GYaVU3et}_v*2a}pS-6ZHx#_5p9@}YAd?T> z_s<0{-XLPu>EO%z#RB02QxCrM^rn8XKn!M>AI_z}diRThGoW&#O*6wY;zuuHhr2nr z=;9n+1N(wcE+&SB>0CU$2DTFhcj+G}NxF9bgDbEvVE40NAudks2_W{KbWXp_w_v}3 zPV(rpE%nH*B%p}Br~9F)FSv%nHr|}{@vU8Q30Uk47XP_H*4JSft(u0N> z5p2P>0|U>!i8JwdHG#;qHu-(uGq|W~_qgR3&m@mmc`8Gje*N;dytU6KBcPJ{PGAw! p1Ev3TQ-}>-4q!-L&&mI@{01NQ8EDliy~F?j002ovPDHLkV1jyZA@%?O literal 0 HcmV?d00001 diff --git a/images/normal/Lombre.png b/images/normal/Lombre.png new file mode 100644 index 0000000000000000000000000000000000000000..5dbf23afd167a758bd3c120f7a58ca63e9fd5397 GIT binary patch literal 569 zcmV-90>=G`P) zJ_pIb<$sWX888!E_V@7l0W%X3HDe-ReSml9Zf8JLm8*dv?Ku50;PK!n@DG;B;B9QdU6)4#PLn>+=6;VA8Bz-y% z1=ZrI36%5MbOhd^u1}!My&!$UEir-Jj{*4f&%}8&F@S)32z0ogfx_i0z-M5zKoyC= z+JHhh+-HGiz~Tg6ui!YUlZ*k@SqijPb$;-J83ho&mM;qJs3Y-mA`ZfDt+2J5!kHjn zPDGJzw>lm^?h28Z^Zy^w%b|yVm$=#2c%v`S+WQXT&5!UGdbT5SO6M7M00000NkvXX Hu0mjfoG}Dn literal 0 HcmV?d00001 diff --git a/images/normal/Lotad.png b/images/normal/Lotad.png new file mode 100644 index 0000000000000000000000000000000000000000..71a8337eaf531e8ed43015322d8e7560703c121e GIT binary patch literal 436 zcmV;l0ZaagP)ln z(P(rdSgHy>#G)S=KoPuU+E4Fz8^}Q8E=ws0-TzbC{QW2J2U9;%YAX7vanzVD1e%u*ZJj>Qj|7}9%i`Jxm@alq)malKlg+2g?Z@V3nU)yf zbwBUhwuQXCuut>6eopYtz}#Bbbw8b-iM;U!t7+ra+fA76w!b=0lIOPB!1H+c!1G9s ekBrgi-}eKL$s92r%a6nW0000p4W&i*H03%V400001 zbW%=J06^y0W&i*J(@8`@RCwC$mr;(}FboB4iwY$(dGG$Wtw>pD8b@`SezpTFuz)dR z($)r>!n)t&LT31ZuQ471_|_gfbU!g6^K&Jbz0g$Zg z%IiYeV*J~n2cT+JQ{pli10w-{51|ht5SLO5Sd1}E0E-8n^ji0lOI#C>QJL-m^rLhS z)nDPguBn!s$A?)1-Jery>Bl%|1J`^6)PgI2O?=!trIc-5iw6wyd7y43*qrg92={aT zB(SFKAP-;$X@27}U?uMP3}9xemOl$fIiwfVKJpl@s;=ozMDWSAY3mb00000NkvXXu0mjf6XS@P literal 0 HcmV?d00001 diff --git a/images/normal/Ludicolo.png b/images/normal/Ludicolo.png new file mode 100644 index 0000000000000000000000000000000000000000..296faf6e9c3b7e8a9792e90ee99c8e896b1af4ca GIT binary patch literal 887 zcmV--1Bm>IP)M8uu7700001 zbW%=J06^y0W&i*J^+`lQRCwB@m4U9JKnz87+!iYI_W%EOr?(Jzi{mryQ8I?)96ABR z?IXN@-EUvx&Am1M51)vC9q2IN{+&K|07>Ete*lM2Nr0fjyiuu}y<6&V12+X10y_9y^o0(Rp40Oem$!VbO<6qX|( zz724M@lH(1&?km|7={BFQ5^?J?F9dHVCzq;!@$M2*E_*_g`I1lVBidn1jwaw2@Dc| zxFzR|k#{~x0kZjn$T&dY-M{~-iQW70d_J#@alpm>9(UJHhO&?_L4Nf$1Ix1L9&(Xu zA_jgFah>nWG)<>TTB`(g@~_`dmEXLxEK}n5^5@p!6o`$B|9B`E=!vOVd?}rNlg{(- zE`A0$K$^bnGf*dz#L(wol`oK#-S>ufwgAB(pfH2C!dYN~_$d&teFhA3oBOu{#is$a zl>rtQIJ5gM9lRU>mIbs{foa(;o++ub-S;fS%K=V-ek@bz6`1?Uj&$ASWdTavs=xq! z23*o^tuCL9b}7IzK)}Q_?fx`*?Wzd_Zwid4Dt-(wxilgNe%(Wy0?~a2_5sMcu9N{0 z`j-GfM6{L~^^>oUhxP`{kbyw~BGMR`yfe`!^~zSjMlTg)!s)X>JbeN)C=+Ii+aM91 zj{yr#ojHQKO?vKhldH01QFktTjp3ckw{htBuBJvpM ze4nMYiF1dmtgwWEp}+E8E7IY?5`V0!wi7Y(HT@2{L$_r5=YaUY-!VT=-;wo)FQWmh zQvu4OUk`!B8)7#GO)kfE=KR%`hkCgS!hnE+tq z2o&@`DX?(~1pQAF=LTp~|2WYj)YY_uk^Mdb`U&+f2s8aUKq49L{x5YSOlYoTtndH; N002ovPDHLkV1l2Lp0xk~ literal 0 HcmV?d00001 diff --git a/images/normal/Lunatone.png b/images/normal/Lunatone.png new file mode 100644 index 0000000000000000000000000000000000000000..051b630240a5e47e329f131406d779531a1baf2f GIT binary patch literal 584 zcmV-O0=NB%P)CuXJjMuMvOr9q6Qmxv_rSde4uF{c z9Dv!2)YR|^4qQ*r2D)eie+IzyGeAcie+%;tJP?fl^}P;&jfI5ecaCGOL_p#JmSO-! z1l0f_k#y3abB?vJ4A|Nu(U3ZAjwBP%gS%}h$;R_E+Dc1wE%pFRO z=>xOnVgL(d9#9@~H{9=By~8!a84r}pci4#dj1-yIo@eOoqCo8U%}ewry%nNUU=>6- zw6$7+*zs#e7jaWwg|#7z?CvNEB6|Byb3c@zSs>SUP;DS%6wuW5y-3IG?;nRR|CnDx WHXDw{G{3a~0000hr_@H?3(2$^LQ26-xSYWttI4}@$zoGyD00DGTPE!Ct=GbNc006N`L_t(| z+U=Gx3dArB1g%{qw*LR&Lq`a>^orveO_OSdY*3NWG{5J*BTD*pIrT*9?oLF(PY^ZV zi4gr_z+Zq6{4HQY!2c827oZYIZ^07^fyls`>j{LkAOqrpd(L^ebMaXahdzKgQ}ujM z_yXTINHPH75M#ST>5fng1n3V0z&HNbj-~9AEjxUra9mPt$+qT(l#4e00000NkvXXu0mjfzZrF? literal 0 HcmV?d00001 diff --git a/images/normal/Machamp.png b/images/normal/Machamp.png new file mode 100644 index 0000000000000000000000000000000000000000..5870280414e095dfac3565b05f9b8e61e2783f6a GIT binary patch literal 1022 zcmV=7=-_GVT%!E|Ixib8yy3F$HR?oBt(cb#kMCDPa;a z7`!O`)GxH!T9s=371bGCx2!l4d_-oDe4ou6Q$bm)csv}?Ud>7ggqMbP3u6KZuZbC& z>LW&R-vF(BK3}b*%k~6ye@OsgW}c$e4k);{&HlLoU=s2iQH~Mh024{1e*@Ik9N=zO za{x(zCZJ@BGk{6}UUgHty$$hlfQ^uQK!{~5i4nls=VsjyZU@{S00A?lcI}Zgqe!_w z2*5TyfXCwjPhnDTxU8b~{ly`fi(7cyfws95Ac+||0B(@NpMq-#;1=P2f27*xXC|XS zW}yz3XZCqt&UW%G0nJZ9WdJe)f#tJrsm<0Lxcz*ADzp0txP75~Z<5dj@CaDAXHzm8 zqaoBtQnVDoOMn7^5`-{@CV`-c?*U0Liea3DJiyB}B%qA>W|#zkD*`o}5+ecFKagM_ z;rTAGlo$pi!v0JE*_(jH>V+G$%WIT|pTPAw$P+63GcN@j{{Arlx~&K>Nl6F^OhIp! z&i%~W8oAR7K%@}T471!rx!1y+HOl(o60QI$rH3Ew4x}LkU@m9Tf-(~&N>HQ+)YV@L zTmeXAqiUWQrqY|3^G;UqkzbY~K0ZF){(i2Y&Iv$w12zGjK#n1oX>k>S0@xIZ0kDIX z_wjuV)guc5;2uzl5o^Ghf+1xDlDjK%0dQNdNWU_|muJZVYl0aAkU~hJ3&kv>;Oaq2 zfWi@l5P1aXwv>Y48F#Ngkp4FSmv7=(g#w2%11zNkTx}8YEnroH0O)olDF9jqu*(37 z3N8pTm#}n)y%Vt9U{YBBS(CJ^k)>7$6r)NBKd@R~&QS_Z0G3b5f}af)w~;#EN&!&j sTM7Lft|r0CKD$~`^|x~Ozx=2DH%h%BO8T=XLjV8(07*qoM6N<$f_GiL?f?J) literal 0 HcmV?d00001 diff --git a/images/normal/Machoke.png b/images/normal/Machoke.png new file mode 100644 index 0000000000000000000000000000000000000000..ce1e5e7dacc0f2136bfbfe42a90a68350b165811 GIT binary patch literal 702 zcmV;v0zv(WP)aJmK8Vqby@32{k<-@*$*I$<(9BE06zlI06@G8aa zEMDs~K;8k?`f=H>k3fR9k(bE?c)2c>f;YN2!}%=%0T=tF6k{Iq)8;tO4X`c=aw(?g z2TBOU{0UgR05AY-fK5DRivdUkt^l^%-S=dh%HR^95G zm?R?h0GqCifjs$MA{z98ejfCX`K}_lTbW z&Ni?Cz6)d|$o>MbtuCOk5)Z_L*1ByLr6owOFlq6@wC4xP69~gjf+yM#^0)VU@a1i7M5R7Es65M;3 zGBly>LEHglHDGlCx)@XfXadv#D1qr*U@1k={yT^RFx**VCLd(AgA)TlKraDqkq9a! zKLNch&__So10^1S$BTd>5QYY{umRmQZUCSFo&*HYe>XuHgn}eR=g}l2V(5g3*v|el z05`Q4O7=4#w&uQ^Zl9*3b^xM8dKbg8%>k07*qoM6N<$f(C{sQUCw| literal 0 HcmV?d00001 diff --git a/images/normal/Machop.png b/images/normal/Machop.png new file mode 100644 index 0000000000000000000000000000000000000000..cb3b3da071f6dd24cf881e69eea935903936e84d GIT binary patch literal 488 zcmVP)1x6zYv}(!H-eEuBIUqv-K_)S(#6;_Sf1Xz zc>yxUNOCtm@*L0gxox=@AL}~SZD&k1|+GK=R-5IwR~V3$#yydEzI+5J(dMqwwne$O0YZ@to_x9Gz6a|_`EN03BDGW zpw~|9dB!f#+-;_O5{TOZY$d?)On;gZ8OqTX6tV$O%F>@_NlD}qfu=6iew!lQJe7wc zcM7n@fs*Nlz|xuSLyez8O1P8e7IKgs*_NH_`4Si$aK*)C10^s30+6so8U@rQU;^b4 zx)v8cmw=-Lq=a0FgKQrK_-BYBLUQTjCN3yce^-)gM+xN2pN5MArGWm#1y=JgnSGuH z0^4f;MxbNODna^!oL#|AJFhbjkTmjt3kaatY2~fyx1h5PsSf6MSJFAu^52S;#&t1C e-goRbug5p8AP)EzIc81(0000aQL`r_`m?DsHpgWNPvKV*jON-Xjo=uW68Ef00DGTPE!Ct z=GbNc00IU{L_t(|+U=LYj;k;b1cOOt3cLINfA?WSqU;IlMcTcjBAFcAl!R=DK9~$LFsKqP*}U5>;yQo=c{)zJs}9KI}waLa?3}ymg#iXdSxJ3Pr->Zvq4K& zXa0vkZjCLo+51{On-8A2*4C52b}3M3jh}fm4AreyG9?%Q1^p1z)~Hv{0deN-z<}h$ zSzR+t%c~O5h+|1%A$i+yZ9~wq`Kk{@#{z``C*bPZ1vw!I$v*Odz@4o2HYE^i2#tJM z!KyngTYB5ld3_Jo5||-ayI{<-(>A!KF9i|cKpOursvAD0sSA9&K!6oH0t`Cm!DANi z?F!lFv(Q*kk28V(+RyN0FGbB`T6llkffi=dLI#3lv?{GJNQw=p5o)WxJVuo&=5~Z~1r-$himd@lAm!a0F&yyZw7Wk!PW^#n*lX?-W={1cKRO zyA?nWlw5Ky)6Y<*yCclPR{DjCbO$O+h$T9~8*+g&7?AQ90Nszccy-oh(@gyfH!rI4>ZsnX|gax z_}Wg~V}cFNYun5us6h9;1=_l=$j3s!Y7oA*z)xSk!2V(<5`TT?STt(|yqtui7a02RB`~HXFal8^hVC?zfN2eY zWDkJn_~DrdnN~3|VBd%T)=Zf01QI~7^YNj*UPuoyk*5WdlLrX~CYGM@ypSFjgx?)V e{C#!%@A(6({~>H0EdyBq0000jL32Q5EPRo}MFd%$G^ahV?lL#6Vier_MP|fIB7{B6^ur9u%y@G@5EV>MBm&tQau*UixOPq^hyZfm zcv;d_50000PoG>t5bUUXSYj8?%hX>O3@q9 z3J?~HRc#q~&NE(h-}eI)Kmb{!hr#>K%rF^8_ah=A8l<9Fuo zq*VW|WQ;W*Z0ZJ#pGIq~##@lV3t#hYv*r5}z10e~N~#Hq{GFKFwmJOHfWNV+qA&Zz u?3doo-H=}A2NQm-f?@N(=kL!a|IZ)g-!-qZC|o1}00000@?kEP)nVI-lNPvKl$WTCdSU6Z%a4ySRLaBy7hx13Mts@+km26W!aMv6kzXAOf&|0APCC_m_bri60FV zlIh;Mj~|i)-tdrKYJXk$O?(cN6#p-y=Cz+oDD$jIeVE-cB{eXY8mVI)W)UoTP!T0L%i)K_xvro-mCuz)Y2 z0ntCASe*uVu6&#WW-9=W1{4uw6`0-449B;C$|D@i99#g40O+rQ(^kPx0IJ{^fEfTY z;Rd89(#+x*Xa@%`iH5BScR@oOWtn)P;^#s1KJtf zhoB9pHa!bSxevg^-BpXG;{O1?q+ayN0t4_Jn4G7O0cZi9zRx>oD%iF_X2Rj-TbKl- zrIky7b)kJGH3x+5^I2m9xO>fR;89D2b)MjB$eewO*iVa0&i-;;!$GLh210x)~@9t&)m6?iQro l(2}#iK#k`w?cw2{=Qn~g6txl>4}Aat002ovPDHLkV1kvE;iCWm literal 0 HcmV?d00001 diff --git a/images/normal/Marshtomp.png b/images/normal/Marshtomp.png new file mode 100644 index 0000000000000000000000000000000000000000..bc59db922c4fc9a3a59c007da2568981a6a12ea2 GIT binary patch literal 639 zcmV-_0)YLAP)o5!jbtQoWVVv{-pL@-hn8zrTl_Dv!jmO3A0II;{ zkKYXo_kBD75aj*910aBJ6!5(Qj}h(`&;#J@5n2HJu@Nvv_@NzofVW2gvwt&SCZcM+ z@w&ckBAPJ*;H$c9+m`*56Xc5l(j zy#N&j&qb?0NhB5DG?TLL?l~X=5uW+mRth28V%k6sq|$(hn&PZrSz8u{;CcY8HBd-2 zRVYt<6M?&j;OMrkYYk*bmc8sOAXc^w$yWoiUGU;NDfPpi1ds=C_mun@c*~v&kQO-E z0HP++8gKPIdi5s(N(U+Jd$;!(qkr#$EiP{4j4N_=Q4vw0_(nyfDV10X#SI$*mdX^6K00B6f!wi^y|T`J& zLQ;5=lIgub_G{r?U~)HsWDkT!4RraD;d$VJ+MuQ*;Hqj}M&`>vhWs4BU>*QI1k8*V z{86B(cR#rmIGA3iR8vhwe_|D)!P!v*n5wC#ira?*=XaGpG4tW8)*YHZ8^LP80C!}+ z{wF{ZoSsG0j18a}V_RSbY1L<^6))c@v;vm{)WFr}0|f%ZGGH6&)>CCPXMuV1?-lrK Z`42+&FzB{;w}}7%002ovPDHLkV1i<$BzOP- literal 0 HcmV?d00001 diff --git a/images/normal/Masquerain.png b/images/normal/Masquerain.png new file mode 100644 index 0000000000000000000000000000000000000000..6a146abd8172b8cd828112b058ff139a77242a8c GIT binary patch literal 679 zcmV;Y0$BZtP)T)^Ktu^bSNpQ_uv)1)r{kfj z)bN*6^d+C>^s>OLzbi=dOM%YwoZbrbmjvJ;c)`CJL1`*DQD4D$P(aT20*N;G8K^vU zH`t{h>3IR?e{`e(5IqVi55aAL|~_f(pECy;m$ zsJg!369l~hNm~KQ2i%h;7j%Y9IKrbSz$_M!hOg_|2{yy*fdKq=fhzE8LC6K4+<}*j zn*iH8ekp(<6BXK{jfX(%?kh5Rl4~G1C^7^l%n+!~RGEE&gP?bqag0r%>Nh#$*#5ti z!$lnTxIk0Ogn<7lFm8NoJTlG;t<2yVG!*+oz7$yV=Yt7Fv~_UmB)eXKKOT2TNp=Nx z$9sFO`H=a8EH0?eQ8yN@oWs3fq18%)M@!NKjROCE!?G-E_5xcpx9G+AHBGP}B4S}I zA`~gcDCQ9XE_oC$bT#YpJ#MgosmgSoCVA|N+(0>;4i0`La`M-vDhUx4o>*{a=Na6T2I zit}_Y0NxA2m_Z!x1yl_!;c;ZB``xf4;f3K{156uUMcxX6{O@1O{{Z@SA8eNO1iSzM N002ovPDHLkV1lZ?EiwQA literal 0 HcmV?d00001 diff --git a/images/normal/Mawile.png b/images/normal/Mawile.png new file mode 100644 index 0000000000000000000000000000000000000000..207259d2413a404e708fba19b46cd6b25e847016 GIT binary patch literal 675 zcmV;U0$lxxP)0I_sbT>t<80d!JM zQvg8b*k%9#0whU9K~#9!?U&JRt1u8m!E84y_RRl(?)7@LqLtthsQQ-kRyF5jFdSq9a>SqA_)d1(7FP%NWyAz8+pv1?BAmSv=A+P-;1^^%&l9{+2&`vb+RNe`weG7==1=uLP z;Y$WA1FFi2gu}~#NZiDQW)V=LNEa^(Dxt>!&KZ!xg^)UB0mnWhu?WlyECP)UqEi-l z5zq*Z(60ko;MOuQRSo-&?|~&3_-A)gLFXBmO;bAWoF#)JcC?uX7f z0^#oiJa9SzW~sAr@kfB}J9Q6eJqa*%=KYWTL3Q>34+FdYdc8;tKcNBM7y%w1LF!xT zoOa0g6EMSZAl}gnq#eF0Lnr?UA58r=WFDoDe+-?^Z< z-|bV@04mn&MsgwJVUwY6pw0ZBV-HUjYi9RV){ z14JZz1gy4!BA|CqxRjJq&Sb8u+EX9hBU}M8!2B!%*B7S5J^*!?flvWhtO|3) zP;gomqMT_UAo4;iuz_|&6#k~X5D5r%44WzZHCffz7Szmi>w#UfriL$4Ys-Pvj;hw} zv#x!;jn=x->?&wV+Btpu=C@JMtB^!kb=MxeCacb^AVh>iw`V?9B_c!;O2oS$KbO8_YTpPmw{PdvAhEKk^koZ03VST{D6*Ec>n+a07*qo IM6N<$g2R;?@c;k- literal 0 HcmV?d00001 diff --git a/images/normal/Meditite.png b/images/normal/Meditite.png new file mode 100644 index 0000000000000000000000000000000000000000..34d7b4d6f58cb172ac6e08461c6ed2eab579d2bb GIT binary patch literal 504 zcmV8}f1s&&MFD38)e|K#J((WZq$TcHXu_9&wwTH^f%gZI; z@(71go`8n|C{+2xSLk}dyPt5?p8;@9pS}Xl+qa*7g5X}k^?x7}d~^T>eEk6F2V4yR z_wL{U{se$|0uL_j4)2mWQlAk0-FJU3Ms_CdoYS`e;Qh1Fd%-v7<{ zZ45x!_nmt^*?wm%DL~qku{TAS0JbNmfy6+zCekoArgTWQeQ%T#`ik7USgV+{T4g}W z8FNJgN->+hS*dah_COmK&(h5TOJJ_9N?Qt81k&F&g>~-UftCkwY{RGAh3q#_q)o~K u83;hi8V*k%=`RG_(*`zIAE|aIB*aU5P?dkK>z>%0d!JM zQvg8b*k%9#0=-E@K~#9!?U&td;z|$(J+=dx{(j#7anDTmSV~xSbBMGTE2SimZK$Hv zGDvJc{P4ryMS8s8S9FW?XP>lR(H{dQ^?ws4CHa@?fL|8K^q&Q+x-97r{`aw)uPniz5&K414&5;VzLCKy3K4B$1u zW=?br7zF^H$6*dK021)$0hj|QZ`tLaZwD{`IFBk=15D(P0pl9LvfWx0-iYKlN1(|S za0TGyixL6m3TVkewzdy{6bP_<6HZ@`0m%&HYE9bn*jC%$DsfKVp5li<4txc`smEIN zZ27$1)v|Do1+?2e1GEg4Pq=)Wy#j+B6^38g;Ku)1cDH_0>eko0RUULD8KDlNWIm@D?rlM4?%vF z)3o;{ee|JKklLOBfQU$cqCiI=W6iGQ`F?2zBt`|Y5L|)8Q@2=1p8jTyCm|MC_u{NY z7jgyLVj0Ca&!-$t0P4qU1*ADaJbXvfc#d=hR1+yDU}P$pw{OzUBi-*~|NKArhxre}g+w~X{5F^X0000ay}P8F))N2!b5Ep|TocDd+J}2Mbl^BBq#3iZ zfgsB-zx)%-Y(Lx2bYIuitlqv=h=_5f*2MD|kgxl#wFvt3uP1vk5z%{ZqNnDcD&~e) zFE7#EQ!grI_F5r&Z_P~U7Zq?zKMSt}B7Jf%m?yV_UMR@Sh(UU~`FlYEA~_GpEAW1~ z&?+$XiOkRj@pXW_0Lbmb765$;7<%ug0lHV=E!s!a_8jINxcV;y)+$8XGGW98d6X_o z5b2)==532U3M~wHtAI*ZW?IX@8Cnx}?^Pi1{&snnNJ}*Q3*8akoUK>holTDiF_omJg7UAi2wL zu8~CgBu+2y4l)l3G}FKm6%z zn+AR#pp;9_F9WpPV@lk3NUuIPFOd5Kr6&Vuy#?%ffCEp=rvEu0AGS#9c|cP3$r&(n zGv0p(OKe+bE*=81#C>(zK$hrk0GHH9pi4RgKq^9+a8Cbz0J$=-&A`Fe{I=W+DqXl6 zQG*zP(BL7!TxqRy7D^YF`v57%79<}7sM)rj0abvVv}ou~lA)*ZjvDy$AF(KsIK)n4jN)zEz+KaUY1*C}n~(faOTc8=%(XaV3Wv#MW4W z^pEr&NVa33*Kq8kM4kA#Zx^@Y0DEAc|>#lKn2t=9)!dtH~=cp5U3J#0B8kDfJvJKpb>gcP;Z4W959*4 zz&t#{tI(olFDk&kpt&)K7(&cKrnMsIJt5b(j0Vs&1eE~5JAh(N4h6JPdI-XJKkNd* z9C}x84OzF1HVaZ{>0);a%1)?tX$F7^P9f28gS&x(3J6dW)pGqRfYh-71}Q9*NagYp z5dR~HBx)w2faEjY2gnk*&I_n-cjAu#&j2+awGD9CujSwmfw1ib0Hu8ZQeATa2!)rv zmH7^ketB(ry#g?h{V*x|E5JLujCY`Z`!?7e*xA56+-rfi2Udsr&J7U2z50^h4=m)f y8=y4VvJ*I!xRZIH^8j?u=VZSQ{QHOafASYlCKbhmMDMTw0000d<=mW5yi`Q=n$pWPhXm%xkP}GD z{U9)MhCulO5cWHezX1xQ<&bjaKB_((cOaXH7~~?b@AdakJCM!nkm~@28OUY9b%25& zb>TMPLiNuX$jhg6pt3)JdnT<4fo4DFk9{Kyd;z*dq2p`;wBS zqo6%qaG-jB0$6_~n5xDzT_9kp&p?6$HIkSFbK$I4j$)7f0R#$l+hSlSJQLbt>^}qC zqHY~ngG>U=Urj-}y8GixKeE;S|CQl)@3bAH)T0b#JoY(=zoZfUChe0dWA^wt1fb`yB`# zks$!9C(Ho*9bo@GFzP`Fc%P?$xepor3Fz$^sO=(x=XdtY42T2sT*4m*YV|*8fbs!= z1LE~bfVaKxmz_dW_y8h1;2FU9zV`_*pipD2>;r|X-T=wJ7w?a^xyCc6fW`Y*o&@BS zCfUZT*a0&vCjct103=Qb@jCm1U>^Qo;;+Ag$SF+qPl3swpaZ_yCBkL|u+hGOcwUu% Y00Klf3BoIW&j0`b07*qoM6N<$g1mTs5C8xG literal 0 HcmV?d00001 diff --git a/images/normal/Minun.png b/images/normal/Minun.png new file mode 100644 index 0000000000000000000000000000000000000000..f8935e20be458a204d641f2278984de2e5f4e189 GIT binary patch literal 435 zcmV;k0ZjghP)DlH0004WQchCHD^A08CKDVtDuA9@4`R zQTk%RfFGiW07ed{bkGDVP@$2TqZ{xb3KF>xKmw={#BjhVEiwT^;hvN7dp7`P5$0h2uhovy&6VYAp(U{mWXYOD*?jY ztAL1Wfqj*gfKS35n4^D%s<8Yyun^EpGQy1H+5$OIGouL0@4`w%nXI{(pj?2gz_rBv dvwd@Ol3!355ne002ovPDHLkV1g5-!q5N! literal 0 HcmV?d00001 diff --git a/images/normal/Mudkip.png b/images/normal/Mudkip.png new file mode 100644 index 0000000000000000000000000000000000000000..546fb0922268ada03020d278a1d1aaba459ffb5e GIT binary patch literal 516 zcmV+f0{i`mP)t<8l+Urc*Q_lAMt#KX)%+T}$fO$9=dcTf; z*w|;t(Z=!L6ZrCaVR(-n1n}YH4D;X~&f<;xfBEKS2mb(>HXPKydloqW0000i6lp52Yr7wd*p_>9)k4+9LQvz-Y?ETuK z1j*krgxnK#pS&dr-|9kyk{P>@h_G#e&8=Nb6l22&-bFX|Li32$05+t}7H{wZE7e94 z5h0}b5{B3Bl%PX+2-|82%5NS(uQO5wMS3M}$kC8rGhWK-?C!`$L0)^N0i;qw3T(DBa6W5;rPJ`C z<|M}eYzNSnA!4?R?_rF1X?o|F24bsYpfu$CjsDLZ6~h##_Zbdzc%dL>=MN#m5wS;z yH53^!KqBJJtJQIWVh8f^HbjQwzy5xEewF`1)Eu!`5iphj0000S6|$}l>X!{KoFKiq%R znf*7NRXwkVt-!uIM(=&tW2ba$t@XeRCBbNKRwD1O!oaRhL?R)NiIEwBYQ3&Yn$?NA z3VUl53ZF>Yz!Lyq%)C_)3S_N7E&`ywbDP5o9zBR@1c2(s4AwtL1PBawN68dc08m9q z1xEM+-@VQF1c(UEOHUO<;F-q+8*2hv=O-|{i55x{S7=(EuBz_L45a)Uw@>CM=$$G6 p6Lr=)kzYZW0M4g)I2;b&@&YbI3!7P7C^!HB002ovPDHLkV1k>@jE(>R literal 0 HcmV?d00001 diff --git a/images/normal/Nincada.png b/images/normal/Nincada.png new file mode 100644 index 0000000000000000000000000000000000000000..48f0e2f369deed481e529204208001f41ef500cb GIT binary patch literal 524 zcmV+n0`vWeP)8cWk4YD{V zW`QUd7Z(?QgYCEey8SjV3fg(gzh^)d)Pd?7fjfk170kxZ3K-Oc66p!H^#}SiVYCC@ zIwyUh;U~Now(Y(qCj&}50EupI(YBwj%yBM| zeqyWLM*wSbPhHu{Yli$Oz(hzG%;#2s(qz5@gqhukt*rV=caI>Zj+lW>MAVnXM?h=U z?`?0bg@F<M^{WdKOuYOSJA^|mCjAN#sm{mlWA`5#!Ad-G5_GQ6a+O0XE z4Ddf>Xx(oy8AD-_I0Obl_7Rxat@~a+Ve%vpMktQ~AFD-qRj~dLXxHZ5N7^60mqQ@2 zWdmiUtq*e}rmRCHS6-jx)9`L1EM0p47YsK}Czqq*gBm4uDe(3nX0XegLq5U>yc5D*YDjTbEd0004WQchCfP!F+O%naylsK2cZt5J z%2E-lKRR(#uhYyb{{Qv~xXh7y^%;nyV~npWoQRNOU$qevAPvJ#JJOrvkqJN7x(>JXQtBB_TAc ze~7+)CCqPO;Q40(%8BUCU9T=g@1!xR5N_Z?B?4M(`A|-&X$m+t(4|SB$DDwP1NsWI z1R#qA7V|ck$j3#5D_ArTV-jaT#$a|H09ykf5V>5yEUwuv8Yt)7T!A1QJ!0Y2D|G;$ zz0(T+U^H# z(I_#&ISyXrl7Sg-Kwu7#_UF|B5rVO9f8?VW&ic$KnA%1_FMsx z1bUbQa7e&~3N%>qL~E8S5cK2v2+o~mcYxKQS2Yj_aO$)vTNqybJ&3>rNJoa9!0;nz zfJrS_Ku97o`?%i$HSJ2ZvY^C7_S-{=k~ZR+xbXo-b(aQ542J})YS=!A4Jn-B_8l~~ zJXrOMNQ)cu*rGeN?0WT(sr>y<>>5j6P0p+5S$#s2Qv3V@v_5S!t4}ih<~Q^Y-#`w! Ty;K+d00000NkvXXu0mjfSx8!` literal 0 HcmV?d00001 diff --git a/images/normal/Ninjask.png b/images/normal/Ninjask.png new file mode 100644 index 0000000000000000000000000000000000000000..8788b4073233de3ed90bb8c643c8815494f947ef GIT binary patch literal 660 zcmV;F0&D$=P)P{9`ts$= zUxWEGe-PzQ8e=0T-%fCF3bbw9PcUZ+_!MYuP{8->Aio3}U(T?!X>8j$5bpX6ht2%3 zTWjYn1iT9HZb!)daSF8k65kg1u!C&|u6yvnJ3s85E&TH}GDjinPeEV(V~EWe*WXh1 zhLU?`fD$e~Gw0I)*BLS^DVwPRg@BpJGZ6A*I|9cLTMVI8Q5`J=GvMa}cKbR&upgjM zQ2_8aP%{IQ!^ak5fGgrp(E9L7t+kZmM^QWjyxY!j|B6T^byLky3sH?i#dO^cnBVBk ztfhu;2BPAD8i9P+Q@`T62g)9BKMEDhw6p_p&`@UprR)Jk`0^kv@Dq$S2CNn}bsv}$ z82HJuAuMAM;b63e3RpLY@FcS=j)0fIAQ}y3-8$mo;{LLLHbzyobHIHwFFYez(xNbY zdLmz;K5A_s3h+Qou($>TdIto)hyuWx`+(WJMv<6+-}qh7frKui9uN_Du1CVak;t4E zOMt%u-KsAi(J+Ynh9v79nD>#M39VI41bfBcA1!|c=JlQ?IKk2B9#|teju2Qpb^09d zZv>3b1r`K8nVIV0FAF05*y+4SkE&LrTZQ@UG*PI=0cyo9KSq~ckahsh^ET2=tc&2+ uP%t3f$LzPi&~Hp+NS^?F|Gs|tU-$>9?;MEQMW1;90000#EY!46r3b27c$R(iN z(#spzUvxBR_w|5OUMI_MpO*K5lh5k`!zdtr4F7T#NfnM`si$iTrpUcn$d-D62pv0A-#D2v`A)0>wb` z3vUC`+$AE+d|(ym{bUbSbB6F!cw@GtDU;^g4cv`^nS8s00SdyuS77IUz_A{pyZ8#+ g#)Ice`QhOc-~87U=CU#0k^lez07*qoM6N<$f+?-d5&!@I literal 0 HcmV?d00001 diff --git a/images/normal/Numel.png b/images/normal/Numel.png new file mode 100644 index 0000000000000000000000000000000000000000..4a6342b619e7f96c07306a1251324fdce4ca9522 GIT binary patch literal 503 zcmVPH~#Sh|nHf*=^c@D*Ex z5?-AmR_+H(h=&vliU808Ep|{aP@-b7#U7bvRv12gH&Bp7E`Ytw=Jp=aMAAChs zKiN_e4q(q0wL3xz-uvWHAn??1m$v>E>=nG~u@O3%TQcAu@A05r>9?=;LIj2gw?g%E zZiST22NZ?G06+v%LG=n_ACS_D@*_Znzj7`BJ`zF=xWvT@6tr`h$#cyRqZU0nQcegH(~C3e8N+4led002ovPDHLkV1kDj=S=_r literal 0 HcmV?d00001 diff --git a/images/normal/Nuzleaf.png b/images/normal/Nuzleaf.png new file mode 100644 index 0000000000000000000000000000000000000000..d8ce2760d52322c2ab5f7e9df1cbaa34d5c8a340 GIT binary patch literal 545 zcmV++0^a?JP)p{y7+H{#x^?_Y#8&kN zeeF+ryQ%-ma-kiE8_Y)yH2erG`VnB@Coz4oRi9Cr;f0x?832|7A_8XdKqP4Tz;S#| zfCVBD<{1zfy5Q)1{xiqDJrec{aQI>$1EB%(2be)C3nMg?g1-W?7-+4D0PjPXL7MwL zy)pv(Arp*uQCk`y0uDHMRk*bnU;$VMjJJSa0)gK$V;;AE@NEvs2LdCi@9!vH%TVX#`Y>EEjMG-PM4|1IYpro+~(N zB?nZ=kKwEPNzidKptLWL4nTpWeLSCG49ZRb5;r!8Y!u9i)Lh2OCXmT)!9?ahWfL>w j&hYme_Wj=Z@^5|tk((Yg=`%!P00000NkvXXu0mjfW902D literal 0 HcmV?d00001 diff --git a/images/normal/Oddish.png b/images/normal/Oddish.png new file mode 100644 index 0000000000000000000000000000000000000000..d3ff06f4a582af5a8f470cb299165ad6cd9077a9 GIT binary patch literal 385 zcmV-{0e=38P)Zn1$0Jn>sd0J<4% zjT1i$q}dMG3T)Wk5^4lsmLp3#D4-i*xq$)k{W73^1ul05!cPBff#ePlF%SGe40WNH zCw?Gg08AZfXDDQ-peK?`a!3-|IpcZeoYUQXw30ug;MIaZpSc2`2vqzhSMXY4tibo{ zSLoc94%O z5thU1mmeTi_T%w9eJ1WXQaUrf5O);G`xoP^1Z={lB@<%8-g@ftDQy%Vuq0 zdwhY)(XbuIrV~V73MxG}m<9DTL?*$4CJ1f+=9s@2w9Y#+L7R-+J>2+FAi7o96R_z5 zxjPM7SUqnys_0WqW!cmq66YFkX{jRbfmq=VyT| zpXXC{z6l0u0oYX*6;e_w62Lctl#iDl7~1CCJI*K^DZh!n!~MC}LGK&lQr7wE#+L z=A8;ayM8&L002ov JPDHLkV1ncNC2s%# literal 0 HcmV?d00001 diff --git a/images/normal/Phanpy.png b/images/normal/Phanpy.png new file mode 100644 index 0000000000000000000000000000000000000000..b218d2ffa5eb9e0cb42881d7e9cc0896193fc223 GIT binary patch literal 409 zcmV;K0cQS*P)UtP*9M7000mW5Cg&4p#T5?0d!JMQvg8b*k%9#0VYXA zK~#9!?Uq4q#UKns6TTS_bN>U^5TYtoE8%p@+ZYh@gq$F8Y&M(C3SjV$xRqjN5BSKZ3}9iz+|BMhO2$Bx9>Ax%O;|E*pk1KW7Udj*)Dd(W z+{2*v0&7#iG6l>UCQ|_VssMNjtiYpus*Ys?9s+zSyC7xwmJr^*DQc~as|EsStpNnU z5LANI1s#h>a<5GYS`8ZLE|6Rlj9kMl=vlu`q;*5XMRRvaV@jktIgx}3bu2%*b zCIpY&1cyK%!PR^;AJm*knv2ZbXZ^OgpFEq*=5M|LY2Xl8GhOhS00000NkvXXu0mjf D>9waQ literal 0 HcmV?d00001 diff --git a/images/normal/Pichu.png b/images/normal/Pichu.png new file mode 100644 index 0000000000000000000000000000000000000000..6021600ff3b6166ecc54000349046fc2c7add6b4 GIT binary patch literal 395 zcmV;60d)R}P)Dfnn;_8&w8<#M_FZ_?sE zq~*YSL8p%c?*%C$asmCEhZ2FHq}RD3bp!@1q-RfHVqX*>fM-AgA{iJS0Sx(o*u4bG z$7BFVbS6taz+hnQa2hp}N(Sp4?xf`2(CPpQfR!xj#@e-;G!ZaJBY>tRfSwL`0}LmL z+eT#r8vq{1u>;t)ZJ!F@*!M@kOOg{~Y5=(JDrq8n03gjL_Fk);gZKM<0HA3Az{w+o zPB!)vT(!n|0XDTavpN9K%${(3@6Bcc01X{&?hy#e*f}{9=rj33ps26Z`TD2&j|*xo pw7OpkjQt8}`6cT5>%3fk^#w;14RN>dH{t*Q002ovPDHLkV1nvCsK5XK literal 0 HcmV?d00001 diff --git a/images/normal/Pikachu.png b/images/normal/Pikachu.png new file mode 100644 index 0000000000000000000000000000000000000000..1aa200619f7a9aabde380d56794f98b7935fb71b GIT binary patch literal 523 zcmV+m0`&cfP)c_~-z@hyeKbc(4Ef-~a&lNJ#kj_-1BiZPFbm00001bW%=J06^y0W&i*I zl}SWFRCwC$ms@VbFbo8}yQG{n_rGr?g*D{yOjg zuK8~R08)YD0?^XQ0I}B}6(j>@m{vF~{0uNNV&$7z^OFJJ1e{jk#?J?2Pr}bYBjHZc zT?(J!XYgj0h8aU==sCm^EIMBLKHh?@0@SO{VmkL_76l`~7I^V%a};m__5@!*-@(eK z&i$$_0X!nGEZ<0;7u2)}#1=yEwkeJRqIt8#h}>@MOCVcu9KhWwPushHn@LDvj{`S$ zcdjr3l!}X~fF{h=nCE+6OZDffTPflK-up#*2CDy4qO9U#pflf$vJkDaJithgPnjVs zs8@({JrFDIwuKSUGy)`#eZ}xHg`MBkbU`~m%xuB;0aw*UrV6qxbPBL|2}2G?sDvII zPCz7+$FiioPcVBds}$EkAYE`bH?95d!aY?GE56Z5KvJ&YF|*JERewEZlP>~N#z(hrZGboX8zjSStS1?@(=wg6QT)nq{{+>Sk4&S7U4oUpi2qypl N002ovPDHLkV1i$~;sXEx literal 0 HcmV?d00001 diff --git a/images/normal/Pinsir.png b/images/normal/Pinsir.png new file mode 100644 index 0000000000000000000000000000000000000000..34225b675a9c6e177bea8b49970d785baebccd58 GIT binary patch literal 767 zcmVM_x}$rL@90)8tyN4EtJQI?k0;K%sHfHrtc-`FfOSpFY zFZ^a(=k3?kdre+fXO9HQ*Q*X}dtey#dsV$Ut55h8*yVV<+Iob^Up8RA5G)F?KALKF z%TIw_J|^>8ebepx`{>~EF;%aN{W2edT6O8~Ej-u(cjcGZDd|Fy(>QTY(Ke1&1LxkJfusYCh#3g21<0i$(7A zdj%P2@GC))H2BJQ!QfM{h-yahCI}6DeVaig&z(qqMs-AM0VOeFj|L?FX7GCh0UWir z*08?|Owui%^Ew1-4Y>vYQlP~IIC@4*!wgz$5nA_;i7Ac%5z&+asVu@NpboxCLS$4{ zK}7Q30;svv6#3$k=fp_;EWlGhJQk2b(#QgOB1kNI0FXRH0syI|tbiOvVIkOKZs9Al z0K5cR@q-4*=s5}iB(4R3NF^8f$<0d!JMQvg8b*k%9#0a!^y zK~#9!?Upfegg^`gWk$Or&Ho?lLil{tor4ulE}#RTD7q1B0Cscp@nmNHN9P!Wx>_uK zkUHxmnQMCf=sN2MTJguuS-0c^t@|&h$i+v{U;fVG06Olbx8zuVfY%GNDN-M?kiWO7U$6g;TN)Qt6LC={@Gzhr7By z@Z(2RA*_cZ;<){nfWgr$%n}O;g9K$AlF&22D*;LXQH%=p0uR>{aB_4fFcQGbWWt>! zWId7&Ajx#!3scslL{A?3khRhDUv%LElMzzcQxRiOO@EMxn6u^p*$wDe1}^|e)|*$_i8=FH zAZBePk(6ZJf}*TTi%^A1i00@ZL7DQ%dQIiJ1X$K?b1b{XoV$J|b zq-~SDET{rWmUpO##HGB%9sFQj*Xy@XA0MAZk}JNyA4SE*7V!1?#hvx>SjofCTrgDe zmD4O>0WzogTEQ_`}21?>aJdtf#wu#nKP}I2v56VV! zr%B0i;J73>K7Zt62-p+^^*0|j-D?46$oX=E;|%NzA|fNay zGL&pqSEX}- literal 0 HcmV?d00001 diff --git a/images/normal/Psyduck.png b/images/normal/Psyduck.png new file mode 100644 index 0000000000000000000000000000000000000000..2155f6a2a70c99261c20b8e816fbcae4656bc1b2 GIT binary patch literal 495 zcmVeSx&6oE@oyF+r8raL z(5H`GK*kv#Zq3pPK>5UDa9aazf1Oj|0EcCg%>0Ne5S~C`YU;g-w$X_R%!EmO1X`6h zh!vnhezsit45-zC%y&!C)*M6bQq)@A`5X!@Z5^8npx&3(ZZM9?qYSpy_d?gwrl z%h_HB6i&p5?*ViFIe;%96j1*)V51a3hPL&y0~{F97WKO?Oh53W1_{)O0JCocBr`+` z!o(aNNWs4*NcIAsfHb85puH_1dPth($(w*u1iF6|wo4#5An8}2G!U&&DF)vJ&}sov z4B1b=)j_E>UU^HVgoo}4bS~3PcF4!#-sA6^s z+=TiFnDv}9K?hL$$=UJWgt7o?oV`v2RkiB<)ruwcwT@hhyxK}1(+!3yCBB^9suwHblPrt5p^ISbb1CT6NxG_Qb6cLyaMEX z&-e%d!5)Ci5GH^W5iGl~0u&g)g-P^GyKuQ>3hV=X$b*nCGqv|+fyfZZL*RSe5V@x3eMf!69RUGxhi~avCe$Ee*NGCpy&qUS$0000< KMNUMnLSTZFpg_m~ literal 0 HcmV?d00001 diff --git a/images/normal/Ralts.png b/images/normal/Ralts.png new file mode 100644 index 0000000000000000000000000000000000000000..c5b029c569b94b9b4c7c7d4dd6d6a7d997a059ed GIT binary patch literal 393 zcmV;40e1e0P)K`n1GQ2m}Yix*6R6fA0=)BJCA&S!q&-D3>aMWJ`WMJUsk&)>`-c zpZ9yMdw~xNNjH$JficKd;e8eovONOEre26W!q_0#3*hvJvFc-F0jECNjyt&N-dr^J05=_yT?b#JCIDSPO1000000NkvXXu0mjfKUb|j literal 0 HcmV?d00001 diff --git a/images/normal/Rayquaza.png b/images/normal/Rayquaza.png new file mode 100644 index 0000000000000000000000000000000000000000..4524b4116901e3b7d45c33e3f882796f2d05adeb GIT binary patch literal 923 zcmV;M17!S(P)@>&o@;j?D%Q%dXa`#?8Wp=jJ){kNf`E$9+WD_AUSEk>K55p8Z$OwaV?u zhIg;e_A%t#>>a^*ZwI-!onY4qPXq(!{XE0{idg4qz7gjD>-k@r_I>R}ti8=q@26dc z1lSRr0qQouGFGivMjw~PfKVm%w~ zLeL{)zj}|*0%(W`qAw%Sn*hBV`yBw#0l)=V zdf+$rTDfU!e&K-M|XB++|klolhhwXp%-0f6W^F(PG5 zP#4)H*s?hRf(WGmjN=$#M^ryv7vTZu5C~jPHD(yNDwfq3qj3b6umXp@-E$}a%SbAL z>s10ABtQW=>1_+wqNW7Kkwu|^5>PwsLsVP?B#p{`te2@2Wldau19mZi~t4N9nw zXMju#fD&x~Hi!VU5;l9Fa(8#|xyE!5>?*zg*oV|MhEAXqIr=^8RfwmJMO2`Gk z1_0+Kdx}s?!RCoKy&H(^??@4VpZZn;Yy?I9&svN~<1yXp0;ak8LW$T5{5HUkWggo6 zN$^%6o(;SAkZbcaRbG7!_CP(fH3qx00#klgo_&ot5{QifQ9$+6^po#_VIy!c#JUyh zp?RKiS?^y~`7y8obh)hMeZ8Z)JnP*OuxZ;ViLK#oB+(AWfC@Mu%Gkd3p8!pEwB5KF xmkW~G3!pXbC+v+S&-m5IR0SLx?X5|z{RdF>9A=h`mjVC)002ovPDHLkV1kKIvZnw5 literal 0 HcmV?d00001 diff --git a/images/normal/Regice.png b/images/normal/Regice.png new file mode 100644 index 0000000000000000000000000000000000000000..2cd93f089d2cc50526fbe2a6c3e3b3aa273e2849 GIT binary patch literal 769 zcmV+c1OEJpP)!t%vH$=80d!JMQvg8b*k%9#0**;U zK~#9!&DPOw>M#(5;m*viY5e{Ve7tM06Rb2j^rnL<5YqqER&MzEvjdoK{IoAct%bl( z`yvq!74R28>kD)c)OHuh{!PelbPE6<0hmGJp*P+E@QB`GU6}n9KsF$I>w}(xXMY8t zh{R(6Q}FzJ12A#)0}y+U>pp-|ifj%7*n5E24=@2}4l$1YQeb%l)B(Hzw0!{do&>Dz zTwnq^thfD7kzWXH-y5_7LRxb3JnKyWJJ1DCN}$gv?Eoyj2`QLM z?n9VBA?2h^AY0kk1Udn>&AynCUjtZsLkiK8E_V>E9DrG9)C6Wf0njCeArh!N!9CyU z8DZ%Ya2IQ(Od=4#vd|lbwYSLCk0~<}umo128|&1TiRbgHwf83il&{@9`xp~A899Zu z7r$b)?Ie#jj8$;edi@)Z=KeAq`?2Tl^#W+~9NX#`6$|qQVCsXpc5?^*7ck!q7{HY< z0qu6(=Schj)aWlpaqIwG=kpdWF%C;=jw8Ph1kqP(#Q?4a7f=sgg7*Ov-vFj~U+5Q} zLV}+FIS%0VsCw{h^mkW}UIM=v`Ds5-^oREk%V8ZfQM_Cj00000NkvXXu0mjfy_j0$ literal 0 HcmV?d00001 diff --git a/images/normal/Regirock.png b/images/normal/Regirock.png new file mode 100644 index 0000000000000000000000000000000000000000..dcdc4d714e491b35a2ec6fb4af37169363c717a6 GIT binary patch literal 867 zcmV-p1DyPcP)T;MlOJkgz}i=x{iQSUBjYXy|}AxPUkq7#Q8R@YnzV00DGTPE!Ct z=GbNc00QSpL_t(|+U=C>j@vK{1ii~OTSxNyzivhHECjt+Fz#p3G2jGK7-bK&K~1uM3w*w`l~oPZUVi>3X-og zL1v&8`ttjEH^T6*@gowD87Pk6J|MEreh{HTLYsxw+igH3=RapCG4UYM^2gm>^tyh5eK+!eeiS)^3V1RFd(#{P42N?dMAmR$lH82<& zh=DHyB1a|toMHOJ@F|*nSpcIj@HvDSCNQS+HdIzH%e=Ca^G3;gl}=?p*bV>{9YhBtw_ z=_!R)dH_WTZGyIzo$O;(1MCn%nJ3vP9uHdPh^-_Tc;05YY1-J;*eDz)<(w|@t zRxgAz$<_$S9Y6-m!bE+fAAu#1JOH#8^3w*QB!3WK93^Zpl|LM0z}7E>0!B(ALsH;Z zz-W9D7%0y+-rl1KzX}yt7sN9pF;Ey0%YxEhat76^0P=hJocr|J}fVuq5m)_vS6>S|8l9TNtq{)Bk}L z{>CyX(C_MDG5p8lcB1MaX$-#=)NlDlvsz#eMB$##Kt#g7QLrKmpK?OgKl2}9=lp!G ze!)Kqz?!}ZsDCto@GGLJE(F6XI}|bDO@bU9x@gX z8z|QjAOIB=oq^S#fv}HqVfsDL3NTTOiID$m+ieOn(GOY6w>W>+k;B2Y4J$hG2Yc z0yG4kxCxN;+Xs;_I0`Rzn>IqJ7D{{ZfBww5_yw9-3A|xo7{u(D*ML2b5?};C0JFeh ziU82?BanIWDK+!p}n9NM!6 zGDm>Y3-pv&of%lhHv&=c{scnrg?4XKSp5840uX5h__)VeVE5MrEPE(!A7J>wC=kK= zvA+X80*DFbbAan<=HkylFSM8YvVhp>OHol(4u1&*bkFpuC#t^v2^kGeKl}C1i?Y~F zpMWzEr+=@T?5IBAacs&J0pI$nSNamj`7#ikWlWfu`v_EI8=(FUCdDA2Swtu!a9N0- zV$rEPBY===ByAyQp!hm$RjvVW9{@?5@B*RXw*XZ^C_HT;0Q!Jf4kLlMt-7a#%^ zRo*Cg_;pOw_Wp5lZ{U^l!Imi8W(_cX1F{F`Oy7fE;lKOG`WM19H-}JJ1?T_(002ov JPDHLkV1li5bbCBK{_rRTjY5Ro z8Q0g)`9FLW#gA0OjJ1Q{UG zVB#}NLC10rL_rQxjHh4`kX>MCa2^x3v_&Dt(+JdwzXPLS$<6+k1g^V30?F{ zTqkEBJo+{e0|uOPlO65q&?7J(0AgnIf|)h>q-*Hw6BK|8VPNXq$%}h9j=u=FWmZ=M zSU_bG2%2Bxs#a$MXlDTvKEoQg;kv4sdBV916d5NVK_I4$YVNjjWKe4CtH94!swwrlkIFw?!g!^8owgbD=p_mxZ8x#2f>9p{lt)469z42L_(;Kw5C145zxK*FM*si-07*qoM6N<$f-E5=eExTT9;mc5B{Cim{l;2Kv*F4uS}jK-I}Pu-Z`oWb4A0g-Pgs80A9kmH#|Tj!%I%Xl3ye}W91l@#Sh_4zd* zX%56rHf&QKh%_XP1roJP0A}EUG7wi>JV7GBXJ0uW{P%&C^>&3!--tl?7lG*{NFqaE z25@}{`}RcZ%3}bS*N|yL%YtetI0d%H>1@8C9_NYIS zt(CZ~5eVS$bGRG*@bKM9hW-`}YC_irHl9)Ktb8Q^hCr^i=LYa7vg%5a4O zF%Cl_hVKBe8LI$*9l;4P0*)KQA73OjV3S8eBXCsVyv%+TBY=J1aq0`@H~aydeuz z3Q&4L>vpdb?kZ}M5dH|H-(W-*jKH(-M8~HiyaYr-5g4@nBT$im^!F(+{28vRw>=Ul zAc1|?MPNoYw*ZyBqH|#QGqF3o0m#Fbi1e=u82Yw}LHY{+3Mdm>BPZwp%UdL&vh4`~ zbo-+K*g#TWK|+2~5D+p+^y1)sfTb9UzcaLegAsV|*MQM{u99s_`XqqxWMCAFW#=ej v`3Pb8>KjzOjO^z~2=rcm|7ic%KgfRoNHQ?YN-M2I35X#&$7PxqmQOzUkCL|kO5m{kn|-nK zLA`It2%=V$gm(pu6wBl{1%;)=C5sn+Q9u%V#$pO=yiwp7(w#5U3pjg$Gf&!`e=SJK zRp5vN==^g5$tjq;djP>U5rpwXPy_RUj~XCkq6;`4&-i4z1a=6L)ng)J;xxWfbdHi| z)CI!;Kt^Z?Oo;eSkfiox#6Z&|VFhb@{a7F&H3fw0@@x={Jn~TsnqPs&Yu*|%9t6cB ziGzS8czJ><0OVDG%v*y`1q$abuuWG1+z1$vj|C>a3mlfm8W8b=ZvaW!9sLpr1PO`2 z9nTYQa|AdDCZA6Q8KFFkF9A48(D|z%b>ea4GhuaJVDV>xtH7Brfh~KERpK*2@jmg? zzzG8&brmex1uR~8;M0>Ak;xkY$;Dzf4*>Nib1bJ;2sZ{4|$f^4B3m3DCM=z#}CHiS*!=nc&r+8PDB4 zLZ+d;0YU7)OP&oV-1D;bhz0=7a2EgoF9HJ+Jtfw zC2I)A0dk7naoZAxKmeL9eDfTgs)0z%8{0YhIFAX?2A$R0!z!6NokdJf_*6Jb_y@Kf=)w}?N?ief`1Rg*cEbM?M0vLv&MFyt= z4aEb+{Zeou&;}a<6sMgCaOjkw6qL{XDbNBET0pYw0`vTT{U=xoeF6Py-00&tzqO@5 z9uN7c75SoZtp{&LxIMY9fM_mGt@~SDaPP--`Ky9h`_FNFK2@3dX27&6h}J@1egD&$ z-S*P_+Yj?0LNNzG17JXM_>6!eqgS{K$XyC_Jv+GFU_p%p-HyvYqjqcy%Xr-=-EeaN z_Z_$|T|d7jOs_y(6YmJB`)+pb3iJi<0za=p3Ev@dbw6h`hxZ8R1T;c#!L_gP?oX{T z{+i9Q53ro;st~G}GvEZc;tP|1EdUnzCxL;bC~y+C2ryj> s@KQm6ONGKjrt@h3CHVbs=gUX@13a%QNp{LWIsgCw07*qoM6N<$f|8mke*gdg literal 0 HcmV?d00001 diff --git a/images/normal/Sableye.png b/images/normal/Sableye.png new file mode 100644 index 0000000000000000000000000000000000000000..f72a1cec9f61bf3c30845266b11cbc66c2caea3e GIT binary patch literal 558 zcmV+}0@3}6P)0R~!{KLak`{PTgj zwAOs{Z_8~Ic-9|*B9ezyq_7)K@2V=LU8qk9o`LxN33i1!j9x_M(MHgu=4WFwb^pt2MH^uv6W$)87Tpj#4>~X z{lghnOawq=s>~o??u?Lx6{$=i-ajO6e-g^d970f;$h@S}0VtE`kX9xkFak^v)Vx3D zc9W9Aysyjz&5Bv-QUD3AmJ}lA3yi0w=%~zMf?zpt#t0P=Jt-czD>ja7a*Kka$QiI6z<+7#LCIP}Beb00DGTPE!Ct z=GbNc00N>(L_t(|+U?iTlENSi1yBmLlH}(9e|HHG!D2^8U-zy%I&JS++Tg>6|9lp* z{LF#~Q8y%(CX2u{2goLGQP$a}#F0INW&0Dk$@ft1vN zImb!hl%EONdp)bHfMpdjo`hD=xfPAL)Xd#ihY2twCOpuN^b_WeLEb&CdBfU6~l)syX>xgVYd zq01$3?>k_GqRPi704Ga^XpG2@00@S<@EY*GHR65CQ_9gM9NxbaFk1eRSrvGEFE0TN z7BGNbL{24Ot(*ZZqc5@o8$y7`1b}E3WVB>ifeH2`P;9~N)&!zTpaRoA6t&0<_#|*p z1@u`cVHy32_cU(~aVy&y3u!8(-TYP_FR> zECSbac47d`tkV>U7GTVf?bA2`wm2{div#8lhil&jegFt_pccCZr58%CjHv-5mWH1*7s$O3MFc$$`u(TmHpl+Cma2X&MfK+?e z-h4!l$8*0H5V?(jonTcR0&=Nu+g-2v1!t}R_qm{*Z~$@JaJ>NBBVxodBTxrIP=A1z zLX7O!EC9mWpssoe+8hwRP2URmrJsERd=ss+E#v!MP^*_0!ne`5MU+?gUOu~ovH$=807*qoM6N<$f=xzd4FCWD literal 0 HcmV?d00001 diff --git a/images/normal/Sandshrew.png b/images/normal/Sandshrew.png new file mode 100644 index 0000000000000000000000000000000000000000..9435fff6b131ce59d849918dc4f0c6b200bcb9e9 GIT binary patch literal 524 zcmV+n0`vWeP)`u%OVm0Emc)sE7c7P!Ld1P!JFhDCAkr00001bW%=J06^y0W&i*I zmPtfGRCwC$mcfdwKoA7A(@8Tc|Nnm<-951L_AuMdo)!!cyhKnfrMTVP-24&jU+Qpv z;{!%Mm6Pr_=0h6*$qxc{x-CpdUq3bh2IJ)mbG z`sRCEL;)}ZkHI0$6Rh$K`0=Eqbbp<&`&(5ywIxorD(Dy%Xpuu)hu_S+2B`fzrP$j>onL%3E zee=yf4B(W84+UkBt>QyLorbnn^5+7PZLO@!P~H}Zlz_hpO2y9%rL|Tt1eMnUl79*s zB;XXR(VRCRk3NZD0q)2^!8264AVr8bTCFe(JUU7A z2v;9#1ZfG3u;H)}@RFXD7eF6WooR(B1FHfhyeeSQYx+Pbz`d1{EW=B%aJ+0EZQ<-! z0IEb`N)Qjg4)Ccc!Zm>TE%vbNdrXs05rOU`08|C^M$*jucH5S~JbL^YPpXHabBMOx zZa4E?(gjKV`%~OaTve2u_ibbfh9PCZorf4P1HhP~DFjm5_uP$eS79*Ys5Qita*r9} zo_hA4YaX5V^R#2ior=Kz;IqFJ_-zWd#b<~X9&@-9pp%9v$OHGgA{-&Wzc0wZAntS? z?e*ZggC#K2?*(VlIT^giDX#*&hOh)V_iK!+1nqEM0My7bzd1<$}MN<$ZDU;qFB07*qoM6N<$f>X&=z|Xi)h0`1t6s_~2;xz)-+|I0Qu?0RR910d!JM zQvg8b*k%9#13XDYK~#9!t&|H=<2n#Uxu2H9Bk}&1`_gSGQH&YNnYold5;{k%rp(8` z3^|XKImfpk9=KbJ2%Ho|kN_a(`&ogbVk1@O1un|1CH}5p&+Frqpm9Yd07A9HEB<-^; zkWJoqUq~*Or3yF~VEO#K^qdz|@R^Et1#=aP-xQSNvJ`K9ycxL%ZyWwv5JRx8>+h@e zZEB4&1lH^I_NxJ*J%3YFc>TH?aMrMXUDcw3>#;!C8SGhbeF%8xzY8G0%$aTt^9gQl z!+_3{Q;T6hCqc0Z?AD0l^94WfO|7ve`_gdR1g)O9Po`03mH*_2fCwV6@sUgy zL_O{p%@&LR!kYOaED{c28%DUm5gTY=KoQ9D_kjVxrU`Hyed3+lLzDx>?*r7$nFxZ> zm;#e@1+i@c;pfkXplx8iv9&6Mc>$_vD+~)i^CXb9tl360!jZwcmLmme`V-#=DQFDF z5Ulvv9F_w3osVcS_+auGR2-?m&wL5y80d|zbOmx^=Jg!Vid;yvRP0-J!zOF@am0bgIxvROR% zWyzXAF&!rI+H5-kTMB$xmf{C~xkP#)l8CzMmEum|F1TkI$-yQLBx~xm011Ov8x3j&0v0`ev~WlFGh-!I+YB7%1px+Jy dBzOG#{{hCLAMdjVMTh_Z002ovPDHLkV1f+av@!qy literal 0 HcmV?d00001 diff --git a/images/normal/Seadra.png b/images/normal/Seadra.png new file mode 100644 index 0000000000000000000000000000000000000000..c1b6ba08c2d0b94a5cbf2942e39c845bd79f92e9 GIT binary patch literal 677 zcmV;W0$TlvP)%((th~iGd70(mEU{s zqkV#W#|Nx;e$?IH2n+z|-TB}@1^T#s7IqxyE3gZt_6s|W498N~+LCYBPGH{*`bXPd z69^A84Da3j<&kFoVUvmqJSBV;xGQ!C6gpUh?E?F&Ft#6w_6&Dng54c_jlf8?c3zkh z0PONBpjZPO7bY<0G#jNaU+oNF70R!J!D3|MG+?_>{!K-G>q)P`F#iQBa9@mH1Cdg$ zCD>P+#Kn@8|GQ8q=9DDZ*8(HAQF6q0`#{#Y5bSG$LUGxV-|rJz37CCu7-NxArqI3x ziU@abnAu=e%vNFR+y5SA6|@pGbFvafA5uR1O^R^U?Q9j`z;)<(;6royy8sy6R|1cI z=`$j{iP4x9t4#KsD?_WGu(8$Lmc>mX(x`7eKFlSn`>wf{>#HRww5^R6_ zA9DXw0QyrP-kd7_JrICi_ax&dK&+jwH-O|igh$K10MxqjW(0a%hj5Ji3lQt7<$+9l z1>m0n>Hv_f2^@Pyd;mzs-1pov@eG(H$qxWqraM3nU;$&FEw=m$@V>95);a;Rh^IZ$ zjQn(jQukVKtwuOVGg4#Wumrf$`+1wLDgi{W1$4oIH1IP}OKa_!DR`|5a4x{iqzj<_ z8kGSgAfc9u0R+(^jYPOE_K<{Mzv_OgNT~yR2{722djR3C?L8pQ<)fY`@C_UtSK@eJJh zvek)_cOdN&Fk%6#KJKl%umq3`copIVOkqC(*7xVfNgdz|Fe_3Psfb7K0ecVheNiv- z8rTG|o`AJ?$IRV1vIJs#5m@oJ#FVI`{oAR z4!{8z$vc51=+pCfR9b^D5=U_XcrE3$@4_O!?tvj3^A#;KyFgy<7ogHw>mz3GD0ER$D#CB0|^h$`qhd@%>RU$2uq@Ii_atV^L z75V^Vi-eCQB#s>k^pJ-V*?P~OqE?J+ z-x@a_qmC=qFYV8f(t3U#CqWoBulbZx+|Sp`^J(@ji1QF#<1wdnBv3oS;wjhQLar-T zJyi}rh^)5DH>zyVG%fn^hvZ}>OcO+c&)_d}I;V2>2x&|jt78~!e4|ycbVlZKP-1fC`@)Ad+>MSq#zyI2(dkWY{1p0apylGVBOio(~Pg%tOap z0cJW8$g$wKg7R(!;6eojzgCcD2tmSm1qEt6^!e8*m~kZVSZ`QCgAN4NKZv|E2%!@k zRR|tyH$p7$)!PUmoC+W=Ft&q>fgsWZdj_Sx}*} zQ=!u3MIw4gC*E6-lGp7{7Fm<+x4LMfH;|hx*`3@&K7A?lCLpixhW=zHrH#U4#n{HV zLSzO)M>mh77VYu4OWZ(sgWycpl<=Y;(7dIz8PQ?49J6EU+8fHkW`z_EP3tc8s@77= q&pDm5Nj?!Q(-Cc0wbi4f*?jP>2i}VSu zOG)QYcRvkyHv*il%XJmpfs=XBa&^T~RoLB^zK%lC;Oy|KY{D|A(#i4bnlno_3+;TXEnflf1LpbUp@oOM|;QM z8dwV$yj{UYz{m{mdq|4`Lqq`d2S8e4z(cYK2u!WD)qsHH4svA7tOe2<%TI=l4@5Qt zt&eN&2qMyg*=oSD*euBI3q-+cwcJT)fya8Fc4l+`L|RAR57OE0KG5u?4Gd|=1KI>} z8|>^eZ6?Trh_DmLQi0gVx^|>>5DPPd5euXp1c7XGe}F{JtsMqJoS=22L(~D%F^2oU d=IwU-(-#x86LXI*A1D9-002ovPDHLkV1lk0$o~KU literal 0 HcmV?d00001 diff --git a/images/normal/Seviper.png b/images/normal/Seviper.png new file mode 100644 index 0000000000000000000000000000000000000000..6eccc8513ffb946bb9308f8a1565fc1c9072d198 GIT binary patch literal 778 zcmV+l1NHogP)qwiee5Rg7hjZW1&2lNO(&<08M9L!DU~fPi#PT;27}U1m)-xmT7|JqyO%N z@*t{0w!k*Q$EzRU1dIeFqFR|TJpkmW$AIez^*n&69FeEKi0VuK8t@N_X%V8<{sGYb zB&kQ?fTmL#Pz`_{0CbKzGmZ^f&c};#QwHtU>yLd z+E&k7zo;=03CrGRScw2;S3q(g>DJ%k0O(}^gPQm4okn1r( zcK|!k`gefVat0LI?lf`-SSk4h(4s|6BYy3QjbDQL1jNI^MDX-`2>c%43#@nS9iT>i z2co}M^tOLYc~kGIoRs)7ytkO07*qo IM6N<$f?(5FQ~&?~ literal 0 HcmV?d00001 diff --git a/images/normal/Sharpedo.png b/images/normal/Sharpedo.png new file mode 100644 index 0000000000000000000000000000000000000000..c76fe843d9385e5b8fa229eedc5985e13b65a09d GIT binary patch literal 646 zcmV;10(t$3P)++o7??;{Kwx-iI7m1^NB{r;J;#mX00001 zbW%=J06^y0W&i*J1W80eRCwCmmCwi<1GsjM zy&{%$;Me}(8EO7>Anlw2t=uZL0l>O%?w1=dQB7#j3iTxt^Cw6VU{23K$1qul05`@G zIxw5OjD>a{L_l8vvjGwLGK8UG{Zj-k5hfy$QGlg}0a5Vn8Ue8og9B(v?mil7zD)oE z2pJLqQ_qj=2|ZzRBb0)i3!@eMK@U%^kx&5F0dUEcLW~F)>I52(8nBsTP?FLD5(NuK z{Rm7IAlwRV23X*5R}Eih3PNLvQo!AhrvXr#x+wuUh)kcM`br#NP~nawnmkQT6)v0^1CbQUfdu6r%k!zyumUMHWElcmB>m*k>KS&7l;W zYzci9ciRVDmP4P%JCI6S{UM#T|SlKoMBo!PjF5N0sQVQmk#tc9Z_y7Mlmz4a-tc)Z&%@p31S>T9^mCMJ+PxgDb|9Wfv z<+!;2M{#L?yWPr*JT4V-pMGs_yQM2^`!9vHM;QCp!pi5hH}3n~E)i6YktYG@cwQ?{ z0{o^R<-QI&ERd8+^7NXPYJyabh&E*llB?76YB>FVk}70Cq5;#e=Uzlb<>{WPNFu2U za%O~0h029M-S?;*1Q@#+P&z0G6(Yb%vhhHT_2EOv7y%?E0q}Fat&akNQLBiw@AHUB z^Mst+-v|76z{;cXP;sAa*wfflxu<3TK7;#Kx&E-9w_ zg!5(tu?4(P{YwBho1iP8hlKnyxcv}xNAc+uz)l4GJ^)zJ_5$7QAT-~N|DqlMl9?%g zWw*l$_otcW3M_?8`c??p0`l(y@+&nEcGwZT^PLKe%kqBDb18@b3y2j)-US?FF5{SQ zK|fRcM!?Ouj6)6zjF$o#J%LJkM)@X1grp zHv$@=LO-Jc+6B_8Z+=F8vp~0%{|~@?wV*5$;3YtG1duLDz)yutbOn%pK$eSD2l(nL z&<`jtIZe<2JpoK4V}lUM2@3QUCZ>=llK`AOzI&{Jx>hQny=P|M00eM6nh>u~IITpq q_TE0*@i6f70YnzQe;U60Hva&!#TJIv2ebD80000;Mn+pfN(kW!Rr7300DGTPE!Ct z=GbNc00QetL_t(|+SQg(ZsRZv1^xJ_NRGw(Uw0{qk=?+t(H2;s^QFR`0izH>m+zC8 z-;p2rw}BrOY@Qx_Ab-Q(%t9)~3*Y`Qw$*CGVksrZXThCE4&An`Mu8~`?%xKO61(oy zC};$7ajpX9v_RKqp*33}-}yu9Z*PadW|oq+K)DE*Q@2B)&VZjx4}qNXiNC#|YAe*^ z2wrG`>0`MlM8GGga|A!z2xts&5rE1p3_l9Hk54xk0ZK~B`i{A;;h$p>AXQHS)igV} z@b3blUj_U%o(7_@EVsS~le&!;!cRLQ3;S6Fo|v z5Dnf3lp;6;*q@;qdWj$XN=owuLOBFr4#pM&TuvDQmnk9;h=pyn$Kl823X6cE1t2Y8 zJ>XBs7Pwub?h71gRLI)zkETlSCNRIP6)GKwS_=%A$lC#uVs#(`*QT%Ni^!`0Q^MK+ z={o5e^%yu`<{Yp+?g56wsV8s8GArNhUO)8G-p7934p9S`UG!Vx>-BeyzpHO`+_1fCY$zVxQl_M}EbI!*{(qU{B!v3iHtS07>_` z`=LOD9IZ(Pa=(jC3@{cJJPBa=L~rDh+W@hI=&tj!pnCUTI?Rl(Mc&;#z~vUE!P(2+ xy9XMazWhG|3&6pT0~)_OzYAdbIcO|@fPaWHJHwmRQDXoA002ovPDHLkV1lZqhfDwf literal 0 HcmV?d00001 diff --git a/images/normal/Shroomish.png b/images/normal/Shroomish.png new file mode 100644 index 0000000000000000000000000000000000000000..9792f03ccf0f52ba0e5d9b5d76ddb7fe598c5cba GIT binary patch literal 433 zcmV;i0Z#sjP)FboCp!^U>}|NmR!g!ZsfNwU|>N_#-e5Cf4oHk-|65cR{|zwn8i z2SP19M9dKD(oW`{$ZJA9&nFOmIiG;O&Y?m?V8-J=g-g(8aF73dY5iWQ&Q zO>tAq%n1@!jM*}QIL3*3;fOE`zPU=Delk(2cisLK$2?)lT}Xd{C}t({o*aur><^sH bW;4tW?BfjHy7e>~00000NkvXXu0mjfoD{mG literal 0 HcmV?d00001 diff --git a/images/normal/Shuppet.png b/images/normal/Shuppet.png new file mode 100644 index 0000000000000000000000000000000000000000..c0fbfd0aa0e8c4d42a3e947de825a6040f22ad0b GIT binary patch literal 381 zcmV-@0fPRCP)+z^Mw0BvO{i;LE%J`Rx0)5!y1YO#ihvHW1oIBHhDZ*L??- z0Rs8~7{JrlX6U4^Cg2^0FM`@2kd21iAOJsMR5ai3klN1xKuaP4rGQdcERohDecaEZ z?g!Qx3p6hSnxBP3JAKpqg|nlyq1d^Ts-v b{1tux_?iryNN*8)?YFN9n&Kmr!N)FywvY3cmUfzq`&5f|{#lbL+u#P^%a)mKXdE%P#<| zR`*{72-IIC;902B`9KuR>}&!cVF5v&8o@{qh(fLOZvyH5T&PCJpT95@&CKvcu3De_+}c*UI4c*(k7hxQ^B@^*aLI^PutIL%mN~S z;MFJ5+LDw>YfFJ89D$f~`gLyK1~bvF*K1qwFan;=>2bqj`{Z&b5|4#T!yG|IVDAIn zP9KO7_62$dpb=oLy)gB(%M;7>{x)d+>@HDwdd$q8^s-~g4;XlH<8}mD2ExxdFU!>5 z6qHvmMnH`Mk^1$nkNe*jMgWqD>H+0{2kEDt>=XH3YgzE{UC08=tcJGfm*6##`773f zjC4@Q0rL7Tp$~f`p5||HKj;A%2}(c#S08BWEd)rqIun<*;4p$NkRlm=OFjKI)%`8D zh6tEso&j_p%l#$nl-~nn0r@;S%tQk1l7~`Q zJ)ml401^JMFY6`V6XyHCvMfj}{Q3VMcIZhYT;&~JrCLXT0I{)bI6egG^jCoVL~drD zsJul#1Q;8pJ;0#=Cn#<{QTc$)0i;=Y^ie+HHheeJ76=b^z%R}*zt_4Ike=+jU);H( z8U^)0db00+@#>F(eiIJIF+U610{tuk5GtT@05=mdka`j_%2AwTCd5I?#}Ru%XZ%DG zlJOw_H?+QO@01gPN@ASmOh8pAzY2(0OD6+1G*vjx_zLUvAtX#k1kN5H5qLD|W(JVq3(SH`q$J?GUk!lY06IDm1>K`})7JpdPceV@ zu>^E8)4^LXV86sI?&nCr06Z_pO&$vv-Y#J{5Wt7!Pd~&zqi-aiAc4@n00000NkvXX Hu0mjf8+n#( literal 0 HcmV?d00001 diff --git a/images/normal/Skitty.png b/images/normal/Skitty.png new file mode 100644 index 0000000000000000000000000000000000000000..1c6275c3e674813a1db9629a1ba3c43cd80a6628 GIT binary patch literal 559 zcmV+~0?_@5P)cXaE2J@U*xq00001bW%=J06^y0W&i*I zxk*GpRCwC$mRoM?FboAH@o`LZ|NFfrsUqz~>L@PyRZk7O2sGmZ# zwUKIj4iMLOgj^B&?w~P-y_j$Dv;nqf0gRJC%4%`h81^(U25=V8XdFJCy~*PJB62z* z{*FsTnDJ$Vfe%E?y`A9hVR+?q1v$aMLHWr`AN={N za_~exSPRI<0$~O^g-Ha&)4ZJ_j~Dvki=c-e^xjdQuPqQXOTSA&O9f#me=g8zRjTXD z07S~K0D3?Gs3%wmOka=z-?SIH`9h%K(}HHPz_ol|TF^|AI%c^%&AJn&zYwq)NURr{ z<+XyhDo{tLai-d2QGlw2f1l|Oa^g`bbY$O5oVtYT(HGHD-^+JGDNr^~F x!+#qma^EQKu2%xheP;6C%eddaeQ*8({{R4-6V>)mg~$K^002ovPDHLkV1k?~0hs^* literal 0 HcmV?d00001 diff --git a/images/normal/Slaking.png b/images/normal/Slaking.png new file mode 100644 index 0000000000000000000000000000000000000000..d8a189c6ffc4891a487e89a10af6cc9552396b46 GIT binary patch literal 901 zcmV;01A6?4P)6z)*15fRKnVK=}Ch=;-*!$mm#LcrBlzegFUf0d!JM zQvg8b*k%9#0|rS%K~#9!?U&20;xG^eZ=ciMCQjV{|GDEw>_8AgquI>j79^~y)HX2^ zKfnC)pTo*O=%AS@@bj7YqF0psoQM*ieH*CqV@fg_Md;Q<(1!OD99H-8@-`$6PJ zSkAyMY=NW1`xE>UusC`Eq)PX9b0_xpVR4@TU9T6X-#2<^>@obj@6iIaK#%e|0UC6g zF;SIQ!Kx;?6A{u2K=Y4yT|GP{8tYBz!09uwJn}-^-3Z)#?Y_1`vU+nLdc_j*49tQ@ z^GjU*3@|0vl#;n4js`uU9f8#l>w!LjtiV}t8v&#D!U*uOZC66H2P)w%F9GRCyD_^y~Ud#JvD{ zD}ZLQ{3{R@k8)20?g6@;1?|uma1RV^-5|FBh7VjLEHDoL3Pio$)&O%8vKREdFalxC zRgDt3k8n)@&Vt!hFss(M69@pp+XR*O!f2R*XF!8E5v~N~{1ym^V4Z8g7G!9JSO_ax zAvwNC2n8#_78bD!l6XeASU(9r0;wO9e#&7dQuz|-jW<@V@)~&yeCHk+`tbicviSW= b^2^B|!HG0a64C3&00000NkvXXu0mjfs&$^M literal 0 HcmV?d00001 diff --git a/images/normal/Slakoth.png b/images/normal/Slakoth.png new file mode 100644 index 0000000000000000000000000000000000000000..351ce5026fa5c5283871a635a5c5a9ab8135d092 GIT binary patch literal 533 zcmV+w0_y#VP)F%rs@LPD3)Q9A3 zvfXaC+cSRpU@j-{mwWjO{A@3({A~Y=LM(I50=9uaJ%FZsa_pTyIsgGpO8_apc>v^u zOMwwC3D{l!XFAJ0tw)qbB z8Q?6(C>Z%Hppulcb(FqWh%kpUA*yENaa;ye=5J3%23V+~Brp;h+F9rOana!XnC>PW zg{lT>An9Nyua*A9lk_eF0ZQNZV>Fbbv>E6|V=^4abpRT`gRQYWdg{CaY|&w#`IU*mSW{a5|~ X>&zRG5h`aK00000NkvXXu0mjflVj|_ literal 0 HcmV?d00001 diff --git a/images/normal/Slugma.png b/images/normal/Slugma.png new file mode 100644 index 0000000000000000000000000000000000000000..4fc9a9e63246c418fbce2e0354d3b9fe65cc0b4a GIT binary patch literal 455 zcmV;&0XY7NP)ChP$kNn%LPFMyFUVotk+W2$ca$c;qCf>^%jhH(Jm(@4}T~;A~fh*ltT%p|i zJXjrOFsl95x@#6FW87StN{g|`raRtCZ-zn?0MS*ku>@fT?+B@@yu*|SboNZ`Xc`a)d;%r~Kq7xnNV+`0CnTCaL}z6BApl|iIheU!+JR0w`vk`k zYL3HCQ=+*i2xpi@EE#C(5R_g^16W`-e4@#JgKgX1+twKov*8H}iKYJD_r1Id@&}9w zWKw`_cVMq8Vg-OPK~0LVe*>kD4(PxD7^)CUnMw)}r2=T70RV{|C42(@`9nkpO85&PuMZNjhA4MHRoVN)LOIZ0U8sE*+?qNh;VSwNKmL?D0pBZ z;MV{pfu3%wkA&=s%1Tuljehvaxt}8>0rlKMtE#LM-wc-d{~0)gR3%hbDPjv*cg#Kg z0dxk=aaUifiD227zKA%13_SOf;V%Yoxls)w@cmRNUig}WUyOg2{7eYI70|@}^$oOi zcYi`UQzlb?!D>C-yFwjM>CbeMn_pWD#jJiUnAxeXsv;nV-s}kNaZ|p=YiUW-vo9Gj46FaLAWhuJ(!)l#9u}S3;fp3RtrpdcF3FKlJ_^*R$?!!9;zfIkqIB& z=BSe;Bhiucm_F296-a->zXxb$mBN}tj|OOjB}4WP*B!w9k+16rh+r1__(sfiNv7a4 z;c0&d)Dfsw0k1pL?Uvk>lpg_z$S9DO)Wj_8#$lc7lG6le2mKu%ngPPi4oD+u{yabx zq`t3{Q+e}M>8i}%o(9rB9!Vt=)d=10z>CD!ec7B@V9p9N0sr_ht~0@{OA%=DMnUfc zYz6YiK5_Wl5ahif5V(7Mn*`nn2ypj2Nmamq>Y-0DUc8uxB~q@yxac;(Ml{N@q6;R00000NkvXXu0mjfCsB+n literal 0 HcmV?d00001 diff --git a/images/normal/Spheal.png b/images/normal/Spheal.png new file mode 100644 index 0000000000000000000000000000000000000000..a3125cdafe0bf215feebce08df369d97bf8afba4 GIT binary patch literal 451 zcmV;!0X+VRP)5)F(3qh3z`*#}*!cMP`0(Jk;Lxbhz>t}lW@uP20002Pcp)(W0004WQchCNkl)kF!1gX z02zf^2ZY>uoosu87V-*xu)W(X t^x5c-vvd!hEq`3V2lp@2&CSityfOud?;LxC0Krry&sHi|#*oa7|kZ9OwIIvhKg|3ct00001bW%=J06^y0W&i*I zu1Q2eRCwC$m(9xCFc3vE_s6m9_kZ7ZWFc_!fif+HE^> z0Y4{bd+l$V1b{#2+a|;+;0#Fb1#0W z6D&n<_`SjDNEK%z{;?(3RqpY1in2%D3I@9S$KQjmPmyaivdZD0eLGsJs^hX zfOR1ZfEYg>TAeXq2?<0{+d!g{Ibcly*d`jxBUnR7F9Epd>+aK-{u(H`@2~ijXzNbF ze^8V}4QR8r08C3(a$N$20A*d@Bx96}#GeMnC+Sz0CUD3c0lFNZWLpxqG$;&62;Fg@639X($mer^G9*pEP=FNAecuB@(ND-!7(w9XR}&Lg{nPeLv?%KK zc^t=iHniW6VY}q-d-_cR(As%sF2bJ&jwB=rNfxsBc_Dlp*2O3!l@}3V4Q9ZP3gMd{ zQ9Xz_b|tNmeSH-ld(tFga8Tz7v}?AI-u1+J?E8N7nGpS6fh=5K2QA=flF3ZON zOT4gWz_1edfD>CNfS-O5O)Hd-h-fPT^1I6fve0icg2~79Vj`kR01-f_y2B@M4`}}5 z=;Q*-(GqwNO2EyKkXoSOeT~6T0t66~CI<*SpF;ey5lQ*-F32xpfkp}nk00DGTPE!Ct z=GbNc00MtWL_t(|+U=LoisLX0MUy&KRo&kI|J{}3hy+@1rhQtLIn2XQIA>&GaA*1D zKL@~aLRIitK%pl?x9!6M1gczi5Wev1fQJ8JKqU+1|16+-@+(mOMW6<)21Y=6@^R&h zZVvPuAhz;_mjN#X3P8+6p&GuKT?P_lA%V4Kis7$ow^KlY=?F)`1Kluu4=@8MtH`u~ zDCh`u*Q|cY032}uRnA5Tv;wW0Szn_R0jdt&;dF#5q}ZCvJqH+p(955UPzB}@oJdpv z(DLU6b41zOYLDCPb{`2d2IbFzt&XLCdpOVM!xMc?8q2>3tS$T)zzfdUWbcg^^TT1! z{ja<4g~#2(_9}s?4?x9Husb^s~0j8aRF9AIO#Vi7G`1J3&18QFK_X+Y8h)dX4dnC_it$-$?$s|E7e_bQsf8E!3 z_c`2ec?l@VULlsE8gL)sXTdyh_Zi#|R)-?R`wOw_t)*ajjPUb=R)ykSV6)I$cQWDl zH1$bqJZ!%8w~eiF+=SH=NfwMw`FORD_anDSOEJhmr#dB1Z*%w}nt}A3QJ^MZu72*T z?i;3CZ4dN406?8tq2A9U(2qbApz$MupZcvcFfUXan(vObU?UBkWNb^TuH8jfDQSFh(QlZP-t|Kg>oE90j}`Vc4&M+6|UtiYQE|05rf6 z81-u4uK|4*NaJYmM?M$41Oo8-1jC;Moa;dPRroMaexiE-p9WYv8v%U&75Dou$tnoH t;4CnQ@X%1uuyE*@h`^{2;9x+YfH0^)Ab3zHa998k5D+9h0-FE;00DGTPE!Ct z=GbNc00FQ`L_t(|+U=IXj@vK{L`91XLv!Z;f43{zYcxPnE2~Qj_o!Ia_>Jhu|afwRq!gu3tJ44z+H0wU$lNVZAnioI~CIv5Ajf~1IJpz1ml`KG`isv@Ee3}cB+*){_tTJViZIKU#bgdgpRN#B-xo*k^BeLi u@ZxBbaP1$f1i2)r6Ig=${Oy1EpZEo_CL3C$%oI!j0000T)>xs-WtFc#G-qt3asFoqekXr?^`Z}a#9 zSBj{Bw*oXl6)gzhjVr*az;nacFN^>nN?_*by^jJ23N{@Vfiz-_l0l)oY%bo8-_$+2 z<55xLgdYktMY98sc_M?A{mtF06&xDC{X-wrT`|Zrs1;Z;AcS7?!+1P4n1z181_cKO z2xtsK7#JXC^k_ieV4}d_M=lJ|!MjJ{LG#(Crly4D?4#PMSE+qf} N002ovPDHLkV1le6nt%WR literal 0 HcmV?d00001 diff --git a/images/normal/Swablu.png b/images/normal/Swablu.png new file mode 100644 index 0000000000000000000000000000000000000000..2e32a6f8e00804650a2dfb7217dba268457e6bc7 GIT binary patch literal 503 zcmVv5QO2y9y8vq-~V}QFHSHaiJ)mO6<;FdfaVuiIUtwI|D~0D z!Zan5kJzsltdTQxD41!CG3B!by`M;(mrBmjWc^{%kue$>ncsqC?d$h2HID@oJ2n@D z$zdB%Q=cCTIC3oLvps-kfm2fuxMs_d{K)#{l5#`mOjP5WqIi zu}Zc{;C`2m!ychu>}^fat$$xsVGA4r+p9Vil69YY0r2+Q0LDPEc2H?5DQj7eZh-** z0p&$OBST}Qq*mZG2C#g5zhX~#JbPfKr7A1eqjTseBcf|J5FcNom1$gVJ>(bSk(YOvos$_}d@SY<9Jb|B!$Z6Ig$=&nF{g%lh2sw9ZP?E7~t z=RVKsNG?mqO5D4G(}nc|68c^aFddi|oM#Rx#rnDw^}tDAKyd(mR$yQ#Ej0JQX+_Gd tqdAX-^BwcRCrm#rh}rexcez~t-Z#ve5&z3GT literal 0 HcmV?d00001 diff --git a/images/normal/Swalot.png b/images/normal/Swalot.png new file mode 100644 index 0000000000000000000000000000000000000000..bb5169d1bf8dfde656a9162a36326ff3a7831415 GIT binary patch literal 578 zcmV-I0=@l-P)%(#g7(5U!uSdcR_Gf+@aW@cvi&{%+YK=|m8`1ttvC;$Ke0BubF&Hw-a0d!JM zQvg8b*k%9#0mDf|K~#9!?U&Jxf-n?By)&JHW$pie?%D?SmJPPRv**Fo#B&@anE3ee zWe5spw{31nHn=M&sxrvj-IAmV+zFu{FMW+Hhj;L_~??gx?&xb-cj zC8fPmb197`cwl)x6S$j@(z2v}z)2}dW`LV?B_P=0g^D*imjreG}o7Kpve zU}mWPJb58zR;>CefexyETfjV9@pFy<5YGj?P@h}Q7KJ)sP(YkFrp>RlHv$lcf$4J~ zo>-s|8-Fcqz5qbOfcsm)2aF5)+l=4^A5hRB5Z3_?Cie@nZXisn@1XVjw}a@nf@Rq4+I?`-2Gx2auq<>`lxkJ_$dIO8X#BQm6HoL zSZSmdtNsy&Gi1xz{XJF^_693C|38|$9}@Kf`HOc)f9o;%O>_MI@%b{~7lsDj-zuoc_%TsgVwQ{ zt0ues|Dbbw?iSRquX-Hd^*P?=zm7&d-d$F|{1oo<^~&&b0=zF!?Yfhp&TjRjKDYD( z=RA&o5#U&ca~`&Q38n$RhTzKE>NWHk8hEb2mAA!D222ZI7GZ1mVBTz1;M$p$|2)L1 zFtVRF;G(ZDto%o~?sru3&v~!xwW%WJ@gcDN8>}wqarturuh3zPa$n$n7c@pMF!)pe z;FDn$Z~;ivTLZpokAHugAv8)U z7XmZbF0z!8wdcPZJ^rmJDakS%?{t!Yn!lyt!DO3=zZbRyjM78lv~olFg#0I!1T`J6)#9i&9r4Pi2L0shLb z|A8E%j6wH3C4eN-M4tfg@&#pRhzZcQiF+qamOw<*$fcCE1t>Y^M{EM}s3v%C5J&yx z3PuSAr=b7t1%Sg1vQK^)*g$U(d*$$$0*0Rg{io;83bo3lAZlpj zGG^cd4a=K=(gi2S&dniW&h~{cB@aS65c&h@`7_)GEO!3~TtG`hl!xE`N`RRk-?ySJ zfI#{HO04`%1*%#ep5Gv%0+BuddOltXFs>I>yZ;bG^t+S(Mo5hNCENfpfR*opNWk(r zM!C+zMpaiRwjto?j}mgcE8y|*$yRWiBhCIH%bg%u?bs070FI|;{~JNt6B{ZqQcW;% z0fXlyUFNL=Rk;KXy+9m-^e%4s1oeqUEI%Ot&b+41z5r6g8bDPV-1=dx3bYNhha^or zU%_cGff;Cm1)2SvstXp?1O~JrR{sREIc>YE}KnJXq!@=4C zx&hQ10U(Cu4Y0BDY!TWPg8g{SiwC0Ra*pFWd+6!rKnw29LFIN((iq|P< kYxLz$aBy05{{F}Qe`)qs8E&j7-~a#s07*qoM6N<$f)@eaasU7T literal 0 HcmV?d00001 diff --git a/images/normal/Swellow.png b/images/normal/Swellow.png new file mode 100644 index 0000000000000000000000000000000000000000..d6095bc340cb36d96c4f08cb6581c77c841d5372 GIT binary patch literal 704 zcmV;x0zdtUP)hR;s7RTanc!$(c!6f2~$cKKm5B<{t01?5dPj;e9&djAKh7Ha#z6kQ_Yi(dW!0;kkb0#h2tiWXB zAczR10MJoEGTV3{2$3r0Ikv#TCz7H6e9m9OGTZ703j7sdJNTi0HCTk1yN>E$kAO)= z{^RlWbRG}kt)Nha*?weZ8|`Ce4@ZQZ*aA+BfJ*Y>M{aMp?ucqt)D7#t8)M%w?xs<8urSOSj4G6P?wl;)Fky*kz!ufF1~U$~T7+3(37Sf>rCjvFjFkKBvP+JDH8=s)TKa-7-tJz3du8k zF6}*l0$U-m1bk}^Z+RlRvqKtT?f=3 z;OVOcMN5~3kZL^#8XJ6t#uloAb3l9pJ!>MOoeJzsbT0|-{b>YtMm8`0si3~O@XLmm z0K3lvF}@_Av}P;Bp(`66jWXDGz*N}c!M5QMVP-fJ#LU~>=O@kz1p-MzQ14@i5r)SA uW2)dVBoLG8(;y(IKMfqON5^8Zuu)0aA>gL_)thlkidX|K(HtvP*5NsP=J6C5D*X$<1DCRC^S^E`VZ?_Ys=nx=H&oPP(lGvyx;3BL!n zEmb%-NaH$#ZJuugdg0h2!25wMNCnXRUdRX7OznkRfeQ2jQhoptOxwGlssM5Uis0yh z2C@MGM0!A=B?Y9TfiS0o9|fRFfxGAd1)#&eJAedGk_cZ_1epNEQF3vBXvBLNLaPWC ziYS(a)7119Kp8DmctHV7?kk#~2mnw4!h1bg9g#X3uodkWP!Vk~sFj2Mz8ad))+SZC zy32%L0(bx+fyKNqj71;-yA_2@VBlk_kRM^^{Xjr342+d2#8g%iaJRo(W#IaAW!t~H zpFhXY(>~X>a@Q^A8@q4j`fe%P_SJdK{L*uN*w+B&dTRSn99!R7_*Sw3GW_fS9nvLZ uNe4P4FNZyF7yC58PXoos=gRW%4}1gIK^n%A9L<^l0000gL_)thlkidX|K(HtvP*5NsP=J6C5D*X$F(URh00001 zbW%=J06^y0W&i*J;z>k7RCwC$m(h-^FbqTkVG|PU&j0`IwI@llw`@^cY2S9FN`QQh z?Z8XJUw$=3nNM*oIp$0p=yoK+(ZcSkP+XlnewF|H? z2MurV%c6$oDL5#2mEV^sXe%5v;8npvL8jnX$+r=1FY*RW0n-h5QDBBu^Az}f6R5tz zGeh7Y1-o5n$*Qkxuu{+r`%b6v6y&VH2ZDV}z$h*SV*?5b_@wit4DW@&O1}$Ko#zB7 zc?g~vRLSqS3+zI5@Iz3Z3UV_b4}orNXN!_=xc_Ony9O z_vid9%(^beu6gF_^cZq8SWJKuudnhM$8i#rE5YNmYW%K^nn8FPRp38Kzb9t7=BK4k zN(DCF0AFZ%;6@4 zfGeT`#iMXiiV6(vYu6a%icb`1E_@4;yt{^gfr-e4L27bAO1e?tH>Dd=6bVj8bJibe z$6<&V-vqvo7GXzY9cK_v2JV)C;DR^=fdV&B5l3L9C*E;ZNt^;da~hHetV0Xf?96iy z7f4VF)StURO-f#15%WG8Wbnxa2wLtV)SzZ!e<9ennS$zx(s(4g9!Agrl2xP|Dsac6 zN17KQ30)Ml5uylN!~6-&FhiUXb{oq`*_yz6GYBrAv7UHFgnWd%L^n66)xe7?#!1!m z-M~|68KXidNN@oS0l;`w!lp6>^WC_jovj=A1(^U3>sEJ1OhGc9a|eN6qZJAdN__-X z%x<+Ym{t)96wFDRftNl6c}Du|qijaT*CDesqA4(|!9G6*=pOXN`nP&6yU09V9t<~q uD>M)SS$UhEI{@LcjIlot@b`c9-TVXdBt8|^X!WN60000=&lSoGFk6e{x|vyR!7WTG=QCdzH4ZbX z>a-cPO~WWc_DZAJ6bh>gLQO(a7%+-N15>?E!c8z5AUkgYgaY`1(dHO_9Nt^_4USwu zCqEDO^Sn++uRk;Iot^{m^Vd&cG)Zpc`E3#7`;hYWnSYzA5^~ykxQYM(002ovPDHLk FV1jie*XIBL literal 0 HcmV?d00001 diff --git a/images/normal/Torkoal.png b/images/normal/Torkoal.png new file mode 100644 index 0000000000000000000000000000000000000000..b39bd8b0313e1b4b4f310e55d8c3886a5e063ed2 GIT binary patch literal 859 zcmV-h1ElRz=dzq&NH&GQ4ck`jDWq_)p3@-!(nYcyd z`}=P2Xr{p~4KePZWek;Q`5F)0QV`9k$IPw;I)rHvNk@zsc(-mTh;nQN7X}(bBn^rC z%$tS5Mhd3EaV}VfJQzj@Mg$^{Dgh|~PB%4vGWZH`ufV&HtOqdjFu?cYuYz_r5Q_+q zKYmt#xXq5kd^Y{CDRFB$4arNv73ZNtM3w2u!0f1bm4}}M#Zc9_!oXDq2ks?2-Ja@k4nIP{3EhvNO5ev5o@SVZ zVN+DTcVVS0BdIP%q^L)73AWy>e zy$v}?@}1|Cw+kpQ1s!53aCTsu5l~bEgU4Pj?4{J7fT9q{vp{NaA#fHX)X|7SKqsqf zKXE&NEfIVih-<)L38;L<7ZzUzs09{ufdRsmgGA^7z&1ptDHX1q2V5vzxk<__yv6Gt zbl~$s7@q9bfI^^)(QrF30-KkLIC#w2_MP2cN^EF!o9*4Ww#OT7>;Z#Z*$cdF-VSRY zqhdffyn0>N2urdcO8bE5`mKUe0K%LD1CA)2V!xio1r;P)EVqYn}j z00M}<7HaN42;^tc?}E$y+X~?4mrp=5KxA1af#n5g6378yS+v|v1LP*;6?g_`0cKnG zKL%j9-2gDHkq)lDpg7Og0Ph1R@9hkcMkp+U(dcb%fF#-uz!)1!>j+>Y+pC{lr1mxd z&5T0;SUk}mCIRe>ASqT&l77^-K1s<)z`w`)cpy|M4U`C21dx<=BZ(L%vz3C#Kws@M z2+;1u1us)xz7jXe{eCY1X74WT?rEUXT*?5TG(SMBfqw;{{{)24+BA?#Yps+9a1v<6 z0|$Dowd<;*Hv09Mhv%XpN&uj`3SnFUC^3L{LMe6ivp^R>)ek~?JgScS6y<5hm z0z95UfYdvUUG+n#4(b$;)Mchm;S@j#4kQK8rTU%&fTTs_k{Q*VIN#3%05fPjt3c{u z^ikixjI?aXHkM$XY?AyavR_Y8q8YuxuyFN3O`fQ5vt}bD>HFIA&0+olNm3+ZqpZJf P00000NkvXXu0mjf#Vq`k literal 0 HcmV?d00001 diff --git a/images/normal/Tropius.png b/images/normal/Tropius.png new file mode 100644 index 0000000000000000000000000000000000000000..d562304b23770a3db2c05779fe82cf4acdd076fc GIT binary patch literal 1036 zcmV+n1oQieP))N4-{-Yq zE@b%@GvEF^R*G-`Ljd?@e@L4lV;SXt>wmFpOR;@dlD``eY|!O6wAOu>{pTJ@mzLw? zMWog$`=o#^0PNp5knoXFiL@S<0c(M+W!&xwcNk_9FX}xm!wDCZ;%(m*7&riPyeg@+ zN{HSJ#e??90E3V6IQMRVsro!g=Vt?o$6ArK0LdRwz?%RxApu8*fsHmpGoWNvz?^SE zSlxYYw(6O8*E{S*7{aq47^@Ft^#;i@W$=VV5Auwg)2gkyzybl zJ1s7-CSXlL-bYU;ngAiN2SppNl;`u=1XG2|ypL93U2zpK(JBPYL@3*7AaMz*w4@>V zRD^*3)blSh74a2t0RY$s!9q4R6?XDW{`Ha?g2yQ^H*gk2SgsQABOba}p}t-(tL z1R0W@FU5}!@;EKxypcEs#1ObY1wCvuQiJv!M-Q`QAxHq0iy-?Xh_KVe;Z!Jj?rkAF zSz#88&^qo3g(nPO1w(;=CWTD`*;Amw&5GoQVm73p)~UdxNO)GjhCugu2HzDpoa+LW zN$^Dh|1AY+Fj(-p1h-*2kR^^Zm_hcbz;}nUVW8Q%2LD}<4jM8C;&V!)z!3Z@G3Qf| z1$6l}Y?ieJweyv~(J}hTmoTXFzYBo=spEV(H|@Oshy$?rPwPLWAaJSt5ih})#(OmQ z%HQw;3&DssUcccJ*J05(U1bM6qyT|>OJ05(sNf3vJ-3qMZNM3`Qc^JSu zdIeBAKLmrn5d=L3cU~sJ%!4249Nc3RkuJdCj{_l?@Sq(pS-|pv)8pu9QG?@6V4U9R z(Bf-}r)B*;L&!DyWobe>etOLgrRc0A^9#&v%xIL^mE_&X%Zx37a0w7 z@DXjNDm`32Mnygg{DN}fEuUfMNexfKEpSL5lQv8=Uc%-&nT!ob=$Ua{uAEtH^z_OdH)8z&tAM@fxiy`0000 literal 0 HcmV?d00001 diff --git a/images/normal/Vibrava.png b/images/normal/Vibrava.png new file mode 100644 index 0000000000000000000000000000000000000000..37c75ebe4542477b6c2e1c8d4f0e0f36cad8f466 GIT binary patch literal 619 zcmV-x0+juUP)nVEoqfOv2?Fo0F!)HlK=n!0d!JM zQvg8b*k%9#0qjXcK~#9!?Uqrlqc9Kz!3OLZPxt+gyNrQ2;YHxx_qkN0kVL9d6ZwPT z;o-jk_-#PY65!tlbQZy`L--E^@|=~MuG$eGPJwwX&_AfzZNNBC6z2uA5@LS64P;V8 z@E)*w58JgPU{sa&5md{jT>ad&z^WkfQ80xE)cvl27Zj~f1FHP+)%oG)>eoUW0Rm0e zoyo!10nXmG`~SJ0-QdmhPrsAYTFeOzEeYjp>a)2$sUf(S2 zl;XY!L1F6lQz*ePGnP`ITcCS?3aKW{4-ZoUw?MBRLn$%DU?a@~*aKjvPL>o>sDXKA z9Z)FJa}Om1a7%ri5HKv-Bj=N` z=fKcb5OnRZoCYd@b@=010bPOSkITs^>kKS0`*Hax(DdTR#r>ziG8P^&LdBi@IuOT7 zTmTh{_^`u{z%srEGX6P$b_Jq^5K2J(a{z_iUSW*UAX7L7OxA#31#F42`66L@J5Hkc z*8zs*!2A@M!lc0ZZFUYYa0-ucj0}Yd z4L$faTtS&0F-GcC{m+7;3~*BbNi;%2hNVzHsQwLP$^axDXnDM4ZQ(AvM)B)OHkpL11KeB zfRyGLP!;=b08R5Wg}LZ+0%`W;0GdJwb0wkjZ9vl;s($b>_Z29jid4XX^nbw4d`L#s zOjWU?`hURGP6ucOYNgqQl;9u!ML?8<9>F1C-2C$ZQ7T80?|RAOB0!Oo!0gR7qQK!| z0wW3e2qd=xR_rPuW)Pvi10=@|%}x@;7ATYI5s>b9!>)Fy+d>u%io4Qqi~aC5Ww-%y6P0n}Bu0DTh-APK;33+wLYX6D=j8)i3!{h&La z$H3EJFz+oqGq1x=z;eN!L}$UOzvKRVf>vI=g?fd@1iZY48>}YI&iTFE@XnL}0Ac?l UU}|4#kN^Mx07*qoM6N<$f~$XNr~m)} literal 0 HcmV?d00001 diff --git a/images/normal/Vileplume.png b/images/normal/Vileplume.png new file mode 100644 index 0000000000000000000000000000000000000000..6fff64ea7022521cd13d4503e1589f57904b9634 GIT binary patch literal 653 zcmV;80&@L{P)!SpfDgHKu{165N7YDC;$Ke0d!JM zQvg8b*k%9#0uD(;K~#9!?U&nb+%OCUeOa3_O`ZS$+=@C^?QfJOxH(mSmg& znSS`r7&2zhY_r$vB?(nC+|}KtKhL5L?)j4Jq-K<$ZZzaO>ssu2&c4bkW58c@B1Nws zESxGYX86h$Vg{%J3jsum@4Mkj7oLt7uq`0V29?UyQ8^|H`Gh!Ny&=J4`-5yrt8 zDlxdr0d9a~l)&kL{tb{s5_!PsHmLA`PXNXEuK_#_aQPB?pvU(1;J(k_T>4Llq56*l n3Hr~dFVAx#fS-Td{uh1$D^WB4(Jp;100000NkvXXu0mjf#+)cb literal 0 HcmV?d00001 diff --git a/images/normal/Volbeat.png b/images/normal/Volbeat.png new file mode 100644 index 0000000000000000000000000000000000000000..62d88a6d7bef26a4fcd2267b132aad87c1a735c7 GIT binary patch literal 683 zcmV;c0#yBpP)%D~Pyhe`(pZ*<00001 zbW%=J06^y0W&i*JDM>^@RCwC$m(g?FUx*wQdC93mTi0)?#oagC1gB|=FxQzRwA^!V(_P}W5UU(Up4Po<5OxdbAtWbVl#6A66O0fabb*1ltQp#$C5h&@rB2hO-E2ZoK#>>Fn z0#A|iB8&jhZG{mii#3>EwLFiUi72J!M+z25t3YkOp;grju6u!Cfx88SUjz>IfF)3C zMJZOux!nvDZuiCY7XdHa{()LSA*N1TFCBULL}?SKT0kMmMi_cO`CT90})esw*StwF# zSVTmiilrYft%ho0F+WBc1gQHf=tAuQMe=`vF$37~dq54G22DS^z7dGf;it3F^^|e! zK+ysY0P2C%!LbLm0OWZdiC_KwfEB>SZ#;>V1{wPWf^rc7tUyG=S7SSYA}+uKPDbwv> R-;w|T002ovPDHLkV1ib?G~@sP literal 0 HcmV?d00001 diff --git a/images/normal/Voltorb.png b/images/normal/Voltorb.png new file mode 100644 index 0000000000000000000000000000000000000000..439dfc00d2c809ebd6feb924374feb668f7a6ffb GIT binary patch literal 346 zcmV-g0j2(lP)#a45nVF0evwVuePQ<2=PpK|{_m)qw>}xJI s>iN{`-9*;<%*#ganfJloZntmg2Wq?vVAZi7`v3p{07*qoM6N<$f~Clpg#Z8m literal 0 HcmV?d00001 diff --git a/images/normal/Vulpix.png b/images/normal/Vulpix.png new file mode 100644 index 0000000000000000000000000000000000000000..e260025e9ebb32f37076374817a1dd007591aebe GIT binary patch literal 621 zcmV-z0+RiSP)q$gGRCwC$mcer4AP@!VkqroY=l%cRE`xBKt&K@3xw@-->_)ue z;PmFrn^(BQul#K@(=Sfndcc97o=*5%=WHQoB4C&q5wMd5YR$O0n>pjBlYv}o0e3tC zxGSB5y%!3b4+wHPgZ904-^@lJ*G>kWkAt*^oyx`-fcikGgU70d(h5buH!~=q0_=M@ zYy*(K+YvUWloI+rP(n72kBq@0pxizC&o^QhZGo9B3io^MX4fZQ_<>#r{@iPDzsH;C zevF1Ge4E#R#gdqY|HoBJfx|bMJJx|MSQI=0j0Na{s@#2=!Sw69h8>P zcm~QxU?Q#c8BhfH95?~3p;jA(>HjFunl2X}0Z#bscAEhZ=Y4MUK#w$`ggP0W354Hn zy&xr8XV||00001 zbW%=J06^y0W&i*Iib+I4RCwC$mcep^Fbo9=rnVwGPyhe7l}ucPj14rmPFY>qwP1W; zy12Ob13Z5C%r2Z1RtiKuu)maKSmJk$!fd{gDps(@+2d7Ln(u{jq5wRK`ACij4hujs zpHl_z0WORKJwg3e==g ztK#;iFjxT_e~-ZiQi=%77B2fRx(U1L@bhvV4#f&ebq(+!kb~|(+eD_=0<5l9m?1Ka0)Z@%pL)&| zLVV(1!SrDv>JoDx%Es)v2O!fBQD2$kY^YB01wf2x4~fB`u+jpdj^X+M@qiaX8~2Y2 zv0up32_(O+5Th5eOy>|$k*aPGRbTbgy79{OyLNH$5BLVN3N6?~Nb;=! O0000 zjSxc4s`@{6_;V3b<7TAUAOr*uxvK~0lh3Bm5Fo?0=tsUIf3}Yd+arXepZGam0r(11UltZzRCK3n^5eATr*3CDbNT@dk*nY@ngZ zQoH~Si+c-b-U0NKDn7{SaCpcY^P zS_Q~(`-Pn$ufU%Ho(?e77f&x(I_TY(tIRp&k6iQocpzob3NMY&F zp=IbLHP%rgT_aSN2+NxS^+a<^X&E&mbQu*|3xpSGUQzg40L$14AJqL(Fi&Faf%XDc zzHFdKloOse0#^HB5`|IlMwlwEA3#be%<*(am<4ADVX$q2oWdN!21F~S!1PjhpAcf= zM#STIUznji!Gwa8N^86n_{Ct*e-IvpSin+r-&xYK`-;j<_x4}ioa*}KEXOPFUN zLb5!m(hEG8KE8MX>|;4Di>%iY5pWYI7{%6zB%W?!9u^Sjb{-<}r>I8v1@?yEAiTsG zqX2dg#yPm0Cso+N*nZ+9FG8E{HRNrB#1XuPjS&1hjTlD*kMBOUfl2J?-Je9h|B1f* aPW}R)bR!6eyH}_H0000P;~)?Pbq3iuVdnh*=Pm+fDLW%X%o0uK2Fx%OzKB=%WCLVCjo=|JwZe*M;KL zKokAw;FV9G;5GxYBPGbNpG=U4PyP%5yBFf_PqyIJ{RDoK_kiEr*AV-#Cf|Kj{c8k9 z0dfbxGH~gB;n(dRfCu27Oz_la!B-^$P{am4FXZOe0NrN~DB3HHl%~C$p!o?!SSk6^ z0_p)rq#dfg_B{YCMMO%;*SaKXF9Z_ydH^eqdNAv!0VFNO%v4)|-4{u?NAPlhiZ*T@ z=)NGv0GvtX4xS=#6&N!Ld!sbg*csz^P^;|e?xXv`CSD?oJw%$RuI0_}tyeiZJ$xv!_dna~4k z1t#mh*|HFN_)#E|_JDa{UC_`c-HZW_1)LtENaz!5(EVh`0PypAspum%AjTNn0-}v9 zPO7Lb1F-sc90f&zP!}O1Vx%EEUI$*G74{!NUb1>psp{v6@A03Q7i zj{hKObWSU{{WdGS=biMpvV9K002ovPDHLkV1g?V BqND%- literal 0 HcmV?d00001 diff --git a/images/normal/Weezing.png b/images/normal/Weezing.png new file mode 100644 index 0000000000000000000000000000000000000000..c0b2e927406a94c88d2dd9780ee61d9c18c34a40 GIT binary patch literal 876 zcmV-y1C#uTP)pg+dKN*esKE zfFeKv6!i=!{(YWr{J>S9Q^ZsX-j-q|kV-cE3sA2-$v8`(NS8`C0x5x#!oL76k!%5i zJMLmF0NuYXFmSXN1{Pca$?zT1EeKv;TAWnjT)&T%AWMPnxB7j^y>8~GKvMWW2f^R? zIu-u%USV6-^_@cdguhI0jj$|lJ%(*smgS%R+Wi}JLm)81+YCJb0000ybkf?BouwZbYh-ffSV30USZ~y=RULk~+00001 zbW%=J06^y0W&i*J2T4RhRCwC$m(h-^FboAl15Iiipa1{cYnvouyQJkJ?Mf?kgm|bj zg9E5l!-o&QO)14sS9O}_8PF5ql0WabQlLTLf^XpO1$rSW>R)^cK#a^BPEG3+rz7X+jMoE*okOzYI_&XrNLQs#{?78^EAo zuWA!IP|WXv@er(uV#^z%&^+gi>es1;1u*;1zibfAju+UpdSgZblmZuS%G}XXhDibl z87mM*0c4@QYqlclv+V;;7yw0AlPJw~B(drW!dsA^A)!>^a00d~H;9>KS!B}@&Oo-D zE9TVz5Kj6J0BH{`H#w^ZyWDm=ImWmRF3as9;Uu)=wiX*!z1^0R1v$KyJpLn)<#4XE jfgm#Y`14oe!_V>$umUg$MNZFd00000NkvXXu0mjfl`kaH literal 0 HcmV?d00001 diff --git a/images/normal/Whismur.png b/images/normal/Whismur.png new file mode 100644 index 0000000000000000000000000000000000000000..c19d20dca6a1a0798c3d6f4c1649bfb734909389 GIT binary patch literal 450 zcmV;z0X_bSP)mxVTV=pl}#iSZIhiU~mW+0000a2wFG*0004WQchCW$l z^n>|v6q3HXKl;9uM*8l)46dYquy3{2uYua_?jz7S=0vxXc&+^^xZzXX+^+yf~X9&Ri{k9+p0B;23w*k!uT?+sdCd~lo2yCgO zD-j9o2ZGH39Vvj~ptMW;N)jihdxhY1fpv2qWb+$c+yjtp)j{)esbD}yClBf(u*G3$oQCm_*h6#n24D(0B}GUAXs1!5D*ITyDR_z00DGTPE!Ct z=GbNc00HYsL_t(|+U=LouA49r1#M?xH;0`6|J`oZP9d#>joPQH%o8BZXt4o_^yOz^ z_OF3rcn<;>1Em}c6X#L^#layb5aG2EXvM06@Gk~XNS4Aw0G$9Tp8_o65~PUhFykMt zl?wa!u#ps@2Le?!?zV||n9hd)$`%FX9#Gb4!w#9-w)Oo4u_!2^dqCBY5cZiLKsPVA z0@dal)N#Mrj#a-O(9NMjUzpXvK@b1D0Kv=0%iqFQ6}o>~Q1?Y(!S9f{u8!;H016j9 z0mlshrVTJn0LwWq*0urJvFNxy1@iiMLUX=BN7#eqlV!Mgr67WNbH5`bIyO~f?os?=oeJUkuM0pUr^XEp#4Cu zzMA38k4Gi^en36I(|{@?&@JdNkVvL+U;rfd(f<@c8ezH5EdoeG@WH>eI~aqL0MZ2P z`?r07>xJ9AA25{N4s6;7jJLl~1Lt%T2YA;P1)Ukcl=kJqvIA0|fYZJMfB_KK0*(Sw zeZ0@RCk&%P49d>RPQQ)h$IWpDfl=G}{#JeI^9!hHART_s@^%0K002ovPDHLkV1gUJ B7o`9I literal 0 HcmV?d00001 diff --git a/images/normal/Wingull.png b/images/normal/Wingull.png new file mode 100644 index 0000000000000000000000000000000000000000..11aa8552a15ebe130d927df31ea29ad22bb0a3f7 GIT binary patch literal 425 zcmV;a0apHrP)XZ5A*CGv`u@ zk6d!ZAp!)nTCWQ+XP;LdA_C)wOiui&dby{ex}5og3J-b&0M*$O9E66*D6uod9&%pK zQv$$x_l{;d07$>mx4jeTnBHpiw|(C_4XXC}WCZ;1@5ep@qW-HE`v9Q5eiOUzd*4LW zYu#^oBJ*LK>uJM~;rngV^hEJU{t3cnNV zRVWiApgVR$1UM|LYSq#KnBGtH?+Lg?-}5$LHU2;4Zm=PPw_aWkl{-Xqa_+x@l{zU_Ict`MV1;(2d@Lq)`@Rut9V0h-$3IL3{ z&)cZLKM5=`mgQ9gRzWpzP~dxm@~J%T+|C;$XoeUS92&@=U*`>ACS}Yljlz4Lxw!|^ zIT&{&2wD=ha`MikCyPyrPS@+@GIbQl#3x`==CX3lj_HX3p~{8k0!)T!%}@FBy#e7> zfCr3L9BS}X5bh6gD+lI?90lv_zt$uGl9qu4nW8XzzW-WNNevPpTc&p&i52dqNum50 hJT76Gzjwl4%YWYYI_KOZ6Bhsg002ovPDHLkV1gCR0`33+ literal 0 HcmV?d00001 diff --git a/images/normal/Wurmple.png b/images/normal/Wurmple.png new file mode 100644 index 0000000000000000000000000000000000000000..8613b8055c27c11df03c09cc3bf59ca14b2963e1 GIT binary patch literal 478 zcmV<40U`d0P)?B4nR-yPGS&#mWSX269MDeOg>NHM*gnhMuI0G+%Py$kcjS~9keHth?!0Ok?-aDrtkt!leU*HBy ziw1T^y<|uPj-^EboM|{jg4kGuI5|$pLyIG#JAxUX3fuzmO|A-@kSKKulw6)d;sM83 z=ByLu3}9^vjPeor8Wpf+18li~OF~kj1!@Lc9s)szgmSTSD?^23Ssx&n7G(jU^sZ7pfEsqC^#rcP(V010002aV0004WQchC3`6gzy|gC(|GirpU3i+-bbI7Tr~=hT4k{9_hlhusVeprH z`v%m0egcS_0%RV$C4?L82^b(Cw+u}7EAYPz*f;1l*p|Ukf!z*5Ytm(~YTnueZ>aKF zPIeDeYyK9vZwz70(*QW&^$JvLO)XM0TCHHfJ^qa<0vH0C<|0@{Ajs4$;=Ri#5h@8t z_1>i(3=NS&!C*%9WQ-B2sz9_%e+FX;xGpeqR)}~StSA6QoB2d63&QXg^bz?GSVbUG zW5z|&JOuE9;3eaQ{3UW(phjA(=`cku1k}19_8OC!%R8?K1b{*2gjB5xsQe-?gRop7 zw^|Fb1r$%$D_9oDd{V411;~7o6$%1(0Rlk9b-e}o>3;rh@H_A{*c^t#H1I&{^68@4%t37&xeBBFbT)6F1uSjv>+9%WrL0+|U+2bz( zv@eTLpWa{ zX9ohw*n41RI)GvkfPFv8pfJ$b_n!>_F@UZLQSc)ObEB(FqyBAa7!(h^teJ)eLgw~B0^wq=lm-69SwN@+4^sN Y037Qbq}dOwjQ{`u07*qoM6N<$f^M?n8UO$Q literal 0 HcmV?d00001 diff --git a/images/normal/Zangoose.png b/images/normal/Zangoose.png new file mode 100644 index 0000000000000000000000000000000000000000..bc28f4dbc43937d97681a5ee9959378701912598 GIT binary patch literal 747 zcmVAZx2w7cYPs(h?%wVF{R}G9T-dw zz~Z{2_k3aM0IP3zkFXO7fTm>AJ=y8-Gn6>6ETUILG#^!yQMB* zi{qwH`@u8kDh{Q1)U&3-pk`chTv!cMk0<0V>Smo z>PNm1F?C{!7{{2i1P2Xf$vIR%TnunOMS_!E4~^C4o{{kE3&0e+@6;M#VP)7u5Bb0c zQ|h`yTmxd=9|Y&fFV%N9HlONCJO;Mrhb|B7$=7wj3T*)$1%!?K>?b%JhfnPgYawZA z{h2Uh6+~|Mh@O9qEPkA-p|cn;>S>O9%wmt(Cs$Ri6Q|$J>oXuky6jf&}rv`&j+@ d`w#Tj`40xXfb0`&(1=ywx(F)GjHj<`H^SV^0v60@BTz($he4j%%j^Q>2rw?fPs$nxxz>Lf#-+_-qEjY?wK#Pd$ zu}}93Fmnx`G`k8xo4mfhPr@>z{7EbwTJY3)`AvYE z#=R>vGl5DJZv__FsJ(X))oR4Mexu0rnO*xT99Ak6c+2lpQDsS8^$2iU$b4&rEfbx6 q-J0yYN!i{cFDXC&=RSP+@Av__>Kjb*Ch!IT0000L^I6*0004WQchCq zkd$Qaq3g_cARiQg2L=rKV;ATMjX@hkf4^}* Zn}3(=8U6+ip+5is002ovPDHLkV1kwR=Y9YH literal 0 HcmV?d00001 diff --git a/images/shiny.png b/images/shiny.png new file mode 100644 index 0000000000000000000000000000000000000000..9c18ce8eac05d8ee7585022a0023efa329c07a44 GIT binary patch literal 5287 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 tUKvIk7Lh$EGxy3cI002ovPDHLkV1nxTvhx4{ literal 0 HcmV?d00001 diff --git a/images/shiny/Abra.png b/images/shiny/Abra.png new file mode 100644 index 0000000000000000000000000000000000000000..192877ee820167f6846a7a3a3fd0fd93010df958 GIT binary patch literal 553 zcmV+^0@nSBP)?B00DGTPE!Ct=GbNc00Fs4L_t(| z+U?cBYTPgo2H>FtTp#5(*dGPqvsq}bVnEfk;PeHWKyQvPxV{D24eOf_2Cv?>HYF_a z%E>VV^5cUrAF^jWM)Z;QnJe?O=r;g*GF?ZRwrP+Bv;xw&ato9@AqpsrTR`0}0A;%g zgb)B^>(k)V{eJ-VTU9Ji0AMMd3;VY!p6W~z))kA!&>j%owq`=MT zSbaU+F5u22!0+Qw?dxfXG=pCW;LM@g-#Fum0umsT&7rRE7BE4sn`IixqJKOdhj^li zFS>aJMLCp%0s6>u)>Vv(Tmd74fNj}~t54o8g*yS+?+REuhSlU}Xj)846bK7~3Gm%B zz=jdjP9Ojrq(RK!>6|<=>yn*N3ep7S5Zvk|;tWQ&Qzcr9-a&GtXUUl{Ssq=Nxx~Mf r#pb-0JtcDn{uNNtD~TUx!W-lttBs5%4xj-900000NkvXXu0mjfuITrJ literal 0 HcmV?d00001 diff --git a/images/shiny/Absol.png b/images/shiny/Absol.png new file mode 100644 index 0000000000000000000000000000000000000000..b4e812a928e8cc43cda94a63e78627333b548123 GIT binary patch literal 782 zcmV+p1M&QcP){XFdH?slic3G1Wl8Ce9SKk+&SB~%Ez93UsNAGU8Y`0S z;C;nW`OQGu@+!t&yr%ux?G@jPSJ5{N#TR}_(Cr1^S@=Z*fAUuRtqS~*UufSe*oS-> z?5Tj3N_Kbe)I=aN<004!q(?+Fcc(rO*j6B;vMMwc=&3;QGs7X^v!HmV9|l|(m=PLi zH^vo%jHF?=4POY`aiGaJnBZAhuo7uWDF9?WCZ0Fz^AsYp(c+St@{2Ls= zFaS0}aaw?n#gSK|MxLGm-(-;3P<&>|><2 zDo_H$;1}*^VD?@B_e^gM%Pyz`Yz1IG=(4^L6CS>LvfsArlXWkUp5J05Lz>fu;bzK2vy1VmJ z0kM7-e#@}UV!+aPEjI$Q!J3(ax+S18Me71?35W`LgWewmFP{ki0f?j=JA>^Ar~m)} M07*qoM6N<$f=7>MtpET3 literal 0 HcmV?d00001 diff --git a/images/shiny/Aggron.png b/images/shiny/Aggron.png new file mode 100644 index 0000000000000000000000000000000000000000..58ff14f6edfb827f29c43af24ef0c0e91621300b GIT binary patch literal 1049 zcmV+!1m^pRP)=>7>^F1lZ9C*e_R`+d0y0G|xyOX|X%MN=w(Aq^UzVNTFFIDu|k&=$qLRWm^{L){( z8qEvaC*A_Os9zkX*jN7>tOAl>0_g1gq-=vYcs>*`@c^JRer`m5>w-}X z!Q^A|65kr!r1e1?g0Rtp=mJFN$x>W=BajZ&wlPcKC;;d@$Dh(;uI)N3w;K;02qHgd z>!$qEkkgic>-BQY4kb3yVTH|BD+5(}S= zM0WICfMT8Dto@O188FB*0U8FFhE7DZXoF|85e82VFGP6c{D}1cOD2NIpWUX4H#-5g_ga2_RZ9LcwCu8W~iMlhU&Q zrEm$v#^`*Pw7dsZVlfF|HS43#2AGx6g%mWBonHbG-2$Y6Vd5CJgm1XVAu zj9}Im1%1q`403KA07d~$l5Vx?<&hDZ8Cr82d?gSh5ra4DIC@C0>im-+XPMjJhanQ5 z0&)~ifG(uq(U2qaiA_Uh2|PHP0)Tqr(?9@D^wy_?4+7o`@Fd7c1eo0;@MxeBLl6KF zfRcYv0FAlGFi7`;hVei%5K!`O6payBf~6ptU5Q~sAhf-YA_y#lL`uv6I0Oi2JBhHS zW1`D3&}G+l7AYb?0+PhTk=P7y&buN5LaEF2Pcq0DeV|VHQW(reu|CgAzGW+T!mF4$ zOEChfPX@1902wKNA4#1zNt^UsTxCQpl`Q4Vu(thvcZ0QhEx0zT3v!9y<^lc#RKY{Y TMSe*F00000NkvXXu0mjfstD5? literal 0 HcmV?d00001 diff --git a/images/shiny/Alakazam.png b/images/shiny/Alakazam.png new file mode 100644 index 0000000000000000000000000000000000000000..eb4cf1887a361fa8c097311217923d73091f1df0 GIT binary patch literal 819 zcmV-31I+x1P)t8RE5cF7O7lT}lZY z$bzP{G=}bhLjo5g5L^s_;yAcxxS=M(&iyZaa$M^qS;?9Q#=`Hz_x<#f@iJ{^@Cl6+i^k8v=z&zyvz9YX6`xa~`8VWLF4; zxiJBxweNZej22<4z(Rdh9Dua4$sdS&Y7sEBK<1_dPK*N(BJGl3Q^saWub)KdK#6e= z$n1eGW@47;1KUO5no?CK0`BhJJ3mlrncHj?IS2jA`|*j0$i178g$RwPrw5sP2aUEn zKJ6*xc0*WT3F7vH)``Ts*lYb5pW;tb7J|=&I6HF#EsOahfRA;h;3T+3e>c=)Tr}1I zYRt*RML(PAz;Uz9#%XE&emyx66Z8jCZ-wmt6o5c&uX)+KJAH5&3gm1Ium;+{0n`-z zrF|nK1RAY(I9q=j$N~^iST*nK;ZeszK$RAfuK<4BA3HX=X63bwsc+N;P#MvPDAg+g zBPET=N8%f?Kc|1c6H(SM>SwOF!IBfN-zL*Q$uiIlusYPJ_35M=ge73zKT{bv%`V#l zu<$`{)YwuM0Tw2{+^B`IS0tuk_P?Di!kCVVr6y!^8%%#$x;5r`dS0^50r3ietskfe z5YHzuw872;`D0WYlFohxm^LB#V|0OI;#uORMPlyj0*xczYs8rXr^}{Zr>T_s)ygJR xYmU@Gac`8;6kF2xhIpmb-s9&uxI{3^wm%OV-|Hfx z72r!9s$0bq>wecoN<&1J0_eWm&&Fy%OoBGVStzLaehh{+uoTb`%>VUF@o555Dj`f= zd{n^0=!to0BA@t|h1-O44nEXu6tod6;}!5VS8XkjqL>d6eoLN5rpFWd=(%z z6+kgrC4Lde8TLy+5zZX9WhiEYnPVLzeN!M4V+1h=O7um-bY_SVlCe^tHlG4;e=Wcj zOQ;wlkly~|%6ACEZ@g4)$9o&lG6KE@?rLuEjn7hg0ab3NLfJVlu+L$jRN4Y4)n`O+ zHXj8zcYFa23FOacucyR0&A!uo2Q=nWI;)NY9;{i_Y`|(eph!=iE@F+k5 z;0@YN@RwL3O7CbXVm}X5f4aVD8@g@LtdXIJQbDSEXj~Q4#u%dw)OCL$L^Q0Aidy6< z;6%fpnrV`X5mZ~{q@iaQq(M#6{^}iiY$WbbX*v*EqRq0DP;=_U0K8BMVtiWIy3)2j p3fc-Qm~MjyjB%%nng8zF^*{K`E;$*Cv_}8{002ovPDHLkV1j_AKy?5B literal 0 HcmV?d00001 diff --git a/images/shiny/Anorith.png b/images/shiny/Anorith.png new file mode 100644 index 0000000000000000000000000000000000000000..10f94beff96962d5df4bae340e2dac7de9418f2f GIT binary patch literal 624 zcmV-$0+0QPP);K-2Ru!yj*xWJ%bz>sM8P)ML~NZ3#yXlQtVSRg1UIHb;Kw*UYD0d!JM zQvg8b*k%9#0r5#hK~#9!?UzBe+aM4Gr6J&980!AVjQ}Z6$$ycBymjrg=%S}r_VVS+ zE#Sj^a+U+02;7}Nvd;{-KNSR?=7%8!TNZtqU(gVup}|?68e)uu!195>wB?@y*ldAX zE64i{n9S!=3eXk=2UUiSO?^jDN*0mSb%8za?SKKjfc2Ar%K_YR?*baWgYFYFYQ1_N5bqj4Z=iNu z&`13L0IaJZLe2FMFbY^JaA6n%mvv17YD%p z_`cy4X1s`Id%Ay)Z5R#VIv@D;GGaqpoEQ5x%N;C)Kuega8ZFMT%`J2j#CVilwl*(Y zCa{(tf&ogfX#poe3}MC)dtN!^Ck1xo&w{{xfr6eMglWMBCxO|V09Cc~x6wA35SS`| zf14T0eNg!E^JGfk{zJer1OEv4Sl}#kaCOo=jQn%p`;X_#dwv4~NG1~i!_71R0000< KMNUMnLSTY}8yjr^ literal 0 HcmV?d00001 diff --git a/images/shiny/Armaldo.png b/images/shiny/Armaldo.png new file mode 100644 index 0000000000000000000000000000000000000000..e4ba5aebfbdb4b046f7d5aa3e1f90647a549c7a5 GIT binary patch literal 1058 zcmV+-1l{|IP)xU|0YE0KP~%u>b%70d!JM zQvg8b*k%9#1EWbqK~#9!os`j%s~`|WHBlO2=KTNXUSU{cCEl#H=V47*+oy&WnC{>^ z)8BC`r8v_s)E%FGkOch1-R)OFEv1+_kxpv@Donn|pHKXT05{B-NNeLUi&`l>cet^F z{-2mdettY2GtIEjUOP9cTAnPR$GooTaS{~2lbH0=z9}fqh?|2#Ft^XjeFL@j zymH2!_4$14aKDGTGQGy7;Jo3lm9iqduZ3>!WYl1ccF!vrw#D?Rd#OQESTGtee5rAl6o=9Q{ z_%JX!JPST*M9ts^iH{CB362(Ut*081gj;T0bZ*$0aqI_Z#s1#}1kO3{M?OY41Z@e2fSeimH-THkM`K-(H-X2i9S#BZ zDZmCJuO`SD@R5IwK)o8E!HX8oVF2%W>JZf6T`;C418UjS{|d|qK_v{I0xujhWO7HZ zbI|RTdW`TnKrawlK{-RquW20$TEjI2VYn24MC3Q5*Nr0e%}}Wxg6&g4F{Bv4VT)UN zO@R{D1Rer5B7Z_4(N%7yT_BBoTq_jO1R0tie-|W)V>Rm6vVzosB!FmW!y|t{l1?W= zIV+ukl*IT-`AQ%$@*#LLkV(Xsa>$WC!^$`i4YO`|DU?G{`blks;Kaz=ID1k)6jIAq z$`BCwD;yYSPs*VfKd7OuAz-=$B@stG3@@nFUZ;}j8rs0rKxajN3lPugKOhOb209#4 zrB+h-LvRg%QwPxJP>fwsO6r2?|M&=wy$(YKRMdd)f@q4ym}&gPi6N%0+=tpET307*qoM6N<$f-pzbS^xk5 literal 0 HcmV?d00001 diff --git a/images/shiny/Aron.png b/images/shiny/Aron.png new file mode 100644 index 0000000000000000000000000000000000000000..6b4b06b0802a78ffa39a0c4fefc0c2c46a7265a7 GIT binary patch literal 337 zcmV-X0j~auP)Q_$0O-6U7ytkO0d!JMQvg8b*k%9#0NzPN zK~#9!?bR`E#4rp*QF3UR%)kGEvs$T0I>`%crPt2~XdAE{$8j9r(ORod=HVVH?4dpn zz3_amw;I>j9{PU5thvf|Bz-@XHEA=zJp;)tQ4xEAVD1G-NNV-$3ErfHx@OCoyXz0e zEo~H?SnKtHyKoB^&Ykr=nE9|0a?&vl_HP1vIU0kW#?23#-X`vfv`G}!!*0ZNr! z^@c6Wc>^WUr_~#Q?Ysw4(%5@cQV}}^50F%l$Q8g=zzCNL%)niJNe^rQlKDu-5^M`# jGk|>r&L8SHj$_F$W~vA7UKzlY00000NkvXXu0mjfb-Rug literal 0 HcmV?d00001 diff --git a/images/shiny/Azumarill.png b/images/shiny/Azumarill.png new file mode 100644 index 0000000000000000000000000000000000000000..0deab07fb7cc10ce8eddddad5e9f48b3ebf1c17a GIT binary patch literal 543 zcmV+)0^t3LP)pqJBg-z|k&%)N}xp!c;*2{W;s=0nmX}p9)jZtnN~({;ZCymxAGi4@9*<2GhPtD83>+ zFgQPeYkVM~1SA_>Kb(tBa}r1ofE=Cy`Ft)|A#Dd?C!+xa1MR`!3{3>_ZD6zj&|U`u zfqp%A|r!ZNkl zvcM7LR0EblClJ=<7SNJ;tPzUe4eV}Q0hYkJ>-n8&ey31@8KCU1a`q6;j(GF?1sVXk zzA8&{zf^*>(+Pd{njiqJ=lvzMif1nRiPa$}ClpFYB@sqYg^w3dn1OH}%Crytw%;FM h9!mQBXZY}I`~y>A6^8c1Xkq{W002ovPDHLkV1itQ>zDul literal 0 HcmV?d00001 diff --git a/images/shiny/Azurill.png b/images/shiny/Azurill.png new file mode 100644 index 0000000000000000000000000000000000000000..2c6ee27492488e9dc8f3607e2de774a2bb92394f GIT binary patch literal 520 zcmV+j0{8uiP)hYv`wc2K0)&*qBV6#E z^Vtg=M(F@X3v4b>xd6mg0JIU%%hLylhUD8m9iIC;)Xo4RkUI48rTe~LUM~zB0RWY$ zZv`v~U~mMEfn%Lg0l@Rj_1{{lm5O2eSO<`d!0St8e$>tWvJMD|FceB55YhgPJZj+j+(^ zAhBm8H2O~*;==C*IwhkYq(+K4V1+G*odJ$HnqDN!LMqX(57|?>bB0yXsFa&;Ys)_j z%(uw466bo~`IcQ#5;VxBQ_L^O*@$B!P|5TaLv+MCfb?geFK`Cd7i3{l>*Yt>e$}j6 zFTD>C<$TL-7g#$am5kTmE@82wB-K44tihPRkE8SaS$uf-Mf?FiFcfc{C8byZ0000< KMNUMnLSTZkuIz9C literal 0 HcmV?d00001 diff --git a/images/shiny/Bagon.png b/images/shiny/Bagon.png new file mode 100644 index 0000000000000000000000000000000000000000..b9d015abe0d926e3439895039adad884478091c2 GIT binary patch literal 443 zcmV;s0Yv_ZP)f?zptxYbV8DQ2fRK=8nPw1RASfs(NBGtn00001bW%=J06^y0W&i*I zMM*?KRCwC$mced>Fbo9)CU5ch|Npl*gl>;(s$MEaBFbe33;95MczF0*_T)GEn%qvL zo^;^W@KYZbsK0%m{(3^y=k!@8ojZZfKJ|V#F!eiuA?-bNz(39VoG78JA+f21-DKpy(%h6aCkLLc#U+nZA>I)jkA$ zvydmAfxdoP2wnKHY~hKrK&uvfyL^etcZ~4Y!J$Xv^kv0mBo5L+$t=|2@SZcN?s z^kTxzkeNgt@}yM247&mdB~%80Gax|j%DYzrCd@X|m>=0eWrVrL+vWpKU-5asXJ8a? zC6z#9h_9pY%782JXyw8HKcTg9A$}A}1B{_lAtIpe&;4r?ihc_ry&YT!wZfoHkeOQ+ l?t+9eaGOY;-`|J-%NPCw6R(Cu9IXHV002ovPDHLkV1g#<&XoWF literal 0 HcmV?d00001 diff --git a/images/shiny/Baltoy.png b/images/shiny/Baltoy.png new file mode 100644 index 0000000000000000000000000000000000000000..569e37a14cc48100b2f5f85546e4f6a7fdbccc9a GIT binary patch literal 359 zcmV-t0hs=YP)h67?{9^x5;5Nq@D8UC)q`v#J1GwQu}d%lQ!1ea^+ zJ?Z@fY;*&-ta^HqxW0gMPoT|kVpo*_`>sGcqimmB5vH&bRhO;I5LgqWIlnE8TH6-* zdYpdwYBPtsmE<1vlf+st5o8002ovPDHLk FV1l5+mdXGC literal 0 HcmV?d00001 diff --git a/images/shiny/Banette.png b/images/shiny/Banette.png new file mode 100644 index 0000000000000000000000000000000000000000..c1b661ece4c8d167308277ae9081bf8159dcb7dd GIT binary patch literal 488 zcmVP)5TLnt|&W zdO%qA=}PWnc8cL@CxA+ZFOoG=SAffbALJg$6+Z_RU?-sCn43S2gYG^9j;%|ezd$4SEL<8G)|X zTFP=jK7e}!&}Yc8g`I+gagt_++-bHP2!N5XQ8?Fq$FzGzfpiqn(e@80(K7q e&u{L-!y><^r3;Bzbpm1l0000pYlaDbq20Dw>cI6zPU003~+M~DCb00DGTPE!Ct z=GbNc00DtXL_t(|+U?e{lG`v0gkgvP7X}x2|JM!0%XvIW!=t;zUn4d955-FI@$v7% zczHPhqbz8Y6W{yMC~pPq-8~Kijjy5eK*OJbG06t-*?IMVP23GQjjHPY+}pHQASiwj zysk^tBjje5X3WiiU)Q}~1?_j@0n#!zzX2q{tJZ!c>VbsqUcx|Y4b;-#T(tls%^tFW zZ8A{5rQU^wvLOv+cnySVF946N{YWgXPpQ54B4tN4BY;7^1TwvcY^p*``HPEqzG&6z2pc9^vHf17(mYTTLBC`x_MjqTCo0&z|sh{kHW@Ci+$xrseG0ei3JlG3u!d-}xBg1SA zWM;`3&N(nJN)B=DQF4qJsFF8S)#tza<3I5W)dvzHo%ddf00000NkvXXu0mjf|JCUX literal 0 HcmV?d00001 diff --git a/images/shiny/Beautifly.png b/images/shiny/Beautifly.png new file mode 100644 index 0000000000000000000000000000000000000000..4f44cb665c1e5dd54aca0aeafa80bbebc8e838c1 GIT binary patch literal 624 zcmV-$0+0QPP)G6M;d$H)CiNnlIil)D8n;_~Io zIq+frM|>tw5x@uekLrM?c~c-&jd-_!V!<`<=WG1^26!z4{3<}N=0gZ<^61sPGz{#P zzc$YE!>}y;4u{5L2P#y-Vna~EDalF6+vH(>p55SiTNv@AEomr@0=dBR)_S1EXXjLb z>XktXi@Bf}=&LuuRf`MhgAX$$%OMhgv@JQwtWfIh0UOwBtl3sk2q4(J)d7!h?Y)ncjwIB7;2 z1LfQ%6#(hy=fuGF+;e#o07+*8N&&-m1ou4#=kf`__XFk2|KlHNTPbj_FA-S)0000< KMNUMnLSTX^ttzJg literal 0 HcmV?d00001 diff --git a/images/shiny/Beldum.png b/images/shiny/Beldum.png new file mode 100644 index 0000000000000000000000000000000000000000..09c77452465c19cc25cde0576b5fa222a5d78ad4 GIT binary patch literal 427 zcmV;c0aX5pP)D? z;1no&3W%`%uutba5+KAmfekp@M|Lid0!7WO!2AkseF31SfXE}V1J(!>W>*01JSJ!= zV*@7dIIhQ-kt)!9-+W%LyzA#AlqoYCHcjnS5k>gnS*lx%GS|u-El^J@S0p)$85wU3Ygs-XBdw V6T;fwt=#|s002ovPDHLkV1n|Iwrl_Z literal 0 HcmV?d00001 diff --git a/images/shiny/Bellossom.png b/images/shiny/Bellossom.png new file mode 100644 index 0000000000000000000000000000000000000000..013df11aef533f11976a17b61314fe9b32f3c09d GIT binary patch literal 474 zcmV<00VV#4P)%Hor=e6);2h&8QL!Bm~ErE3PTU z0++jspsF-q*H2@F0%vVn{sdGQ?!jBw&w?jiAI+IW?$sre1Y$Y zlq-U@%npFDcfu8dR!VmFoJ%qHqen-`xp>a48C-F&d}wB$_-3@@x6k}_<+ibp0~{Yd zTtRy<3nzvM*zKAbgP5O^04%>x0ErbO$?UaHj9Po|h{zbB0cJgBtxthSK%T(j1cX3f z*1rPLf;<8GGs0pF0)gcVcYtvUd~=7~fh61k#)9j+fxdl7NjQNC5cn6(eh1Q6vC5oW z5ufEx(mH|KBY^?TNneue+N4HbNhWldND`RK4g&jk!PrMX0N&5FmzRHnUx2X}mL>Rp Q9smFU07*qoM6N<$g6P@OYybcN literal 0 HcmV?d00001 diff --git a/images/shiny/Blaziken.png b/images/shiny/Blaziken.png new file mode 100644 index 0000000000000000000000000000000000000000..9f23d0512c446c146ef3901a96a98fe9e91b344d GIT binary patch literal 870 zcmV-s1DX7ZP)-1L5f|}V~#nRfX)?UCKsrM8JSomsT5m>F@O+%}rfSLi_a8H3g zcq!1JYIa*8(#PhYplUO_t$+wx3j)q6A1NRK9>6Y;X4!5lG-wdcbL_lXZnozw1wsg- zsuF?@L$;d=or9`~tSbPT9a8yD1y!Igvzb8zuzMvaq$*k$sPq$|+*2@TxDUPyLpsH@oMw-4>I4{Qc*p@~%LZlxBzAJb!UKOZTyjV|ZtvMwG zH-j$+_^AQM%U5zjt!C@M_6XVeY-nw9@b&*_-#9r=oT{By0{c74o=26!g8(^u_LTViO0-9m`qdgF%fp0dkM`4WD`KFLeaa5yFQ6wVrtrWdA%05cZ4`)BJvJo6_5*@tzOJZ|7?pRD!7O9(2vV7a$;=kZD3Kt9b^gz(KkzWN2c_(cy0Dv#`j zw}Xv=Ks2m*U!WT=07Ul+w|U`2q23f==R3hJ+zdB)e5=G8{dfLe1#I|XoXWcu#;_P< z1k*Sm;}3%QF9HccmK*#{Fwf(`coy_4ZwXRd1hEUwhPar26U;qP zVvHw2+yqhhhG33Qf;5XP=8pw&6GUFGU_HY_k-mF}S$M_Ay+Y#Iuvhz;Pp1ZvuPg9k zevIo=- literal 0 HcmV?d00001 diff --git a/images/shiny/Breloom.png b/images/shiny/Breloom.png new file mode 100644 index 0000000000000000000000000000000000000000..bfb1c521a1704f7c4e4244e528029e6dea19df4b GIT binary patch literal 747 zcmV`J00001 zbW%=J06^y0W&i*JX-PyuRCwC$*WHfeAPfaywh(Z!-Shr$yRji6*~xG3R+=Lfq*2Zn z6HQw+{N}$1FZr@w-%IK@2ER9XOfc&l=34s@6~H4vg-FbBqSlhq^h5xO5Rr%z-e*1& z0Ff;~B<&^2r-050V0pcM3eps1E|Ud&{W?dPX$JsVhEQ~`|9+bwF=obAK+f41G@%qe z0p<`?S638BoYf38!GoUw`w_-6fHI$ICh*4q(nDYte2l&gL1F`-$X(bw1DLr3unnW% z1H_n*M+g9vs|B{Kfe{~J0K4a?tiEgj5+UC^VE$g=p1i<itJSYhtM@ z!n2_D11#*oV_}q*2}&tXfN^a2lhl$@oXUg#5O|JGsgxAsbQ4gun_@gtOjC+BM7h^5 zku}B%t51h6q&osiYCu{2$%OQo482TgKyqLVQOfiIaBG4oeUSdW8%FzDC;`d(-v+SP d@9)m5`~?|sF=C^yO^g5l002ovPDHLkV1j43L`DDr literal 0 HcmV?d00001 diff --git a/images/shiny/Cacnea.png b/images/shiny/Cacnea.png new file mode 100644 index 0000000000000000000000000000000000000000..382674052406ab5f7258e39d953078f0fc2c3d4c GIT binary patch literal 610 zcmV-o0-gPdP)@b8Z?e7l6lWB7ypmjMEG0?IGQ~Kb5Iq|} z%3OiT@GJE^0ywjaVWufnfGmQCUymaGC1%wlOb02DR}doQtH{v++bi82wq6t|45NvW zb2Met{iwj2g6%z!OP{kUKvKwKREBDpMaTj_KMY81Scs~bh004nbYQWb6mUm-#kSs| z%O_NWaRh>)rmjZXAXWkTS_s|x=2Hh7T{ZRC14&i)Ok*Re07xxY`5F*7Y{2zBrxu|_ z+Vty{Fhh5|1&Ro@z#|4sj`!2kdN07*qoM6N<$f?HA+MgRZ+ literal 0 HcmV?d00001 diff --git a/images/shiny/Cacturne.png b/images/shiny/Cacturne.png new file mode 100644 index 0000000000000000000000000000000000000000..b92032808040951591a4a7a1b330cf76fc407902 GIT binary patch literal 809 zcmV+^1J?YBP)Bf%(recr(%8byVs(Q!_E|LZ-=Euzvgh~Vfhr0V|^`1>^zSUE%W}3 zK=Or!fu#h1rPQMg!K3vVN=OMYGVn)1LOA0gSSjTQzI%uTy3-FUU1#!eQErw+wF>iAYr^6M7dhyCX6(du_C@HDfw zpDy3h1@3S7oGrV%dA3@5&Th5Nwf1-8doI~?CCq4`$nz$QXMt_0y_Q0dbGw^WL#k z5X84|y%ET6NPCEyRZI!e&^*_C!oD0)trwv=xD}8equ0TuKrsol{xH0I5|C8PeCN2P zTZ2dwR35nMKi$tj7J|A53aFwBrhL}*Q`dE!4A7K7FSPT+*y{$8=MBqg1~ftAnSm!* z1w5RdsRPKqSww(lI5qxR2~$GPN2B9{14zPqVBpDB@N**|E$JL!7U-QIlw;4)cqL#W zPP{->BlM+!83n2W;y(!_IxmWmSB3s8P{GiEsP1^>lM48R&d7J9rt3hCRs z09tJqE%<>ufrFn81Oma|+fU~q2%ybN{$z-jWzN;Z02}5XEZ-!0!?ApqX!-m4^_Snx Ye|Rm3h9Sa z^r@e5S$P!rG?eIiK;HsaXbSDtbsJ#blBFEbZ+SeZet0#f6s}f?lt##5L z0X+iD3?&@C=wyJ=x8_(XF^&LF2bB8OeaVd7m&rhA=m8GK07^7d;C)}d8`!-O7~g=1 zF9eimyJHMMq|*UELf#w^kV^q?ZM(a-6|BB6O%=Ro_&u=MrIdy~KqOBCt?2HPw@&E= z(K+8sQ4UFIy^TPFGS3ZAipQIhx1HYsni*gvj0NF4&<4Xx=#YbRfg49|} z(7gN00$>D)={(@Ap>SQRU9ujU>W9VpV5fYrcqUXbktyif(Zo^#kpUl6GqvPcDLg;*6p zwI6JR{T0*?Brpju^HYZW5je1OKd=vdfGIygq*jtQyGj*-X#}PULS)hz1;8}?xdIbe zB+S@$Kfz3q=714J!kF142-9Rbkf2fE!?!LX0@DD>ff;aUCP-Jn#yB~Ui-iP!KYF+s z&~#w;0*rJQjs2el@J|A`85n>k7FaR)M5O4qh7#JAAqu%TQ0004WQchC55CnC4+a22Z|L?s8+#_z{%4zP6G72wMK#YmgU@#c`FK&J_ z0NgE@?rq7<{7S%IS4F0e4fP@O_r&Ctznwr<4CTOFk@5z*5#Z7+YlYd&rT&6s=9YQ; zh3zUrb-S<^G6lB+&yfI%H5 zTm}YFNhy&iEXWj}K~g%eH1ij@p&iF@{GX)uz?=Z|U=LWT z&u8y$b+h;GIiCdtR1@>s_em6QQNR@-Q7Z_z3Rnt-N!+RhMPP}DNA~J3M zqP9o;%Waq5_D>3K6%ubQ?n#O3qtd>EFQtOe!P)N&G)s3l34jC%>=#Um3t+45v*p)c iD3fiS7s_!QAMp)tt_gNRm0~*p0000P)MD`OZQVJ$2lQ#0c z3c{}j^p-B@6kh_p-8p~A6TtE($q{Z5i-21ANRBXC6Tl`w_&{r(3pBi;r{>MHpXw0#7&nyo=pyi%m7+h zE-o(qJ+}vD5r5W!GJt@5PD)s{ZNUt{Cwe8y;+G0=Qm4br-1QAz)@hK<`w|%MJXV=PQ`CBkw2QDV9=# zAXM+u3k<6B6hJ{rUPrclL!W0~kRAY06*K!bGt~ST81}te0&C%c--m#u6oD`RHU$im zAB<}#{l<>Pa$`U>!a!7;^Hko Xns*sJl54#g00000NkvXXu0mjf5<2cI literal 0 HcmV?d00001 diff --git a/images/shiny/Clamperl.png b/images/shiny/Clamperl.png new file mode 100644 index 0000000000000000000000000000000000000000..4e26cb80cdea1a461fbb4e799737049d9ea9f194 GIT binary patch literal 558 zcmV+}0@3}6P)GqAnHzuPEH0uNxyCG zkVD7QN#FqrdXVbCA>`Kt;9B}K!TGqP!4ndq8ZF-IC1k7-vPM)~1$gSmuw`AA z-5{dVp=4mz#u#f`f)@J68ewEBg#Zct{cfS)lEg~VU}jsB_jMq44~AJRAg<-XCDveL zW=$$}kOmgll01SLWfr%JK|ddV(Pyd`3;TLg&LDaw!iP)BN=(=wA3Ma}S^1AOGK z8}@;3@{NBtAYTFFPX**h!1%ylO>o~f`G*4Bx1WW34cS+{0^ih493D}4o5*H_lpi8P z)sGv8o#RVDehFw3 zp=Mw@1Xk|^Xa)>m4>+fQnE^ZlHoOudaQYKOy#=DoX`$hpZXV+}9&cjZ)vsHpy#~;4 zbU}SeNl2HcefMn4iSG>h-;cSR^a{Tu{-z`_J7m7|2(Ch z0U~}T`hj{4tUK;W5Pq%lCcp#V{q!j80l+%9uw3%+qYvx>Ltp)Ofda{EK)MuCjrVUt z@onYd`wKw2DPUH8IzDEM&p`O&IAeg^_{{AFfYD9?N+1Ez?-tOv*+}dGW1b^W3V
      xdWoxq*pR>1*00K&f=*bbrdUO>Rh{^4)t7ewbdA`+?JJ^%m!07*qoM6N<$g3xI$ AZ~y=R literal 0 HcmV?d00001 diff --git a/images/shiny/Combusken.png b/images/shiny/Combusken.png new file mode 100644 index 0000000000000000000000000000000000000000..f370cea9d0cc934dca9363451a8aab0b37b4eaa6 GIT binary patch literal 749 zcmVD*8`6F z!Itm&VxlcRW8S$~s2yh5O}}PdSqrt@&|@^VVYhI}XChh)%?aVE?~FjWL1te44zBx^ zS86>OsP6++?OdR8eHW;791syR%be>|V!ekr3_{TL>Z8d7(9zj|PC#Wyb@1!Z_}M0|1!$#qy3B^T~h% zk>~&q3E}erArinqgr`BGW2gM303w39^q9bj0w9tQ0!R?>t&wB3;|5ad1xS(+w4Ax= z8tDAk5SPRQBjcc(s@j-ij)PALNkmv&8G+UUGIyG)G8>|^jUn=G0sZWyz*3QUp0)9U z`;34sk+a#$T>&5|$q4j)cFYH0??f!W$!nowA6C!ZB0C~))}a&` z8%&+1v!nZSguIbn3MgMd(kRRWUwwqHAqFP$T97h8^1>d__?TD&iAchCM!}>=QQZrO z4sQkPK1oWi1?&OSfiGsWhzNuMq5*z>;KK;$K6Iz4u_0{0cZ|pN?Fay#eN|IMcm^;2 zHo|I;Olvx@a0-YNV9{G^82SL=3_^sS89D;=ULau6!^Obv2e|Ioq5o-Zu{0pI`PYDm z6qt#aFQg${1W8J0)+jEP)_{hlkz`)GR%=oxi_>hp$kU-34X0S*|h$tuk001n+LM8wJ00DGTPE!Ct z=GbNc00I9=L_t(|+U?fuuHqmV1Yk;K-_N=K+g;~{9JAS2(Z9zr25mb}fF{=V%{RX* z5uerCN({99WISr00V95D7yS((M$XaS1}G44)TkWZ6Er4})hFt+KE_Z7?tsT&pYL$2`cMK-1t09IItkuO0+kYi zXVX>vIiM9b(g{>QvxFq?DDFvLD+@T1LVY^Y9nhM9AOh_5oK|p8!_(MVYJ*5No z1W4BuNoRmNpbNl}^LBck{T{TZLY^nDb;oh|P@e$T0M@PdOQ6*SnViL1!CJxsq%+p8 zf%7B)?pP)T_8so%*Arl*7h&n(j*Czrlkhy($#xOzl~bT2<-7;Zq{1-)L3=F_&^&ty zO2FZev(B{Z7;7TXuwH;oAt4pCSAo@az5qK3Fcb`JBY+X;(%C;B0#LsOdqza>V(b&( z%X!dU_k@PvW>#zoz$EfbfV)tAF)3%RKCx=V_vIjtxj+d3kyH7s$WwYUVfa z_pY`^%K}$ny{x4uB9IoetY~X61wc)7)rMIxdjtU3@M-De4FJr@r9f)t$0Ct)Qqq^e z#LM59F$$*syb%E_DP~FnG+P3Q0XDE1p!(AX8P%M4TKt_P$CVa=QQfE*PgKzwIQ)j; ztB<^84WpSUfvFR~^y%)iZq%&M8lW0(_#pkPQ^}3M$|WgDn&+u98;fxwNVG71LN ziYSDClpJ@XV!=s~-eZ6qH^HP?2hA+P;M!M1gXJmUe)oi4M!49~}Ve)9ntN5r`NJE*_)3 zUvkbO0@cg!!C!hA0ND{kM}vq1w%M2^{7u6b2|s|)x(^HZLG{@&i~vjmae+TNU>Lo#`Br#C-u!#X#vc08ZzK+*}W$056cVq2R2*p@)AjAW+7L_s(qwq5YxXzDTORXjjl-$B!4g?G?LC?*26O|7G6fytp0x8DZ0pJRNuO}4pg!1M6 zlW*`v|7Sr-T@65fEqG+b*I#`ou(T9a89e#Q+fRmtCtH3(!CC;r&-%P_hid`&`0JCO za}?a?+&|v!g_P0}I15VG=K%-9N{$7h09CV>0vMPpR#35m`HHmy3|6V}MXTbdu@b;Q z$&FeK)T*n2fP?Ewqd=AU66QIxsIiG3@blO9Klq0;Jf4b{YXATM07*qoM6N<$f?9fL AHUIzs literal 0 HcmV?d00001 diff --git a/images/shiny/Crawdaunt.png b/images/shiny/Crawdaunt.png new file mode 100644 index 0000000000000000000000000000000000000000..b0c84b8fe6928b9a6649dd3db2307f3dbeed121e GIT binary patch literal 903 zcmV;219<$2P)BZG5ncHHX=^OB_onHS#N< zmOZHMnRdsv20RqSJ=2k27IaGW39zk#DDP$FC9E4tsj~yvSvIs%qD1BsEDOd@Fa_%d z6c0g30ib0A;@*e~Adm*F3P5&43icgZtboWHQ7YK;`+?;OqPYa0*N?gBSv0NuU%EC&B_FsU-o@fb;BzfE_Fg7=oKDSQgynnQymYAOYxIfx6%> zol)R+gLMQqquv*^`yTnPF8Im{?r!f-L%5~j>*)Ec;3;^&LOX6X^2gCTG^K%o-WJ5Y zk2rP#ERf#cRA{#&xphOURgrfmLhu&t2t#y;e8mvhf*|IQEm|D{$^fYII;mvC*$pF~ zh$KvMcavVlnE>sqt;bs(fFxud*wcB?N^xVLSjICh4T0Rfgy5N>$8$Ud-nv1Gyb&P) zd%nyH&-0f6J@3?bfY2;Z9u@Gzp{zIagtK*l5h)nX&LtqFZ~1|liIilLb%-etQ{b1t zOh5A$xH>SC1;kZgVk!7$pj~&5;SM`-=>vD?LqI}`acmRVz(r^XL{c3NWUiS{0fqwK z1;hp+A$4}DroiA%3nCau{}&LnID_D9Vm*`Wg3MFQJTZ_S1{ufAw;^a}H|U<65^4pE z@kxZd9JmBvwz=}r9jy&RYiI6Abi@E8XW4C%->!J(w|2H99)v2;hQUbu{-S6tte($_d=>2x!zZ!8s>=s>pLGss=I_yI@uznCPdWM*3`;?`E?$1uW!M;fWv_lYp#4 zQ2>U(MAUek?XiX=VEY}FxmpNG=!`Xnm|lehC=X8sBTqns5Qy0Fb-(3Mjy*F#bG1*f z!C3V8-NEFQz>UB*`zw>VO(y!YATOTlY#ewAvVs!q_+4Pc%X7f7?+Bh%z|T{>1XsB= dfWP-I{XdkYAF4MYhcf^G002ovPDHLkV1hEcoS*;z literal 0 HcmV?d00001 diff --git a/images/shiny/Crobat.png b/images/shiny/Crobat.png new file mode 100644 index 0000000000000000000000000000000000000000..06798cc37d4467d997f5e507b390d08327d82ad0 GIT binary patch literal 668 zcmV;N0%QG&P)_|O2@fRLG)nTWU`%$WdYW@eyBXh?_vC{O?p5D>OiP5J-;00DGTPE!Ct z=GbNc00JOML_t(|+Qrq;V%jheL{ZQ%Z93Nc|L?Zax-4leOTiD>=iI}}3i$S&L;6ZC z0=}60QeNx(ea{2aP|p21)Kw} zRRIhHp7q)R9|9qG0@T`9@a<@Y5C&~r!Wqy7K*xPi2iWeQ$^k5|kbwFfCa}5!3toY( zjsb%{S^(}q4PYCeVT&`6`h5QkAo}47{d`d0`Be}S7~~-YKsTV!xd0M~d<5hfUIhUO zL_YxB9)qA>73_itKmkNQ6x?n?5i&kjBGES}pf|9gO021I97uks6I$=Rzx&Knu{2C#Vig@oWkz6OFC=&>El@Jer zPJq-xkIw)D2m#bW?|%UK?`k}Mh2^iH{$C&j%mf0Czsz1vU?#*NQ(*K7bV0*j<;jaN z(I;^J7??m@yz*t1Dxi}En1SrfcT{cy2Lb~aPxG2Uj}}<@SMwP_Ql1JL07M5C1bWbe zvON_v1k_tE9AW@)nohq4*8u7gAoz9-pe_Pm>VE^j&?H66U9d+00000;sdHA)VZ<(cdk~sxA9&cuG z{Vr0r$43r9emwpS!`}b;I20nSJsyt|)SNs3k*^74R-aSyBZe9ajJV002ovPDHLkV1m2=KDqz^ literal 0 HcmV?d00001 diff --git a/images/shiny/Deoxys.png b/images/shiny/Deoxys.png new file mode 100644 index 0000000000000000000000000000000000000000..061cf404326d88ff8a53accdcc795df45bad8383 GIT binary patch literal 743 zcmV?P)-cyMrNIAB9@P0n*krDuKYJ(;VWGh zaNn1T;r8iOTj7oj5$Id>-UNtrKMQ6C%m!4o2Q0}RCKuq5ek(`=Qw1;sk6)xgb+(WR zECJ_(W;sYR!ZJZFNPN45$v~ld`fhCk$TA7v>dhxn?!e}=+y*7LPVEcs_vv!Ua$9yFl>D% z1$)5BUlo= zzGjMs{?m4T)swyl3@{d8_Y15SNxC<`7r47-Yr#+;f*Qzv1~(%0N*qrwO(B5l3!C2u z>_qym>OqzrlUe|ud@_A8oCkE+{u-PYZ&f@$0t`R-9WwnN0(}C+GQd(GCqD^K{~}-j zo>?GT;L1-(mg|5BkUq??2F9@TjhO*pv`jGl;eai0eW;mZ6cYhhiZtuKnbg9}+gSyc zRKFLd0xlp^XCY<_kX#_xJ|OnOOu&zaqZcL?91ri;!SO&&I2;a)2TBI?5P(%Uc@t*+ z^G(>-H=Q13kh%b?-)z)3qnF}7HbJ=gBw*R2YWPF{UikdXNbcW-q^kN@0H@!e_aX)^ zp$)h!Br^l<2Uxx+z^)FaU^Gz&TonXnV*!*aNRh`t0e!&r2)QUs+%5nk3s}Aa{P+Kr Z{{|0KAEo+3rNICI002ovPDHLkV1lFoLQntz literal 0 HcmV?d00001 diff --git a/images/shiny/Dodrio.png b/images/shiny/Dodrio.png new file mode 100644 index 0000000000000000000000000000000000000000..0f0f5ad4c1cbb71db91bc7327ae062252ebb9aab GIT binary patch literal 972 zcmV;-12g=IP)iQ&8vF z5=zRyjJtn_R}q#!2_KQ(*?+;E{1f~T(27mGiu3>3eV^w8+O(M>a2K9a87`b;fuc1u zRn$|yJXrR0#?l#h$>XslFTsBn^n;3-GGc>ophDz?Pi$SGuMd+S!L})a2TuRAzOM2T ztO}X}E-;=8nER18wPA>u0d^wDw)MHO91SaG!JmbR=K2c$&Ol=)kF6R|uxiQUlpkr(p_q1&3hp_n+N> zB^Y5CYzQbhGr>1aCv+zGNS47ldqXhzmIeSG9TR{e(D^m?CgwOJ_$(s@+6K+OW(T!~ z01!~dZh#H2rYsf4$%lc**$sn1M0{}1r+{9EEiD?~a|sxHB=~GHNlji2}h-i~s-t0d!JMQvg8b*k%9#0su)w zK~#9!?Uy@_>p%d%{eh1HOFG9)ilM3~yd6Xpk8?bdh!wTG&B_B)Q8)!tM|zmmFLz>VV`uU*Qb} zYZMgQzBz#M1BuoE#C_l5@bO0M9 zErkL#17X*MKzDCvojXZMvlxsU3AGq%mM`z%niQg4K#F5zbcQfWt^4xDfL#$aW`Jve zt6w?-F5LSaOE$5=eR=>^z!|p!2#^76+lEgd)&%j&-^VC}h2cQb3{cJGf^7c)4cP%k z+Z3V8f0F_Gz+-_B;`GJ17_jg4^+iBmuKga6uyf(8QzYXeka_aKDYYzd0$l}QUl^R| zqhEg&D`6+Vg?IqFqF`qt_$7M4Q-a_JMAh>Guo}Uzs5b>86u>l5`KB<&;r()niuRHsJ*XV^A@ZNe-D)ZoqvKI5MbO{BU}Ig N002ovPDHLkV1gn$AXxwa literal 0 HcmV?d00001 diff --git a/images/shiny/Donphan.png b/images/shiny/Donphan.png new file mode 100644 index 0000000000000000000000000000000000000000..97861f16a01f97fbf849631a13536d047bf9a4f2 GIT binary patch literal 808 zcmV+@1K0eCP))y)e&mgT z%*#RYl_#G8=R9fbghM*U5Jdi0Lni3uhTatubb+|%Ss8}toIomo&_6j6g6k$X+(4T^0m2(8il&E`t1FlN2 zVFZm-MRx84K<~lu1}``axDza@R|3^ca?iLE=(4zigTM$~HZDurb|`LofW;M~fPi~9 zH{dD{?E+2pZo(-LV-s*&8fhbd_kwOng|whhNIu<=LVybaI2uy2z6nBMn>=i(<~KA{ zM+pW&pc@WB%rV>at8Nu~JUg>sL~UFI#`dVP=UK@Z@;`>zTyPGe3*st^FthmyKk0&r zz6upSL!bcHLs0F+fO0laI&2G^K>+J2O&}tZfW}!+hEdEp@?2LE8KipyodlN#syGf@oAF6E mD5*6MKK=t%zJG|mbbbS(DMR3DKY0BB0000hCn9!K8c$t}IuyC+=m|$>la9C(Sa7cJFGcynn5Wo>Gp zw(&T!RlJl^rOjZEML1YoV7b)Ld}fumr;|ZBJh{dNSm+b$g%msx@y( zLk5a>fl3fBJnRm40VEJF!OW9<2VTR8r{*wt2{7>to8!?)j0TX?9K?s<1(g7)-s)p; z;J)wOP<8Bl2woCQDQF1=>G&{2L2SGPxX=b1k(?1ZYi2u%J z4e;Fr3X3H;9DEf>;V>nr6dNFcX0ci4*D0q2AH!9kFaltY2FL&hS#Aaiu0d*9};3P=yaQrwj zQp7F6M<5O=KmsPS3}8Wg2Uyccb=(BhI@yL{tiQpp!?3D_vtS7YxJf|wHG!Xl2>RMW z2^K@m#z`;?{xcpLbOfHcb>8uMm13f%p@6HUk9{54Jap2fRWp zf`*^nfk(Vb02i|3{TEuuXa78UNHjVsi32zMfeem2PYVCua)bW>-b-LI4XVmu00000 LNkvXXu0mjfUIDJn literal 0 HcmV?d00001 diff --git a/images/shiny/Dusclops.png b/images/shiny/Dusclops.png new file mode 100644 index 0000000000000000000000000000000000000000..58be9e9b6a3967132931c60ebf98335feecf2e24 GIT binary patch literal 677 zcmV;W0$TlvP)Q`?U>w@R=Ih&XmUlX8F zN_m!2QhwW8m<9Wu0R8V^Y`WT=TN{vGS4cjbox=A0O66(n_0kkHZyA?5oh@^Bpb*^hNeNR{Fa7{9~UqNjC`P_rZKTiPD|#G0cFXn%$(_LB6AVB zo)Agu#%}?!T?grpdvKZk9>})@OhePc!FGcPB@x?Ah{eyJ$A8B!*tH_igP)I)vXdO9Fz~R6_-x{FozQT$%b|p~U-+hs0cO8cL0;)*xUVuyo zh!~e!p+YiDV2ssI3AYJAGwMXZ{U3!`bk<)MFE}Me<)?mh|EZ8tiY8M7RJa97D?mRT zzzZoo7D@u5ej2dKc9AzyiZWPkT0ep1N-NO3a6bnDz6~(N?yHEtC=|t@5VQwuT}9Xe zunx$kDk?Gz(T>>%?Hfc6@WAL9rHWzBY0qA93W#{`YWvd z3YnNHSlsqNeE=vF4~!P!x{0cq8tlF*$dT_bw-KDp?|6cg!5c7d0qPU1sLFdk=Ve(` zC8v}{U%>DV$&59S{R!ojKUf1 M07*qoM6N<$f(&usuK)l5 literal 0 HcmV?d00001 diff --git a/images/shiny/Dustox.png b/images/shiny/Dustox.png new file mode 100644 index 0000000000000000000000000000000000000000..ee63a6f60afb4426799e4577a0d09cd4bd92520e GIT binary patch literal 621 zcmV-z0+RiSP)FyO$@$iOh*s94aDz_^f5sCZbgXprzwFu+hSkYGSqNJtnM7+1X(!~g&Q0d!JM zQvg8b*k%9#0q#jeK~#9!?Uuoo+aL@8i{n5rjQ;;~E5u@At8LaVucytNyoVVH$YFnd z`0#&O*EjuT;jI8~2G9*wu1Ze=X;~82mu7B|(t0_dF#L9em8-{2De=7kfDfeo?MSQA zYo1zpD4YW-Ss~}FF=geCb`2r;fI^>|Z?_xv&0p+)1lrViQ%1nsr+_~Mu@xdI0nR=K z9MA$*urJu{`;n@M^A(6akRj(7dA3t3rKEFU4(Ns03o$GD#cr2@{_!{j9?Ct0aKGyZ zu@~Y1)5q-Rz+9je!WYCH>^t-2Tj;A(zY}0tI0cINJ#cuUafWT%n0~Db?JBTW@*b#lWd_oIhQ|oF!o39;N9Y0E zC5$(40egwO(gUmt8Q^#e^H<~x5CT>}Vpr7y+zn{J70^?KUSlQkfvFlHkn(|2HnK6Erh4wq1?MW*iyEg%$3&$;C&MTYO^ z`?o;MA~#y@>~nB@!In@3pcK?Ef<6B$e-xx*BPj!_P+#mn0I7}UQ|$awOtgeJ-vhNL z)D+Fk+2ZsU38YVU+rLIkqdqalUunqY<$a{{`KR~8ho8W2OJXgg)azR~00000NkvXX Hu0mjfg^?WS literal 0 HcmV?d00001 diff --git a/images/shiny/Electrike.png b/images/shiny/Electrike.png new file mode 100644 index 0000000000000000000000000000000000000000..df983f2dc2a643442c3b6263d65f0447e128c3e8 GIT binary patch literal 453 zcmV;$0XqJPP)!(dfMW8D0&`0F zQqEG$BNL&IQi7M8)74*ct_2u1@a?cN^mxGiW)}nmm>K%Ix%AMwBAsMMSe6Vc2qV3+ zt~`#X-Sm_QGey1ko8HI{B$)Y12kn0u(}44+WJkKnX> v6%nJtUEtqQ%f1b6+}rPI{--CC$sgbcaXSqj?(VmJ00000NkvXXu0mjfX+^~$ literal 0 HcmV?d00001 diff --git a/images/shiny/Electrode.png b/images/shiny/Electrode.png new file mode 100644 index 0000000000000000000000000000000000000000..d2ecb882242268f71e85a856a2533990a09bc553 GIT binary patch literal 426 zcmV;b0agBqP)j_1*$OJX0D={a*+3KdWdL(8a65u$KN;X>f~(BDPvA!2vB$* zkUgLv2c%cLOdwB3&CuO%LMULyyAVKvg$6mM`}LQ489r6h$GD z>PHQ9b}*t5sDLQd7w7sT5N*E79>4=ie*+^FPlPH6#ZJj58uhI}f{1oEX#gZ>LEH!w z6_KZH0cmGo2x8VzWSE}aI1(;oH-(%MqW)|`cH8t>vaud}i^VVS2Wd?a UesJQ5;82E@#xR{`TfPjc-c+gNVa8OvFFc@%105~v6(bs9T00001 zbW%=J06^y0W&i*Kg-Jv~RCwC8m(iNDHVi}|#zu?<^ZsvJOTr-#k~aO@x!BESbP$b#9lyG80y>-8%XEf5aSdN)CEU6-(u5mypqFNaN!*| zlJiLb>;*XN{PksScO8mn?)f+=VWXry$?2Ag9mJ>kfo~dI(h2Mz003Tm`+r zswSW}+zY7Q3kdFlTDPtCP(bI|1p>VYqJVZmg4Ot*Ltq9k+E2kvke5Y13WWR{UUQE3vd%6` z2w(yWJzoTDf~{4k)%ZG&iwmMc1gZ@FUf_m)irP;rbr&cMhlb!jDjbt$-L}^P&YSu92GqgVg{002ovPDHLkV1hi{ B->Coq literal 0 HcmV?d00001 diff --git a/images/shiny/Feebas.png b/images/shiny/Feebas.png new file mode 100644 index 0000000000000000000000000000000000000000..d81041bf4ca8c835c07fa6118452fc1bda16b021 GIT binary patch literal 488 zcmVP)sIZ`@z~FdbsEClTXlRINa8OWiU_eMHC@8RnI(`5E00DGTPE!Ct z=GbNc00C@CL_t(|+U?dsZo@DPL{Y^Srwlo~|8*-$Xo~LW2t~W_4~%Rw4{{K|X?J(O zAF#PUPhbxi!M6a6%Xfh0djS3c0AK?E96;Lyd<(#z0=5U3^{!^B@10qw7r#O9};sP1!<8EpWg>wvC3X$ugdzJGmx%zDp# zPry+G`bx-k1d(|HoN);d<8dfWOh(Gw*AnUDC1Uz`JV+UYnFON#Gg^WkKY>vZkZc0+ z1xNz!bs(?T38u#SErf`LEZ`u82?T%(KqMeM4$_pGfR_b^*#ej;%}h0bs=$vCDWXQw z77&0V&`L!FKc3VXsd<2P2XWy9@ysQuvuF-DiVp*hp3fl|%{+@dR}H{9im)USaLfkM z99{r?>;Z%sb8i86oS8=nXzo6NjFtl26NnbA77)>5?Uw+Lh*oZWmXU^~_4e~IM(h3l e&wY3I>wN-Mt`?&J^-=Wz0000CuBO2S<8eo|x%yy&Z2ZvEaUAOM(Md}=?nasEE^5WcSH0UVN9SFLQC&OS z?()kRkzse4h<*p+=Dypd6z%fB_vm`FsS-jMh3vlTsrboexIScK6ymPQ_3FpCZSw+} z9zLNSh)4~Mxhw-Wz0yX=5!(EcOWBJB=7n2;dZ1itT(P$HY=L7U~ueLWvpsuhCpKgnuVhImO4WRnj{9B<1)`^190x`dB`)c^l7q)|( zi}(u4p7V$QO!tC>7KqvTD7gL=xKF4q42xLdp${?N1Hi}ixR2LEUx=vdqY=OP_UUOl z3yBr%w?$-J&lg|yI4lu31fdOJREva$g+KXR^%fwhK7fs-IvX~5J%EGz7T_A-4I(U7 z00`fG2_c#90VWcmlP|DSr2r-40| z-SENy^$n>iLqmTvm(}Jc*r^gR3n)?uIuAH;kA4hW#4V6|Ah-u*oh`w93t$yUsd<3T z0@1e+&A$cO8MJ%z7l;xoW%46^k6_+{t5S;Jfv@1cMP}BOt=HxG63K{VG6F3hkE*h^ z*?@ii$qr4lC|pX!Zaat+!sHZ4)C!6p2lv(d*yL=HU>XU$C$IL<2dhnEBvMMKkYV~` s0A+Pj#bQH$o`4Qu_CJ8mfBBF87p%xR8uPO7!~g&Q07*qoM6N<$f}2IKPXGV_ literal 0 HcmV?d00001 diff --git a/images/shiny/Gardevoir.png b/images/shiny/Gardevoir.png new file mode 100644 index 0000000000000000000000000000000000000000..2c025df1c0ae2e6e24c9788b7f7495235d3ab51e GIT binary patch literal 642 zcmV-|0)737P)#0EGEE;qO!;+xF{DH6E=at7=w zaQ`s^3mE0rFk`+(2nEEXB@{RkTsRP57BRD&>uY<1dqOxC@D+01u)QGMZ59h$#Vlqt z3h$S~gnJaRKpxbpnM}mQ{lE^5I`$w!&`)3ywgxH@RiK|n?LRR2Eg(_7iS>Ke+ihF2WTf<3y6uL9Ixif=1GAJFyYeaoK%GpGUZflmEQK zwUk3LmZr2}n#{xP8RjXIXP`Mpp*F#AMz`L=|& zj)IzbVe*dzk;^A8JKpfX>|Y??n0L$7ehUB?TSo$yuRux|$16cfvp)y)vOD8=CWwIN zfZG!|s%D^@FEW4U9rg?wHt=aqzvF=?U?)&d)Wa8i{6w<@fEpI@9USyC*WF(NGVLD* c9ZUbp7n6`BJVueVJ^%m!07*qoM6N<$g07?*KmY&$ literal 0 HcmV?d00001 diff --git a/images/shiny/Geodude.png b/images/shiny/Geodude.png new file mode 100644 index 0000000000000000000000000000000000000000..96d284e6367e7c83d9fc993aa069358dc0092c41 GIT binary patch literal 424 zcmV;Z0ayNsP)^ zFc1Y`FVMMD_AdDWMrE#g=d6|DcV3Zf!)jG=?(dg$3qfA0Zg~R??~?%WWb@23e+{N~ z-&xmBO)ww_(@GF(1EWLMCg@dAT3|+EZS(>}htl{=hG-LGVLi&F5NF>SKgA^)g>=oho%Ipck_aJ5jKXym@ zIJ|mz1~!xEgVv>V2U^1n=oMxAhcOw?i&g+ZjnVB!D6vUm?Rdpf%g%@>JCoBupFCS< zc9I-j^-M&b_9uHGUnw(DBJ6^fM9ks<$x_U&$XLo!fm^>X^mp+(Jx`}+{xLsC8)u-V S2yBx80000&%3kXB$VK3xTHKN(&H%w*+K0H`YL$K{PDY64}u z=JoMV5{AE5X!M+Po+-A#pqdN*p(4iiNnoZkcR^X#)h`MtOEUI%LB#5(3)sr1IYJ{~ z3&Cj!W~Q+Pz{=+WEd;Q98bVT=t@FUgIU1mfc}D%%r~9DBBH9H2(OD2lNYLp$bUa2L z0=72B3j>l(C&9*3W(H!6T|m>Zq8t3YJyO+v2b?1@g|%W7n!Z9|?tz~KwJ?!T6bK$h ztwLSOwpKxBF9f9!vC}4iucbKErFgsOmB+Q9tfi*4qg_x+X-7e%APQU?YU27o1-Ov>_@JDQdEFthi;M0g91Z?pBf8s;naUKyg9^UWANiZ}7)2AS3 zOg9A)GYy^x`E$0H6CFH!KaVBHLv--)oBSfOPteT0@~U)0(0KN@4G`TBKtvc_;7>t~ z5AzSJ!E>VCIH;+TkMidq!<1-Ppr)rEoBQ|T}}W1 literal 0 HcmV?d00001 diff --git a/images/shiny/Glalie.png b/images/shiny/Glalie.png new file mode 100644 index 0000000000000000000000000000000000000000..db019a6e4c36544c494f882a758c5206574bd0df GIT binary patch literal 708 zcmV;#0z3VQP)&se)}Rr;Gh5kZHdv&6rV@23bcqG~ND^>^U;fFMv6MTQI)h?&xUfI`v%~JAP~4|0Ea985M}Xw%IdRWIcfX{s z-+i8+GkdPH*6IP*k3jmz`gtG=d+~r5iZcf2OqO||RHqEgiZJwPAPa!iufPB(O3q$D zLM>muD#{aP8omc6XesHdlJcZG;dkn+;13NS%aPHS?c)Tkt z^h8M4F9X#B?t4Ir4FJ6iK(*e9K<}j3Gl<0e3_z9$xK1KG5mn8CGrLIENr^W?fYe(f zphrMB3xI5mrDUPP%=Ol?Wuf=0!1gHQB&}`RMgn=2rU9)ktQ+OHPbQ7qx~?0^cLL%8 zt}C0AfNgE=%MlPd!t+4wq^w($>b_7`_ctB^gm3485+jIgtX=>q`TPt3porP*5Gp!J ztsXENe@6rs0X3Tiq}~BsSJCmJfoETrbBLP10KM%u@y)78z4tM|1QH%lxd)^d6iENFpr+JYjzFZA0U_lw zU{(yB`^_69Tua{(E^idf3rPnI5`Mtt8j(?;!3zew`TT?;22XT1bAZ&}N6ZOdd9eHl q9b-@A86r9o%fG?o^N+-bU%($J*(*3<5Hf%#Vc`gbRUi$8a%$u;!eOZoSo$$Or$>087)zeM_lrR0_Te9e z!~iv;zYHXD1Y&!Q)F?2s5Q6t%TLw753=B8Lc2U*9f~^8nc%gp;QemJM7QUIGl%_o5 zu;UD5C^0+NwJ`$mL7fZVaR8VC3q6EcKuLqx+>+_9pCj|$kAeZE6*xobJ}}OYg+B^? zHw*L$0GrxK+IRbC- z5kPgElL5C+wBdRI*vZU|TY`p($@Zwu?YI_xxH}sB%#2MW0Uq zR~*#sYM>`j$K>F02@cQ15Cu}V>jfr`0i46F0<{siQ()pHz}J@(mCG!!b{h!6b|1{Z hebD&*_5bl7^A92|8_@3ged_=K002ovPDHLkV1n*k9r*wN literal 0 HcmV?d00001 diff --git a/images/shiny/Golbat.png b/images/shiny/Golbat.png new file mode 100644 index 0000000000000000000000000000000000000000..e86f89f2257d5636e743a96f8c74b6186a6ed9ab GIT binary patch literal 664 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 literal 0 HcmV?d00001 diff --git a/images/shiny/Groudon.png b/images/shiny/Groudon.png new file mode 100644 index 0000000000000000000000000000000000000000..30a03aad827bad847cc015fe875f40e58d7532ab GIT binary patch literal 1113 zcmV-f1g86mP)H z0WBpdvi(D7JT`pn??~8*#LxX5qN(7sKobad#a;@5j|Px}@C)~y#NbzcLBa0+ETHUr z!_NbP0@3gr2VM|Q{K8kr)Md^v5(Iwarvi!jNqUAwgk`W(z@Pa^UOwP5311OUk={!&0ei2%R9zWomBoM5eB5xy%ZS`2`> zg9TvkowUvxv#{{}2u*hv-FKw0JJ$O-K`U&u6Z0Lcgd>$>%3AP);7FxMw6MTAnk zfW&nvZ-F7FuvCQRBRCNl_~Hgr!@TZ=kZbMqKzFtF>KW*82_OP{!@N{^8{s&PO3pwX zt@!|1C?a?lP^xm!&9DNiK?o)7BD@8ZmoFaZP6TN61)9itl6VZL6e{PzQ~dA!7=$lF zW)TtJ#?#h&K#P&aRCSHRrA0^F_%dR7@g3aDT{NSuMeE6^|h3=C-Dr<|J)Pzp(< z85@E)ni;Tk9JJTF$HHe1-vdo3BcL8Ag>53DTmgS}*w-D*K+b3&N&(eq)o*qNXdVc9 z9sXgPghe~PJ^5|FcVfkmGd>jk?=zGW=!CLY<3ROI0KFaO@z_wTTjFH zhJ_!*9hjZF(1Gx~-vYU|Kv4Zuwi)n?+$MH7)6Y300^Q8y6(~A|o=^XH>9kXS`5kn> zvy>~KYSSR|!OI8Fz^NbZ`*ibdGS87_WCZ36TU`Ma5f8Xz=6XNKT3s)t@MN9ADx47q z`|g1SgF5I8M#2Wy8N65nq*1UMcD?AG7PGM^V+-dQ+=0Xd^-t!%m$VO&B?77p{SMBL z9<$yr*`bZJ2MkIP(ro(oKrnn;%z&38PNmtkgEv6;m7&#mSin-kj{tb>;2ly`$<|k4 z!m^+$A9m0I9jMwg?*)qhhyDN>l|)nWj|QpkYfOmV9|KfEmDB+Tb`?z37{AzUdjb)d zOB5GM&&JB<0X(l}q^!WgZKDnh literal 0 HcmV?d00001 diff --git a/images/shiny/Grovyle.png b/images/shiny/Grovyle.png new file mode 100644 index 0000000000000000000000000000000000000000..e29af3f81931ebcb73cb38f247aeb6e11eaed95c GIT binary patch literal 855 zcmV-d1E~CoP)o5=mP}gKbGTE8`|J+;ey0w}#x+%Oe5(1U%(Kxn| zD1Z4u82S0|wnS8}#@$OMhd-XL)#B-#&hT^|Ai1A6)1`5DN38~M<3J<;;+U4shRv)R zTC_b0m=S=^rZYqoHSk;CUj(-n=6olcsgrqB%kWE8Uw1(d0kwiaBbUg#6QFDv1Tx$* zO`u3X0YonnRUKP(=-Dr z)b@Cg256&-5;+Q*Ua|sgA3q+H{v3f)GZpfLJm4JRrItM1q(@5c7;1C1{-R|7Fe!fYkt~g+;B-wF*U33YNfg zGm_Ai3MrVyd`Y1bQn^&&c3bDZ{8Gd$aXopig2??$;S(T)MnEBmd66$hw@BQKN*e0CNIaz({xsIw#zH{A}nI0${E36pHwsaIe+;S->zq z0FbNzyD*3s1C>Ur96+zIg0&I^yS8wnia3BmU)PnS7#$==4#JkeqSza0$Y^niJ3(&>w6Fbrb3_JELg@K{I%2^x&ba?&O!vHjPP#*)%tdPVH0600O^!XY* h3j8M0-@m*k`3Hp%K}$_6=4Jo@002ovPDHLkV1ibSdlLWv literal 0 HcmV?d00001 diff --git a/images/shiny/Grumpig.png b/images/shiny/Grumpig.png new file mode 100644 index 0000000000000000000000000000000000000000..07030f54203f48365c1297c76d2671d9a939f357 GIT binary patch literal 731 zcmV<10wn#3P)A8KtU8L zoJ^8jb?>pv05wvIVJ9*}a(3SQ`9O+An_mNJ{#ya_ZyB+{ZGaWad>}?GN1*!_m@RPC zfOrn9Zv}#C97tAgf%yV!U%&`h!OaG!Euh29s?G{J8{pFdQc6Tp3(o2M03pOq!tK@y z`i_4D_|^i1$}$P9+qQZijT>NoW3r%r+gV)=5ODY;0!;YDZ#Ch!)e1}}T`Pi1zqr+H zn_Fvu&%SoxDldFhwP(8rPPWLsAX~*hOGu0&E#ci^=Tgb{1lookCMZUZEH;G$x?ct| z0{-C;#34j0?10VBsyYgN3G0*dl2Qm1Mu3^r4&za{pKIs*;}L*Ffh>@L6eBYQBb%H} zS8==e{6qq<5B8136xae{b_1*L1^a$QiWZif5_H!g@S}h$-$<$Y z{TZW0W&=fg0@yvxeG^u=T7vnvg4h8-?LoFe58&c1D&hgD={+DV;4TiUo&rqL{T;Z= z6=Y^04`16`(h)HK1xl=%so!-X(QJCBy1+6K$YizwHAdhHlp<=7@kL-XWZpNVw88-I z1#}#-QvoTGm_LE;JO3*IFhwg&1#nocfl9If+XV9kLjdefVophHf+--~7r7e=VqlpB zfDB{&gk_#1Fu+^B=G+ROVQW__;A20;sDjT2NP$_gd<=Ge|Hu9ae*nRMH*s$9GuHqB N002ovPDHLkV1m3*L#6-# literal 0 HcmV?d00001 diff --git a/images/shiny/Gulpin.png b/images/shiny/Gulpin.png new file mode 100644 index 0000000000000000000000000000000000000000..f946e94c6d77b8b1c851edfd91d9a456be47aad7 GIT binary patch literal 371 zcmV-(0gV2MP)eDR(l~HhiIQ^2p-Ki{*cOY$1J2{nl>U0X zCIX=cn)J`{`NQ7#ePV#HXZ*AJQ-M?4ILDMu@;ph7+OP@+8bArG;*cKtR?58qjrhgJ z3NZWd&7Tx#LDh#wfOT-kTiF4+JPAPkK(YV}A7DtrK!6soUZI+RKMM4Z@K!be(m#Di zK7i6&V{Q**Jpt}M-~g0Z0sShFjSZR+$OKRdWOuHG$c(80Sc=K5h4H!Ea{+|_d6RG< z5I_Kwz7_-s@F3&>RTh59BsSrOE}Gx%J0ki}(N7`qk6Gn3YFUr0#bWUf_yI|H4BvM# RsJ;LI002ovPDHLkV1mYMpXmSq literal 0 HcmV?d00001 diff --git a/images/shiny/Gyarados.png b/images/shiny/Gyarados.png new file mode 100644 index 0000000000000000000000000000000000000000..986f788cc80da7693465b45997d138807c700c39 GIT binary patch literal 1048 zcmV+z1n2vSP)Dz}VpM_+U89Gc%AN0LaLI`1p`$Xju68_y7O^;?QI`00001 zbW%=J06^y0W&i*KmPtfGRCwC$)Z2~}F$@IIl#@xeCztyFza_Sl?q;Q7hvAhHQW`CF zuq{FOy8z*zf}X<}e9|AeY$A7j(w_nla>$SIDS(JP@*}?mJRaYHQXnV_^*4aW;LTED z_TvQd81MD(z%Zd3(C3Tr29R$+(QiP34j{bKFPXRB_&3DcZv(!+PxGJ(F}@F2Nx$qH z>LI0w9|iwAXQ}sL07lNp2DJF&41RM3N*{&5qm+`f^@B8tGyDPQV>|$qTryL7c;6=% zq$EEs!7+5uQVNp+Aot{GNUui_EC5lEb1noDfT(c+5??PN`#e}crmXhW!i4Z*2{-`l zQ|lCoQ3cU}YX=>MF9Do=h}gUk58=L~?^nQnMaxO&=hc@J5W5juOTZm)SfB@*{R9yv zo_*N@bsq&F$-Z_>(;qsZ3#62|`WJv2wWmKwE?mGqt{{5f1nXabpv5R5=#!%G0wNtK z5Fm;J_w&y#ZJUk7yo?1`go;dROkYxN!CZve+AI{Rb^xk3W>x^mgAHgLpaP;%z|N&1`wSqmfOP}l1o{NHffbe+fV3;v3Mxz-Sb%6B z4m|Y;7eKPC^blx(3)%w^)uI8`?|dG|@m#=ekD1vI_Ynm1p+KquKEUiBUtd$0Ko?=2 z86E}=F97<`U+xX+;MdFoSTuR}m(ZH_0drU@^w}q@<8YwYN(Wr%VW;~Ccb>6ceJo#+7uZ{^KGX(Gv$p?>2P5&~9b7+wYvb{x19fSrO2e**BLZ|S7f|13Zs?SB@C2jSyD6aMFa-pemMfHZK? S8Ee7-0000u*to#(xKOy5pvZ_g_*h7oXn@F2KxSr{m{34)P*^iFW*8V4=X7Ht=TH~W0v8?A;nh>Y5CBvv zWTLu1l=+MK5w(C8&;lKZeJn7ey;B;xKrLik1iXnQ1xx|aNbRa4;vvuzJ+J_1FG8=h$3h0FPN=>DB?`>`VF?3(+UhsJ%;i$!TR#HX z*o+KJM+GdmzF-MM^_fRMas>Jv<0I^TqE9yH$3Wl`nA}e*|L|Y&KlV#kNZ9it*8l(j M07*qoM6N<$f=Nb>=Kufz literal 0 HcmV?d00001 diff --git a/images/shiny/Heracross.png b/images/shiny/Heracross.png new file mode 100644 index 0000000000000000000000000000000000000000..159874d07f7c62287f43b3b0115f4503b5ef3dbd GIT binary patch literal 754 zcmV8we zI|DF0EO`dNZvlp}@-qOMaU-1s7}M|2snVGn$?%^8(A>?!AAmDL0Nn8fpq;;oX8?52 zT#^8t1CZGQ(m4S61Iyh{i`fJKo6Z3sdN1c^41lc^VD^K9X0DH>i9JI28^9sX1EK;N z(Fq3whDkz(@3%l^1WCX&fh2yY*3DA9K?v!iR??UU5JHL{5b#JKQkn?AtsonObzP?- zkiOJql!6?9wUo;`5rO8cr4wLlQ3qU#euWUJcm7%ymU_)^0YC=$l`d+2GpCek_mc{G zDHXf}a@Pb5znOy}bN7S|yU|$+A$5SQ7a|Pndf5V)yWD-WI6$U9zLTs(_qVk4oCFCW zH4kG&v-AV(Wd{u425>f{i$L19Pb&OWV5O0mfcaJ^dINa=23-L|IKppcLF8i-xOYHX z(wnd;H;h8E`8_jnBj65T0>ISp14IWz#xY~f4j6L$!VWb9k)k9a0ZAwe;w3QD+tB;P z=J*E)K%Rm`mjZB&j;W;*(Bn1sOMo$dMjHSy0iAFR z$jveWumO4mXa*2Y8d6D+d>-Jv?qDhhLGG9X002izhe)YUJ~VZU64aNePG%1E)FJph z8)pFEi=CX5phJK5pPnY0sKZhU!~g1NgpT~RzB(z%QtMm5wbshlrDDDDukUC1eW9fi k&y;T@1>j4>fAtUfA2#7HN@2>q#Q*>R07*qoM6N<$g0AjPq5uE@ literal 0 HcmV?d00001 diff --git a/images/shiny/Horsea.png b/images/shiny/Horsea.png new file mode 100644 index 0000000000000000000000000000000000000000..a6a3a9b338a54794d80a089a13f77a0631d30f14 GIT binary patch literal 439 zcmV;o0Z9IdP)D1g(AkZ0HmFj4C6Z0z@pwG8kbnC>t2P6m zB9!Kyjy(cIBq~_p*hSS^F%V#EQ%xA|`#6@6l<*Oty8N*k$O({p5{bx^9E$|Kh>ovu zk~{OnEAZ-=0ZOsueV$o3&$9>EDK-P10r$Y9?EpRkBCuN!I-YM1GQjl&DODs+jYE9E%03&M48lYQUXQFaUVZ>jH(E(@Dl zCt&VdYuodqlp+8*&xk{|miJ?J1=^9CYUkyBEBWvVlwUJHzU z3j-*nwDCB^ip4;9+`NSeAooQOM39apZu8w|fgFL(%)lbs^WY@X9Dz-DVxEdG*y1F| hmpnZmN{`3C_5=985bHrej3fX6002ovPDHLkV1kqa#@zq_ literal 0 HcmV?d00001 diff --git a/images/shiny/Huntail.png b/images/shiny/Huntail.png new file mode 100644 index 0000000000000000000000000000000000000000..7b32ba45d97bf3a5087524259f45a261471168f7 GIT binary patch literal 724 zcmV;_0xSKAP)K`fRJ#&aNw8#$Z(LLfRLbYKsb<4kT_T%XgB}>05B#)l>h($0d!JM zQvg8b*k%9#0#!*wK~#9!?U%vM+CU5j*Ur`^HvZoKaf`E7AQCB?pFe;9I|cS%@C(JMhzjnYAQ5;wP%9s-+(y;ujL7nkELwAg=g@4@8(n{8FH70Qtg1 z>>hE!FT1sdJ>U{^KAUcOORB(iW-@TR81T}kKnBnbAX1+sj2Z1nOzZ+nT5H}rGcG?2 zW}KL1Kp5GZeH=^Igc;~r$lhz=^Y^BO@hET=W-wN*LcVT=?py^k`xwweK#{j`OW3$K z(}nUIf`}zaeX3xpRRPAvVHvn*0BAD}eYp?_DFEvd9}+P@OO6e&qIYrpN%x+JM6?3{ zz^W>}OZ-8XJ`i~wb?j}c!1)Lv(hG5SLFt;NK_7Sp&V1Q@W^+gFt|EQuB92qP3L;FT zRXFI9amRa~SrTT>07%{AIe=GQP6JHDk}46qj(`V@hn@Y@MLpj7u0&b^b<PHq}&pL;9f3yDn(&173!fT7FG0q7^`U5B!xtc=_&JYA%6x!iw1K0Pyr( zN1*i601;9|fM^|oDpcUpFTz4g5D`|Q1r;b%KiD-w+!tDbZ9#ZZqfdbQ{k{NL7bL!e z)TaUoiV8$++}QwdyWOy@@gx8C1nFbmZ`k}_gAoYDl>yc}(k*U~3|#SP_t#uP38ZR59s?WMRFH0Vt4u=#_x<2o%wK`O^UlIpSejfhmkF z!gr!{wKg4K&IUG&lN#Vs0nej4p2r>>j|^yE0N|haBl{caxGk>5g@2;}0000t<7{{sjvy!f!R{A z4HgkIBn-|lFlYoY%w%8?5D@sdtLq6+F=I)PUoeBivm0qZ&NWXL$B>F!Z?Ac09WfAa z4gCJw!|QGR!G+#(GtR7H;^p1-xqQM#-d%pnFTb4Z`R~45K>P%rhKu)_*%nCTK9F_Y z#a>Y$ytjSA_n16JBL(fwj5nMPM`RaoZci*_&0%o!H@L=>v6wSsuhWTZK|g&@MHDi> z7Ik)YV0adlz%-FTTYj-;0$0a{=vka0eF83K^$ch3TyHoX{ou&CJjU~Gq7_^zT>H2> zRmxOec0A(G{P*_Wch=*fr(ek@n9n;@5c5>Wu()OEt^}h^Hh$a{J(E_NJ&NH0y43tD ZceOv;8;%*L<-`b z*jDCYzCL{TakTb-FSd=Nf@S-yz(vHDby%=2YZw4YDair+dNyMKQqT=?{>E{^wytaI z;Z9rE4g8uiG)VyT0Km3w5E(b1MFN^nRBOa#+<=sTt>)k|=xOjlK@8t(zR>{VB_O7! z&%B6g9WNmSRYh(AAm}AvD32%r0^|;sMWF5&>;V!5K$fK&bk_yyhZUm&k*bPC_dY=G zOVudLCj?MkcIwH#S9M8pR!|RK1TNw!LF>M&R_(Z)fH~(^0R$-wo$hc*Kn=k_4~IZ% z51Z<3099Y|^}xd*r$FnKCmjIw;6)H6_S3xHO;pmIqba=iE*36W$xrY|0St zhoIBr^S=f@xBW8C8Tj0G;|%2Adw%|JeE1i?0Qa6HUDoznyZ`_I07*qoM6N<$f?Ad| AhyVZp literal 0 HcmV?d00001 diff --git a/images/shiny/Jigglypuff.png b/images/shiny/Jigglypuff.png new file mode 100644 index 0000000000000000000000000000000000000000..91c73eae4603e96dac63231171f48db0fd7489ad GIT binary patch literal 437 zcmV;m0ZRUfP)|Yq00DGTPE!Ct z=GbNc00B8kL_t(|+U?f6j)O1|g<+q|V3G~*|GMj#QIN9DK)ZaEQ=DG`xuD%{xBrMz zDi&zAr_`mh&J4Lp`5 z3*bCwLA8CbzekGzc6?8HK#$#$gI>*p(=Rw?i({N!GxeUj`*xmVa6$~SR1=7UTs0~PWY z4J6g7^tCo8v@+4h-iC8uC(_6B6S=>V$bit!lEh&TKo|C;Fy!AqOUKm#&@Kf`p00000NkvXXu0mjffe*my literal 0 HcmV?d00001 diff --git a/images/shiny/Jirachi.png b/images/shiny/Jirachi.png new file mode 100644 index 0000000000000000000000000000000000000000..7deea6321ceb7e4a802c56e9f9cebf87f15a95ff GIT binary patch literal 561 zcmV-10?z%3P)v5QJgl-PsIg-v4=PW7GIjAc=a*cj%$={3Vr>7Zna?2yMf1JTddLh0qgW>0D3R*d12jbp!9Ns+d2ifN8SzqwCbe>xK&eN z;LQYA_Idl^6%EjF;AQ~fx$;IY2Mm?MccGLB#W+x%2CC!omC_PL zUF4GPQO+KfSK&k6Dcurz=N=&Qw2yR)#@qvD#=486QEnEBSEUq~3~g8XZEpfV0o= zoX<%1j2Y4y)Bw|82pH12^9x7f`z8GA>tFl;v+@=@#!b?300000NkvXXu0mjf@lFI7 literal 0 HcmV?d00001 diff --git a/images/shiny/Kadabra.png b/images/shiny/Kadabra.png new file mode 100644 index 0000000000000000000000000000000000000000..d9008f693b0fe242f4d9699469c3f3eddc3fc8a4 GIT binary patch literal 870 zcmV-s1DX7ZP)|eU;yC2P!JFhHaP5as{a3PN8QMe#Gs6`m@|vq700-) zOU=`7zxPc>1@wqtE|(7vBBClO^TPsleSd#ns%L{H@Etg{Hq;N%nP6@4M#}@U$ zyP?L2Ng~YDalWt3N)f5*4r)ze7(b>-47y5hr6O<&FbE-Z$WKGpOa)Br8w>30Slv4=TU|Iph(jG5UK2R+3P|BsNY2 zklbkvWsFto7e~Zu3`RUWj%mQQMZPr5FMi>LfYRl})d1=2UcQAO@>4VH0uo3Ax}lOh z6DS0hf~lybyFreaf_jBBftgw!^E@SY0p(&2p;y3R+U9wNyIC6MSv{Wu>QSJBd}}@D z1P6{Z~aUl-CbSqb45JCfWSatKmY&$GTX1Gcd?^L zGh#7{l=SVN(9>O<`Fyv5U|b~%TDw&MCiX1S+vX}d$x#4e6lB>f$N)(M$r5^NxwWl^ zsb^sqmt!Rx1@b9SP=>xWgu;=MsjA$}M?qGQC6=PIp@+SFEaj^J+e35|S4+;d>Wv|o zYpGQvhvS$_*c+f0$tUp!lf4}n>7yJmLKRVEYpwU?yp!TQ4?7#2r6rO*SX}kH{VK21^NrLZ#jT|4?9~)99^$it3tVT^8Y*a2hQIY^1<}j+X zL3Q;^MRpo-z!KDv#7aZQ3S%Jpu6Hc$do zt8}kG7p4%oR-5AQ2|%(0l1LVRcZN@9yu^sO%Qv~{{A`jpD{NAV6vH7iUO$ILk^(ak z8)a@rU8zFjsDL^N6~R3Xrj0=SJQB^h2^r?U=BJ?r0>EnmqyV0gq%U4CPAAM=37|s_ zO#vDMh=|t{I7a7z4*}UAV=ga3rog8_)`HPj)1$?8_6(CZ3-1CXwJ0z`$T0-*Vc}i{ zNHcp!G`|w$AVk=Qil^iTGwTz!yp0+H{Yt(BPFe}bbgTu*L4yZbMl&dJv!wtU0#sNH zASwBGvz39Mm*C(-Qr~ddS|Df&nCUCs{6bKn4ql2N4}sjwuoQe15Hn|i8%Bk-pbIdg z7KFQVJ%oyHunmWR?iU1&YnuXU2$FYmm~q8R(eGp$L`Gk9TMM*xbQ~rz063X5NYW32 z^B2Lr4OA`eE{O!Bmq(d8@h1bbf>iqe;+5cg0TPEHGY_XCUfhK9jd$ncZJ&mTZ$Ctg zI2YjK@%G$@K&e=MY*pXmv*4(p+u!={0#Sb@5U6kSlhR5c=X2lp{1I3~h?=<4x>5+$ zpl85ohVo_Nnt;ftfyrMn@R@?~B2R}v#b2vX4N|~9OOsz3TCjg+R44)CvY-unR(RXl zJmZUxxFX=5g6G~mLkF)GEDS^N+*y%GHP6M}8VT-?Uhza%fdItPIuk#z9Su+KqO+P9C O0000fL&Su literal 0 HcmV?d00001 diff --git a/images/shiny/Kirlia.png b/images/shiny/Kirlia.png new file mode 100644 index 0000000000000000000000000000000000000000..829d100d3910a4cf7fe241c866373bba6eb0a1e1 GIT binary patch literal 557 zcmV+|0@D47P)rDC@0x0qV3i8%b95L~Xk7_;9npl)XYj#xg+`0xrVLkUuWA z3o{gc6*9rvA4ZT91LQT3U6|WOU<`dfC vVDAOQI^GMQ6Y^$2em7um2MnJVu>XL+Q_dR+nepR*00000NkvXXu0mjfVj}#0 literal 0 HcmV?d00001 diff --git a/images/shiny/Koffing.png b/images/shiny/Koffing.png new file mode 100644 index 0000000000000000000000000000000000000000..3c200a6c33b6a90f57603f361421aab28abff42e GIT binary patch literal 636 zcmV-?0)zdDP)L_t(|+U=LYlBzHeMT1JuZTt5B|L&u&gkdo};;@*Frz%Qmons^^#P;FC zAntxm4-a4XyjboZCjaY;FxVQ19}6DgJpjYvPg+0uOTb_xpg{Z>_c%T@Vz&Nj=A*w2@v0=0EAD{#G8^E|=!l^)! zJs~2>%s2Nrc z6!bxWK^=hS^zJ84cZHGgE%X2lwh@57>+av~Ek3UTG!jl%b0>`m#sJiJy(}Vv{bQkX z!u7n7Qfq*2#HPonm;<2i;hZ2U-)^$g64?CM*ax6Q3Fmw2rt=+R3yVx2(@%T~a4xxX zEr8B9Cg#flF7AJSe&*utoy{aPpmMDv2LrGhopj3>}xpgU*18h~5== z3pfD6nOcepcLZPfT7*yNY6#C*OHVWwEME)G1zOyHg0+H~t*QWYQE_yBE4cqc!L+m5 zjdh8UQ-{!@r%(A-xS$d6LLPqvJWrHMAR?x%(0Fh>k);*C3 z!TX7hufS^f0Cx?F4clv>O;@S{QvKcW6K5NiGXwdwo;Rx~O5)va?b00000 LNkvXXu0mjfq2`9o literal 0 HcmV?d00001 diff --git a/images/shiny/Lairon.png b/images/shiny/Lairon.png new file mode 100644 index 0000000000000000000000000000000000000000..34040df803d5e8a2c392306532f0f97b7fcb6fc8 GIT binary patch literal 736 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 A;s5{u literal 0 HcmV?d00001 diff --git a/images/shiny/Linoone.png b/images/shiny/Linoone.png new file mode 100644 index 0000000000000000000000000000000000000000..58a2a4170e6c9ca9af5187778e820fb89ae21536 GIT binary patch literal 603 zcmV-h0;K(kP)kW9fK%-dT zv`qPiM!we&q@VoAiip|-XEtPoRVsq+X-O-tXr2=elKl>kC^Y1POmFZg{FXVP-Vk%b zK_1nHEI4?K3F=-cNWYFK`E2kpfl;|2GYaVU3et}_v*2a}pS-6ZHx#_5p9@}YAd?T> z_s<0{-XLPu>EO%z#RB02QxCrM^rn8XKn!M>AI_z}diRThGoW&#O*6wY;zuuHhr2nr z=;9n+1N(wcE+&SB>0CU$2DTFhcj+G}NxF9bgDbEvVE40NAudks2_W{KbWXp_w_v}3 zPV(rpE%nH*B%p}Br~9F)FSv%nHr|}{@vU8Q30Uk47XP_H*4JSft(u0N> z5p2P>0|U>!i8JwdHG#;qHu-(uGq|W~_qgR3&m@mmc`8Gje*N;dytU6KBcPJ{PGAw! p1Ev3TQ-}>-4q!-L&&mI@{01NQ8EDliy~F?j002ovPDHLkV1feHA~OI0 literal 0 HcmV?d00001 diff --git a/images/shiny/Lombre.png b/images/shiny/Lombre.png new file mode 100644 index 0000000000000000000000000000000000000000..bcbbcf183b40cb782c97040e373b74792e520877 GIT binary patch literal 569 zcmV-90>=G`P)`A`R{U`w5L9*c7%(@SM!ra-p`2qh2=GODl(*fEs*S{9> zJ_pIb<$sWX888!E_K)!S0W%X3HDe-ReSml9Zf8JLm8*dv9XS0l;PK!n@DG;B;B9QdU6)4#PLn>+=6;VA8Bz-y% z1=ZrI36%5MbOhd^u1}!My&!$UEir-Jj{*4f&%}8&F@S)32z0ogfx_i0z-M5zKoyC= z+JHhh+-HGiz~Tg6uVCM+lZ*k@SqijPb$;-J83ho&mM;ozuOsntA`ZfDt+2J5!kHjn zPDGJzw>lo)?+THa^Zy^w%b|yVm$=#2c%v`S+WQXT&5!UGpd%*2?%EF7*Jp^Kv)nE5Macr^8f$<0d!JM zQvg8b*k%9#0W?WOK~#9!?bgALgdh-vVH9n&E$jUscWIkhHXa7?v`?(0BGDc1ab*|VG+05C8>iR5&f00001 zbW%=J06^y0W&i*J(@8`@RCwC$mr;(}FboB4OAJN%CGY;Xtw>pD8b@`SezpTFuz)dR z($)r>!n)t&LT31ZuQ471_|_gfbU!g6^K&Jbz0g$Zg z%IiYeV*J~n2cT+JQ{pli10w-{51|ht5SLO5Sd1}E0E-8n^ji0lOI#C>QJL-m^rLhS z)nDPguBn!s$A?)1-Jery>Bl%|1J`^6)PgI2O?=!trIc-5iw6wyd7y43*qrg92={aT zB(SFKAP-;$X@27}U?uMP3}9xemOl$fIiwfVKJpl@s;=ohpau~|G6lY00000NkvXXu0mjfWQUI_ literal 0 HcmV?d00001 diff --git a/images/shiny/Ludicolo.png b/images/shiny/Ludicolo.png new file mode 100644 index 0000000000000000000000000000000000000000..ef94922037d15d6d3ed181751db803547a4504c4 GIT binary patch literal 887 zcmV--1Bm>IP)`NXW?8`1tt1fN=1jU{HvFpxD@uz{psbkT7s)AU0|X00001 zbW%=J06^y0W&i*J^+`lQRCwB@m4U9JKnz8#?XUv2_y7NPr?(Jzi{mryQ8I?)96ABR z?IWyz&2C>~&8#*151*)g9q2G%_MJX;08Qize*kqXHt0f#>muu}!V9T@w0lN8v$T&b?-GBV4iOu?Pzu&Koalq8rtQIJ5hv9lRU>kp;9?fo0wth3N3^~!c2MlTg)!sxR=EPa9qI1>?$+aMv9 zj{yrtojHQKO?r+LFY4?>QFc9womd?Zg{htBuLh=~s ze4nMYiBpHGu84$zp}+E8JJR975`V1ju_H3_J^c>4L$_r5=YZP4-w8WU-_iAlucHB? zQvv0bi|(reA_C5@HNchQNeLD`qd%^hF}UeH0)f>4OUk`!B8)7#GO)kfE=KR%`hkCgk=jnE(*v z2o&@`DX?(~2>nkJ=LTp~|2WYj)IGd|k^Mdb`U&+fkO==eKqMLN{xAHkPvKd1l+OSF N002ovPDHLkV1mRsp4b2Y literal 0 HcmV?d00001 diff --git a/images/shiny/Lunatone.png b/images/shiny/Lunatone.png new file mode 100644 index 0000000000000000000000000000000000000000..6bdcf4531bc740e678e9da1d2fd48a6da6280b1a GIT binary patch literal 585 zcmV-P0=E5$P)=4N(%wC8!NF26<+buvXUO4%TTZn417{pT_zR{uuSy;#ivJqm`wH9p#_pPA80>28$ z3&jF09$0*g(9zw3P&aFxo&A7_5LII(;`czrGC)<;!wVYpIgbQG+w=KsmY{F|%sJ=O z69j!uwALC7fV1hT7c$VV|F}Q;46hM1rW^f}(fuF&d5jUjVu6@GC&)c;?}2*{9DuO= zIRLX4xvAk39JrpK4Rp~4{tSTYXMhel{ubsPcpw@9>U$jk8w&}`?;OWmi2%g|OvL~S z5vl=z#J>xX{ecEuAsEYNjc<;=O9){0MSy6WyY2{|X}|XqGl}FE!zUh;QmzMRi93=V z(+6hL#Q+vaJdiZxZn)pMdWUO-Gae|H@34vR87efdJt<7FCiiEVTHhl0|q}H z1pN5Xupk3S{)kA}QD9*p&lhU|RLNKp zZu|HDp|d;3jxSx0rFe^8jK@x*~yuQ^+`C@?>2syLS08mg+I7kSY000mW5I&6U_y7O^0d!JM zQvg8b*k%9#1Aj?GK~#9!&6nYF8zBsYO=>JJS?~KlZch@JyY#qZI{nd|Wa1&(j|Bvo z-2NYdKdmEA$LmiBBx*GhU(A35^qn0rRs+pU$H^;6gH9qm+M&(_NM@w=05iw|;2-`{ zW@VH}kZ0Ht06JE}VSifNzRUf7*A}BCL4xZ`1XSz4i3JY-{ocZVS1YBAl_&rbuuoF@;JioBu&(b#kKsDQXfj zn7kZ#3tM=-q_(*eKoS``0B#_|pOR|_z!u^4dZyauM z!TBzr))ZzN!%WEKqAJX+X&=WHJGcPC`{{ArlysZc_l1T_rNQrM2 z&;7{T8oARdi2xPi471!ry4S*-HO%_qqOJg}wTB<=E~OzQX)b5cf;1yYkYc2l*wtSP zT>$`PqjH{@rqY|3^G;^)m0y;EK0iO-{(i0k&k0g@OEv+W0E{7*ad8!;D%ljE0kDIX z_wjuV*&|Z{z#dSmL2JO60wHDu0J|%40dQNdNIx^emuJZVYl0a9kWz?*OVuo+=;}dA z0K*Z5B5(xowiJWl8F#P0l>RqBmv7=(1p}u#11!Y^Tx}8bEnron0PuDtG5}l#u*(39 z3M>dT7qxVUy%V(DV1QcxStGfup`}&`RRe1czqDFk&QYsQ0G3b5f}af)w-G$wN=jnp sTS@&Kt|rmSKD(Mx^|x~Ozx=2DH_)b2q3&;Yu>b%707*qoM6N<$g0a@M3IG5A literal 0 HcmV?d00001 diff --git a/images/shiny/Machoke.png b/images/shiny/Machoke.png new file mode 100644 index 0000000000000000000000000000000000000000..1c33f7a7bafcbe772db1c21f6d4f12ebec1ddad0 GIT binary patch literal 702 zcmV;v0zv(WP)%#YxPVA-uyB~z5IA`F`1si1sKCfbpr|P5@NjTo00Y(xSpWb40d!JM zQvg8b*k%9#0zXMaK~#9!?bpk0t3VJ0Q0g&Y5{Cc(+?(!!;438zCYvl$EG#eT(3%!T z9{%$Cv#jfn%4>aJmK8Vqby@32{k<-@*$*I$<(9BE06zlI06@G8aa zEMDs~K;8k?`f=H>k3fR9k(bE?c)2c>f;YN2!}%=%0T=tF6k{Iq)8;tO4X`c=aw(?g z2TBOU{0UgR05AY-fK5DRivdUkt^l^%-S=dh%HR^95G zm?R?h0GqCifjs$MA{z98ejfCX`K}_lTbW z&Ni?Cz6)d|$o>MbtuCOk5)Z_L*1ByLr6owOFlq6@wC4xP69~gjf+yM#^0)VU@a1i7M5R7Es65M;3 zGBly>LEHglHDGlCx)@XfXadv#D1qr*U@1k={yT^RFx**VCLd(AgA)TlKraDqkq9a! zKLNch&__So10^1S$BTd>5QYY{umRmQZUCSFo&*HYe>XuHgn}eR=g}l2V(5g3*v|el z05`Q4O7=4#w&uQ^Zl9*3b^xM8dKbg8%>k07*qoM6N<$f`R5GivR!s literal 0 HcmV?d00001 diff --git a/images/shiny/Machop.png b/images/shiny/Machop.png new file mode 100644 index 0000000000000000000000000000000000000000..0c535a392e8073d91e820d3cd6d85ac8c625eaec GIT binary patch literal 488 zcmVP)1x6zYv}(!H-eEuBIUqv-K_)S(#6;_Sf1Xz zc>yxUNOCtm@*L0gxox=@AL}~SZD&k1|+GK=R-5IwR~V3$#yydEzI+5J(dMqwwne$O0YZ@to_x9Gz6a|_`EN03BDGW zpw~|9dB!f#+-;_O5{TOZY$d?)On;gZ8OqTX6tV$O%F>@_NlD}qfu=6iew!lQJe7wc zcM7n@fs*Nlz|xuSLyez8O1P8e7IKgs*_NH_`4Si$aK*)C10^s30+6so8U@rQU;^b4 zx)v8cmw=-Lq=a0FgKQrK_-BYBLUQTjCN3yce^-)gM+xN2pN5MArGWm#1y=JgnSGuH z0^4f;MxbNODna^!oL#|AJFhbjkTmjt3kaatY2~fyx1h5PsSf6MSJFAu^52S;#&t1C e-goRbug5p8AP)EzIc81(0000U_=reo&|pYtFepeU5SUOn5D*ZEuLX<%0004WQchCKd%oHf|-k{QomL*u*TD}CC z2Bo(dL18%rWhcOyN4|O|(-VTwvJ*kiBe#5JYne`Gt#<~3We5h&%myu8o%tUExiz-T zX76M5Y(BVft?ftx+pR#MC4S~nH&nM{B~yY9P|y!SZH;<&4v3Mr0|Sy1XLZdqE$^0q zdK^m%3(4DtYwLoR&3APm04z`#a00Hbhae{eA=zg>5cnXgy-f+k5<)#+7O?70%a-1@ zbl&g5QUcQj%L4BG?6eK8>03brIFR}iMs>rZn`+vR8w6OfBfy~15AMByA9u(eXQ4i# zBkIgUu=z0w@(uvXz6t$eT5wi000M8D)76_FvnUSe*q|<9TEOxWfNbs9vw2v$0A8qf z<(xsfzA2J;Ax{aU^6k5d0FchnGuw|~2nMCVX}EXLlhFkL5n~V+zV8LJ=Rxqj7(fEu z9i@HdgM#9KizN`~afcmy{tJF0&sQPW-M+$;wIp5hW4u!%JIM%)`{yU)!-rqt9}S2Y UAvfQs{r~^~07*qoM6N<$g01cqod5s; literal 0 HcmV?d00001 diff --git a/images/shiny/Magikarp.png b/images/shiny/Magikarp.png new file mode 100644 index 0000000000000000000000000000000000000000..3c23667d4312e44847be454d8ddf378f7bf99742 GIT binary patch literal 649 zcmV;40(Sk0P)l!F!9?1I_1){(RT!roN{eU8$h0Yd#`w@InV671d z&KAp~0D7S2nsYt<3}t#a!d2L6KTwgLKxGZFMklx(!2NH9%g3#sDBgZATt2Cv`R-&0 zP5h5S_<$<-+3+IbWNS_MApjUjn36ZsdlM15OJnL728sgf9Qth{8m%<|R@5whP(U-J z8R$m<&~jj=DA-`Ux7}TW29!8=pr!kYyiWwY1>tK6?C_NZc`A^cWKTdl5g2|s0z{ev z2NAJO_Z5n~<;j4Jvuo)b5ml7%GbeomN)Q!9fW;ncYtTctP7EJGMfj5=*y)F08U>ak zFgt>s{#76pv7vM}&iW(3qd-;E*pMdQFDQXV;R>Mc-QTvHE2jf$ryqg6)~?s-fR=JC zqSmn}bar-9;$0y0lO}^^AbDQD@O~j)h+rUMFr$+$;opF+0x(lR0~?8Bqj8^l7O*T! zB!(UU61Y#U#bsUBkvM@F#sx6VfOTOf62E-o*l6YoSbmWBfnH$f!_>#0Fpfb8bS}xMaVRZiv#OA{7Z9TdJ;$g!Oq8*_Ix3|#6{i~Tn=6&7`S+P$NNHh jT@ZeCAo2Ut?Vsl-j!hy-t~R4(00000NkvXXu0mjfPxd6P literal 0 HcmV?d00001 diff --git a/images/shiny/Magnemite.png b/images/shiny/Magnemite.png new file mode 100644 index 0000000000000000000000000000000000000000..69e931e5f09718a67cc1f5c997a7f912c25dc334 GIT binary patch literal 334 zcmV-U0kQsxP)m{s1Jx1%nOA=ZQHhO`(MqQt#SXgn$H3s zK9+DaUkXUlOjJbBU@_qGk+7(9fJU<=;4YD8?=xX5oS6{k9Y|K@$B!Yyti;KMRE|0jT;3RAH;As*KJE)VshC*L(n+a07*qoM6N<$g1onnW&i*H literal 0 HcmV?d00001 diff --git a/images/shiny/Magneton.png b/images/shiny/Magneton.png new file mode 100644 index 0000000000000000000000000000000000000000..b14331c22df93300e3b5ec6b6f0059089807efb1 GIT binary patch literal 719 zcmV;=0xL)oaZ_|m?==H5iZ90}r;E;xgus2etXN;(BOD!2*gIt`80yQIWQa6|BKK|-xHTN!SA zB4;^M<{$!5JFP7jp*KDy@og1*}-H@XEsR0jZ(W_KT9ld}fYodW0Hl)g4&YfwAT^8_aRo4+f?IASfDz)DYh|DA<|8`* zfFwxPehFyStG&bsl^|tqi-5O5v=rl~7X-kXuLN`N>(-!%pDH5QTNFU65OD&x1dx2~ z5p#b_Kyaj(!Wm0g1`wYB0rs#hB=)fHr%?0Y`Vk7C_7fl?IKw)?eXQ|P$n_(L6hvpO z&%NBW20%T?S;7pIldb}mgy!r)F%rnS_hjZG(8Q4dh&+L%7YUXC@h#V}XJF|&v@U!Q z?wL0BUj@WS&CFhgkiBN&6!IHT$&T6)E9+eX$vA570xQV8XL%1$@JJY#`!&G-0L5qm zx%b-TL!@4S+B;B2?$tMdaT2|^z1jq>UjoEQd`41fKKGYEO5%sXN>ZA6@9T%uh;OMX zpsM|)@K*VjWL`IJklU0000*4__2Edo^zyPwYzQTwu@I_z&smJHVIjz*S)Y zaSN#QcnKaSf_$IPidJ|01W=>*xC6W3;eH^P;v3*^K=?GUpTJ|Z0nW!jy`Las9xzo< z z4XFMR)#@}rY~|}5P+b9JHGqi_tB@(8syMy{#8M^5%t{6_0ziKaX}St>0uWc$08{~} zMmE62V5(ZjKsz{cDZF$ovIF5FVybAsu`p&>N6`TX1cI}9s@Q?8SdxAN0H(7l8_>=m zG6Zh`x9M3RSY!YiBI3?8RsIK%B^Rbo78ro+z~nqt48R!>lYL%5Q$e={%nSli*}^0c zEoWN-vi-;;!$GLh210x)~@9t&)m6?iQro l(2}#iK#k`w?cw2{=QqDD6Mza7l28Bu002ovPDHLkV1hA@;{E^t literal 0 HcmV?d00001 diff --git a/images/shiny/Marshtomp.png b/images/shiny/Marshtomp.png new file mode 100644 index 0000000000000000000000000000000000000000..8331f650aca0a0bbaaad1f103909603faf6e0042 GIT binary patch literal 639 zcmV-_0)YLAP)o5!jbwvpz44m`-pL@-hn8zrTl_Dv!jmO3A0II;{ zkKYXo_kBD75aj*910aBJ6!5(Qj}h(`&;#J@5n2HJu@Nvv_@NzofVW2gvwt(-E~4ta z@w&ckBARgm;H$c9+m`*56Xc5l*Ccg-e+;=2*aN^7U!I<1Ujsw-Ltyha;gvwBfwn>j zy#N&j&qc34NhB5DHIuS$W;q}N5uW+mRth28;@UtCq|$(hy5g+hSz8u{V0r+oHBd-& zRVYt<7lE0DVCc55YYk*bmc9HeAYQf&$yNulU9jRCDfPpi1dsF{{4=OW!QwmUGrt#l0*nK9nfas8 z5~|>#$EiP{4j4N_=Q4vw0_(nyfDV10X#SI$*mdX^6Yh?+6f!wi^y|T`J& zLQ;5=lIy)d_G{r?U~)HsWDkT!4RraD;d$VJ+MuQ*V5;g}M&`>vhWs4BU>*QI1l*k$ z{86B*bw8OGIGA3iR98(!f8rIQ!P!v*xT>qAius2E=XaGpakt^C)*YHZ8^LS90W)O3 z{wF{ZoSsG0j1Qn0XIo$f>D6ba6))c@^a7Uy)WFr}0|f%dGGH6&)>CCPXMuV1?-lrK Z`48=-F}DNQdhq}N002ovPDHLkV1fn>C+h$J literal 0 HcmV?d00001 diff --git a/images/shiny/Masquerain.png b/images/shiny/Masquerain.png new file mode 100644 index 0000000000000000000000000000000000000000..e9227d7c2350828e4888205612cf13084c1e0423 GIT binary patch literal 686 zcmV;f0#W^mP)HOPmx9dw0?L1Qrhp;*EvWp5=L%#cWLV(S3(y12JaZ1Q6)4H~1?+f@oHw)reFXx# zz~=<$Wo#c#{2=J=Kp;KNAyh-oUxE-)7%QMh8gUh5B z^j`vI)fYUPU^H0rQ2^zP*W{>z!5~F^7}yE`{GFiT`@Ro?!;my4FdpPM-tcRIlY&Qe z*hd6SVB0HxFK{9uq+G*|Hv!k(cT3b{)u^CXhzSS*Ou(E%WzGdULGK^}@0);G?-cFW z^M6^~MHJVlfOAXyO1>2kG~PGfGS6e!0gQ)y${COGrob-mw@rx1t%FjX?0NxsYt(@y zq6*vH&emM>PT+0XR8XHIAFR1V+_PW{JC!&Mm*i*~HvIk$+qUhZ1&*+^@WuEwO|V%I zk=$GmU;gF2N75h~jxviEx*9+aMOA2ImN#01jV96j-~xEY39!VvxY^i-q#S?=I>po& zfaIuk5K@OK=5dWaOWlB66VyLby!S8TE!1GB>&yuBS&Ra(fu99E@9ODSq9a>SqA_)d1(7FP%NWyAz8+pv1?BAmSv=A+P-;1^^%&l9{+2&`vb+RNe`weG7==1=uLP z;Y$WA1FFi2gu}~#NZiDQW)V=LNEa^(Dxt>!&KZ!xg^)UB0mnWhu?WlyECP)UqEi-l z5zq*Z(60ko;MOuQRSo-&?|~&3_-A)gLFXBmO;bAWoF#)JcC?uX7f z0^#oiJa9SzW~sAr@kfB}J9Q6eJqa*%=KYWTL3Q>34+FdYdc8;tKcNBM7y%w1LF!xT zoOa0g6EMSZAl}gnq#eF0Lnr?UA58r=WFDoDe+-?^Zn^@WnK4ZQg+H#<|LqvJ~ ztgBydqqeRzy$Vz-bxvQu`E3;FDpWHj+O-F-Nwae+n26xe^@&fKbGu)9K-G1h>}!F5 zoR#hcZK_X}cK~0K&O%p-$n^+1q+##Bssc+8D3RNGT>mgi!|rPHzyu2S_7^Yr=$|*0Q<3_EOnq0vioKrGm~xAZ?9kOUX<+7EDOB9%!wkq4NMSze*px zZN*%75b-v1}+c_R5=4BmFEGg2ka-{eoE!%0+Px-AXh*h z1+1h`fjzJn+_4 zfAEP9ZP?8Z2OQuwxOyPUG5Bo2y+hRHWnk7PEUy55oVE%1(LW+l8xUM6b5;iKR@DTE>UD`7`XH>S>Tv4CgnaM z&E3nutbD<2ez)d{MU`d$!|JtQEXhm_TC>1gr`D)zwc_OhFBUnVr^(jwQ2_NkPo8$M z{mEETflRZEy*aJ`XlHOONE*mIHb+b5HKfJQ(^)R)D{}AJ+%U-l9Pl#!S>Zq)!pyf; ztt`PV@G*Fr77eUHQ&ADNEkO%G=8r?rI;%6VWdn)>^D0*%`vihalVyVx1mOM)LJEM$ l?;DW$eVDxOx-Tzx_yyU35f*lge>wmF002ovPDHLkV1m8T+57+i literal 0 HcmV?d00001 diff --git a/images/shiny/Metagross.png b/images/shiny/Metagross.png new file mode 100644 index 0000000000000000000000000000000000000000..44fd85ac57161b294666afd6b06ae1622aa3f816 GIT binary patch literal 828 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 Y0G0(di^HnzKL7v#07*qoM6N<$g8r6($N&HU literal 0 HcmV?d00001 diff --git a/images/shiny/Minun.png b/images/shiny/Minun.png new file mode 100644 index 0000000000000000000000000000000000000000..e622d3aa600334a86ea6efbd00bdfe0ce04f5ce4 GIT binary patch literal 435 zcmV;k0ZjghP)HD^A08CKDVtDuA9@4`R zQTk%RfFGiW07ed{bkGDVP@$2TqZ{xb3KF>xKmw={#BjhVEiwT^;hvN7dp7`P5$0h2uhovy&6VYAp(U{mWXYOD*?jY ztAL1Wfqj*gfKS35n4^D%s<8Yyun^EpGQy1H+5$OIGouL0@4`w%nXI{(pj?2gz_rBv dvwd@Ol3!355ne002ovPDHLkV1f(7!;t_0 literal 0 HcmV?d00001 diff --git a/images/shiny/Mudkip.png b/images/shiny/Mudkip.png new file mode 100644 index 0000000000000000000000000000000000000000..32984fdc21c87426cd4bc35d41ec8220d23005df GIT binary patch literal 516 zcmV+f0{i`mP)Q?A&&<_OD8@)*4dD@*n3Yxhj}P74x}Q=jsCGXN z!b6m~CKZQEqlbo{s&Yy?eF{$tDXn*wC6or6|MV2J2Uulcgg6bj#upQqd%%@-eF_Gg zR&>t<8mwH+WW~T+Ai6lp52Yr7wd*p_>9)k4+9LQvz-Y?ETuK z1j*krgxnK#pS&dr-|9kyk{P>@h_G#e&8=Nb6l22&-bFX|Li32$05+t}7H{wZE7e94 z5h0}b5{B3Bl%PX+2-|82%5NS(uQO5wMS3M}$kC8rGhWK-?C!`$L0)^N0i;qw3T(DBa6W5;rPJ`C z<|M}eYzNSnA!4?R?_rF1X?o|F24bsYpfu$CjsDLZ6~h##_Zbdzc%dL>=MN#m5wS;z yH53^!KqBJJtJQIWVh8f^HbjQwzy5xEewF`1)Eu!`5iphj00000d!JM zQvg8b*k%9#0NF`IK~#9!?UgaI1R)3oeaHxm!u^l?oi*6>%Yen9xYzs94CLXvmO2sEA;2s4%d2D41|ifLI7nU?^}%I4CG62r=^j00001 zbW%=J06^y0W&i*Iib+I4RCwC$mBDVTFbqW#8*^tIWB>o(J}2R+)zInC>8cWk4YD{V zW`QUd7Z(?QgYCEevi&wN3fg(gzh^)d)Pd?7fjfk170kxZ3K-Oc66p!H};$j7eHR=Z;LS-(YBwj%yBM| zeqxK=M*vH5PhHu{Yli$Oz(hzG%;#2s(qz5@gqhukt*rV=caI>Zj+lW>MAX;SM?h=U z?`?0bg@F<M^{WdKOuYOSJA^|mI>g{}LP`d9#-jAN#sm{mlWA`5#!Ad-G5_GQ6a+O0XE z4Ddf>Xx(oy8AD-_I0Obl_7Rxat@~a+Ve%vpMktQ~AFD-qRj~dLXxHZ5N7^60mqQ@2 zbp{>^?(Mh$>miUtq*e}rmRCHS6-jx)9`LnUM0p47YsK}Czqq*gBm4tc&J-R|A{JHv O0000n5D*ZKXh=2y0004WQchCfP!F+O%naylsK2cZt5J z%2E-lKRR(#uhYyb{{Qv~xXh7y^%;nyV~npWoQRNOU$qevAPvJ#JJOrvkqJN7x(>JXQtBB_TAc ze~7+)CCqPO;Q40(%8BUCU9T=g@1!xR5N_Z?B?4M(`A|-&X$m+t(4|SB$DDwP1NsWI z1R#qA7V|ck$j3#5D_ArTV-jaT#$a|H09ykf5V>5yEUwuv8Yt)7T!A1QJ!0Y2D|G;$ zz0(T+U^H# z(I_#&ISyXrl7Sg-Kwu7#_UF|B5rVO9f8?VW&ic$KnA%1_FMsx z1bUbQa7e&~3N%>qL~E8S5cK2v2+o~mcYxKQS2Yj_aO$)vTNqybJ&3>rNJoa9!0;nz zfJrS_Ku97o`?%i$HSJ2ZvY^C7_S-{=k~ZR+xbXo-b(aQ542J})YS=!A4Jn-B_8l~~ zJXrOMNQ)cu*rGeN?0WT(sr>y<>>5j6P0p+5S$#s2Qv3V@v_5S!t4}ih<~Q^Y-#`w! Ty;K+d00000NkvXXu0mjf7F=9X literal 0 HcmV?d00001 diff --git a/images/shiny/Ninjask.png b/images/shiny/Ninjask.png new file mode 100644 index 0000000000000000000000000000000000000000..ca3e7513d501865455292a19c31ec660bd050929 GIT binary patch literal 632 zcmV-;0*C#HP)+#4+)r?438W+6PPiRAyaZCpvBNj*YasEM;iet)ajb#v?q@h{=4Pjq!jn1w zF2K|7A@}oo#d*Y+1zv3D7=g=kcoE>yKRLR;o{`5t$+I9o{d0-K$=B}^dqbjoW`IOo zd~PfYTz6n@0X7o>N(8V5Tpk=Vur6`*_a!RSkrprmhJV`20xNTX5{sbWFCb14_Q_RppQF}qrU1tvQO7{iS{YJBj2ebzkd*~Nj z_duBe_j^I%^4509LBf~-rObe!`_u>EhG{E^`vANE0}r+hV#+y2oaB_CfK>w# zPiQj&)`0(!6Ri0a&1<|ZAmywgwg%ic^TLc!*c7sF9~(ub)lx<;zyt5jU_h+^0a{7{ zV99;J3QzWye_RKo)-aPL%vchDHYvGJ+ybANp!V7wNX(DBX8L{@)$g?c{I#~nQ?q6l{j z5D5#o*SS7;mkqij;G5hUr^cx!)!Y2UVpRZs37ybd!{TbPX S>pJ|Nn37v8^S_VFz*ywbF_MRT>#EY!46r3b27c$R(iN z(#spzUvxBR_w|5OUMI_MpO*K5lh5k`!zdtr4F7T#NfnM`si$iTrpUcn$d-D62pv0A-#D2v`A)0>wb` z3vUC`+$AE+d|(ym{bUbSbB6F!cw@GtDU;^g4cv`^nS8s00SdyuS77IUz_A{pyZ8#+ g#)Ice`QhOc-z{?#Z`o3q&j0`b07*qoM6N<$g3ndT-v9sr literal 0 HcmV?d00001 diff --git a/images/shiny/Numel.png b/images/shiny/Numel.png new file mode 100644 index 0000000000000000000000000000000000000000..00a27dffa41567157bbbd208963f8e4ef91013e1 GIT binary patch literal 503 zcmV(5UFZn0UbW$e?(@m|$3_;DCTYFo3{-U`R+{SQr=>PH~#Sh|nHf*=^c@D*Ex z5?-AmR_+H(h=&vliU808Ep|{aP@-b7#U7bvRv12gH&Bp7E`Ytw=Jp=aMAAChs zKiN_e4q(q0wL3xz-uvWHAn??1m$v>E>=nG~u@O3%TQcAu@A05r>9?=;LIj2gw?g%E zZiST22NZ?G06+v%LG=n_ACS_D@*_Znzj7`BJ`zF=xWvT@6tr`h$#cyRqZU0nQcegG8gBs{k|j6eVY002ovPDHLkV1iQS=n4P; literal 0 HcmV?d00001 diff --git a/images/shiny/Nuzleaf.png b/images/shiny/Nuzleaf.png new file mode 100644 index 0000000000000000000000000000000000000000..2bf9ed941b4b4f4856f1589a9fa81143cd04d441 GIT binary patch literal 545 zcmV++0^a?JP)?W?`aM?50mf!W`7?CLC{bMlJ$Oj%~b_8a2JvMwlo0HH){M;IXk_T0~ zemX=1Yy_%IyE^Fvn5)#^Amn^V6a<5GLGEB?seH%de!q(c6bZlHgqgc0eCzm?s;%k` z^4g!}b`$^AT1+gEsej zdSwLiLnj#TqP8?Z1RPNCs!(e&zyh!i2yX$u1Yl(qPylsJpRD_hCc}bR&M$ZiIMylo zfJPvXyar(AEALmPfGay!K2X_hXQv?ZP4*LzWC0Ss@Cb-7TQ1-Zx+?**2a*M5JXdhU zN)CvyAHx^-lc3{fz-eEh9e@K%`*=RX7?hm=G;VBA-6)t7skw}mO`wzAf~n4Z$|hz; jo#F2{?EAg*<=^}QX-6Qu5)yv800000NkvXXu0mjf;BfJ_ literal 0 HcmV?d00001 diff --git a/images/shiny/Oddish.png b/images/shiny/Oddish.png new file mode 100644 index 0000000000000000000000000000000000000000..655fbb4347ceef6b963fb60ec2fb6477447c6ee8 GIT binary patch literal 385 zcmV-{0e=38P)01yxmds0nv00001bW%=J06^y0W&i*I z3rR#lRCwC$mNAmVAPfXS>tQv_|Nnc1&;yJvTslxW=`N(m?Q*$X-a_JEI(j#V2I( literal 0 HcmV?d00001 diff --git a/images/shiny/Pelipper.png b/images/shiny/Pelipper.png new file mode 100644 index 0000000000000000000000000000000000000000..d898193af5bf636bfde22598897b98fd640e549c GIT binary patch literal 675 zcmV;U0$lxxP)S3Sa`@-n3$-zh&Wi7IDl9{h(K6SP*@;fcmMzZFd7BI00001 zbW%=J06^y0W&i*JAxT6*RCwC$mrIi4AP_`BAfTuz^8U9SK8=_jEM&9jRX>Loc94%O z5thU1mmeTi_T%w9eJ1WXQaUrf5O);G`xoP^1Z={lB@<%8-g=ffmqoppx{aY02W&Xlsoto8$z(qR^xH`7vt?=9NXGJthRVa zo1@ftDQy%XV#G zb9{ly(J&pywi85N3MxG}m<9DTL?*$4CJ1f+=9s@2w9Y%SLEDVnJ>2+FAi7o96R_<9 zxjPM7SUqnvFBAWqW!cmq66YFkX{jRbfmq=VyT| zpXXC{z6lm;0oYX*6;e_w62Lctl#iDl7~1CCJI*K^DZh!n!~MC}LGK&lQr7wE#+L z=A8;aybN>U^5TYtoE8%p@+ZYh@gq$F8Y&M(C3PkXaxRqjN!25V$ zX$65%%7qOQh8{#O4}mF>5AevR3`9Z1+|BMhOU3|}9^j|BO;9pzfL*Y)8s!{<)Dd(W z+{2*v0;^MiG6l#QCR0H8s(^e7tk9!;nvP`y9|C?Fx*%ovmVn;BDO+n5s|Jv)wUQu- z5Ht|YMIDPsa&J`(Y6~jiE&^B-j9ld{=vlu`q;*5(MRj*cV+y7^Ig!K(bSwfhPAuR= zM?x@T7>2ZfKY!(kvH}1j|5kwWJke`bK(o<41bz5MU;wEZV^)9=kO~+GkkW#=T>%gS zBm|G$AcjB$h}C>FpU|90nv2NXXZ^OgpFEq*=5M|Lb`J{e){=HI00000NkvXXu0mjf DW*?|1 literal 0 HcmV?d00001 diff --git a/images/shiny/Pichu.png b/images/shiny/Pichu.png new file mode 100644 index 0000000000000000000000000000000000000000..b08b23e94483832563f4caea3f2af7e600e55f7e GIT binary patch literal 395 zcmV;60d)R}P)oQZ@00004WQchCDfnn;_8&w8<#M_FZ_?sE zq~*YSL8p%c?*%C$asmCEhZ2FHq}RD3bp!@1q-RfHVqX*>fM-AgA{iJS0Sx(o*u4bG z$7BFVbS6taz+hnQa2hp}N(Sp4?xf`2(CPpQfR!xj#@e-;G!ZaJBY>tRfSwL`0}LmL z+eT#r8vq{1u>;t)ZJ!F@*!M@kOOg{~Y5=(JDrq8n03gjL_Fk);gZKM<0HA3Az{w+o zPB!)vT(!n|0XDTavpN9K%${(3@6Bcc01X{&?hy#e*f}{9=rj33ps26Z`TD2&j|*xo pw7OpkjQt8}`6cT5>%3fk^#yXI4Lm0do|gas002ovPDHLkV1nLJrg;DW literal 0 HcmV?d00001 diff --git a/images/shiny/Pikachu.png b/images/shiny/Pikachu.png new file mode 100644 index 0000000000000000000000000000000000000000..938bcb1a49334ba8ded0526b2aa59eacb2fc6ce1 GIT binary patch literal 523 zcmV+m0`&cfP)#{W&rr;h_E04%rgM^FaY@Y_-1BiBx++*00001bW%=J06^y0W&i*I zl}SWFRCwC$ms@VbFbo8}yQG{n_rGr?g*D{yOjg zuK8~R08)YD0?^XQ0I}B}6(j>@m{vF~{0uNNV&$7z^OFJJ1e{jk#?J?2Pr}bYBjHZc zT?(J!XYgj0h8aU==sCm^EIMBLKHh?@0@SO{VmkL_76l`~7I^V%a};m__5@!*-@(eK z&i$$_0X!nGEZ<0;7u2)}#1=yEwkeJRqIt8#h}>@MOCVcu9KhWwPushHn@LDvj{`S$ zcdjr3l!}X~fF{h=nCE+6OZDffTPflK-up#*2CDy4qO9U#pflf$vJkDaJithgPnjVs zs8@({JrFDIwuKSUGy)`#eZ}xHg`MBkbU`~m%xuB;0aw*UrV6qxbPBL|2}2G?sDvII zPCz7+$FiioPcVBds}$EkAYE`bH?95d!aY?GE56Z5KvJ&YF|*JERewEZlP>~N#z(hrZGboX8zjSStS1?@(=wg6QT)nq{{+>Sk4&S7U4oUpi2qypl N002ovPDHLkV1g#A;Zy(s literal 0 HcmV?d00001 diff --git a/images/shiny/Pinsir.png b/images/shiny/Pinsir.png new file mode 100644 index 0000000000000000000000000000000000000000..4ce75e57eb3e59ef5cd0a3e9c07872c261701155 GIT binary patch literal 767 zcmVM_x}$rL@90)8tyN4EtJQI?k0;K%sHfHrtc-`FfOSpFY zFZ^a(=k3?kdre+fXO9HQ*Q*X}dtey#dsV$Ut55h8*yVV<+Iob^Up8RA5G)F?KALKF z%TIw_J|^>8ebepx`{>~EF;%aN{W2edT6O8~Ej-u(cjcGZDd|Fy(>QTY(Ke1&1LxkJfusYCh#3g21<0i$(7A zdj%P2@GC))H2BJQ!QfM{h-yahCI}6DeVaig&z(qqMs-AM0VOeFj|L?FX7GCh0UWir z*08?|Owui%^Ew1-4Y>vYQlP~IIC@4*!wgz$5nA_;i7Ac%5z&+asVu@NpboxCLS$4{ zK}7Q30;svv6#3$k=fp_;EWlGhJQk2b(#QgOB1kNI0FXRH0syI|tbiOvVIkOKZs9Al z0K5cR@q-4*=s5}iB(4R3N literal 0 HcmV?d00001 diff --git a/images/shiny/Plusle.png b/images/shiny/Plusle.png new file mode 100644 index 0000000000000000000000000000000000000000..878f7558efafb9fb7e174997689b450c01abf1ec GIT binary patch literal 459 zcmV;+0W|)JP)4_v_|Rzh=%D!U*!cMP=vXkwFbDtu0At2iMF0Q*0d!JMQvg8b*k%9#0a!^y zK~#9!?Upfegg^`grIiNn%>N(kLil{tor4ulE}#RTD7q1B0Cscp@wmJHN9UZAx>_uK zk~-@o>1(?G=sN2MTJh)3SvThct@|&h$i+v{U;fVG06Olbx8z)ZfY%GX3FcQFUrz4Xj zWIdb-z)8>C3q#hV#B?6}khRgsUv%LE;}KHXLlJXQO@ESz7^CI@*$wDehAaR`)|*4xi81_I zAVzH^k(6ZJf}*TTi%^AN&N}M#<2q2X?C$PDZnR5n{ zlmI}|WkHoCsjwqvhA-tw?fAp%x?aD9`uzMZNm~8&^(Zkfw&0)dAMLD<$0{9$=7PCO zubgJVixuJbGo;$U(|}=cI3o4_4PADnKm6<>psI$-i3=A@%1OWFIn&*5n34#LHF^Hr#@(BSD1R%GTLKM#}U{HXY zJ1vpO1LP&a@%ba4L!hQ0#lQIkgkB4Vl8BcZ9A{8pkeQK*EiZrqE(xGyWG0Z5KnXj= zmZ1o!GIoI`1WN&|@%$yJY!?8qAh34^7(-xtln6@hjiLz{8|9bbkOB1uffhmdRFmYz zZsjFeqU57C1TCzRYXr`<^3ue%MM{3DEmyE=eSx&6oE@oyF+r8raL z(5H`GK*kv#Zq3pPK>5UDa9aazf1Oj|0EcCg%>0Ne5S~C`YU;g-w$X_R%!EmO1X`6h zh!vnhezsit45-zC%y&!C)*M6bQq)@A`5X!@Z5^8npx&3(ZZM9?qYSpy_d?gwrl z%h_HB6i&p5?*ViFIe;%96j1*)V51a3hPL&y0~{F97WKO?Oh53W1_{)O0JCocBr`+` z!o(aNNWs4*NcIAsfHb85puH_1dPth($(w*u1iF6|wo4#5An8}2G!U&&DF)vJ&}sov z4B1b=)j_E>UU$9ey^T}??wf0A0e-npuxoKH59 zkedGUK9b(YEZ9E)tRdFF$U$FYKplX+_N^i|K=s%0(iaEf1K>^HVgoo}4bS~3PcF4!#-sA6^s z+=TiFnDv}9K?hL$$=UJWgt7o?oV`v2RkiB<)ruwcwT@hhyxK}1(+!3yCBB^9suwHblPrt5p^ISbb1CT6NxG_Qb6cLyaMEX z&-e%d!5)Ci5GH^W5iGl~0u&g)g-P^GyKuQ>3hV=X$b*nCGqv|+fyfZZL*RSe5V@x3eMf!69RUGxhi~avCe$EfLaVS(v|1RnP0000< KMNUMnLSTXnUOpiJ literal 0 HcmV?d00001 diff --git a/images/shiny/Ralts.png b/images/shiny/Ralts.png new file mode 100644 index 0000000000000000000000000000000000000000..958698c1297c9ca92d8ac5dcca00b701fa8dc486 GIT binary patch literal 393 zcmV;40e1e0P)Q2m}W&xChh!fA0=)BJCA&S!q&-D3>aMWJ`WMJUsk&)>`-c zpZ9yMdw~xNNjH$JficKd;e8eovONOEre26W!q_0#3*hvJvFc-F0jECNjyt&N-dr^J05=_yT?b_<9U0sEN4700000NkvXXu0mjfy*93Q literal 0 HcmV?d00001 diff --git a/images/shiny/Rayquaza.png b/images/shiny/Rayquaza.png new file mode 100644 index 0000000000000000000000000000000000000000..0c73f7a9e2d35881c7748ac5198628ffee647335 GIT binary patch literal 911 zcmV;A191F_P)k~lgyo##+13>bp{Sjc_+m7}>0aHEg zgHd~)?@te)_p$dhpvxcjc3=A3G-dvA-=F)qw=GFq{^*H-cmH_ywcO5J?3>9r;WGS^|Je%00)9AAi4x_ ze{5c+?0}6Z0kW6Ky$BJvNIurh^W8Ooo!~r`WR@M?ne21?TgC!luV;fd!E|S=9PNCu z05RLfeHn>v0`xAVcK~QR0q2Om1H_*|WTyghWFF8n{2Sn>UV

      DP-PzumP62=zo6l z0NRT{uQ@Wt_NB1&j{|@b3W%(20|k^2=Lh_Y>_HMx0uZiYBY7200Peuj1GhmkQuK~c zY<&t`e_7?nIYQ!g82=??COWxB0PaO1&r#gM$9v}u%b;s{i(t`1r^$Dz+|vK`Ywz{;WQ)eUUGp`XUd2B$zf2;dTO2G{|h+$fE9v=j~} zSoAKy1#CzWfL{7m0_=ov{m)tqr}12Dbphj4eWBP#f!_w`xy&8Amjvwv{Ax(OJ5-y- zvGVF`a0Ke9y)jFj6&UkTdGM#(5;m*viY5e{Ve7tM06Rb2j^rnL<5YqqER&MzEvjdoK{IoAct%bl( z`yvq!74R28>kD)c)OHuh{!PelbPE6<0hmGJp*P+E@QB`GU6}n9KsF$I>w}(xXMY8t zh{R(6Q}FzJ12A#)0}y+U>pp-|ifj%7*n5E24=@2}4l$1YQeb%l)B(Hzw0!{do&>Dz zTwnq^thfD7kzWXH-y5_7LRxb3JnKyWJJ1DCN}$gv?Eoyj2`QLM z?n9VBA?2h^AY0kk1Udn>&AynCUjtZsLkiK8E_V>E9DrG9)C6Wf0njCeArh!N!9CyU z8DZ%Ya2IQ(Od=4#vd|lbwYSLCk0~<}umo128|&1TiRbgHwf83il&{@9`xp~A899Zu z7r$b)?Ie#jj8$;edi@)Z=KeAq`?2Tl^#W+~9NX#`6$|qQVCsXpc5?^*7ck!q7{HY< z0qu6(=Schj)aWlpaqIwG=kpdWF%C;=jw8Ph1kqP(#Q?4a7f=sgg7*Ov-vFj~U+5Q} zLV}+FIS%0VsCw{h^mkW}UIM=v`Ds5-^oREk%V8ZfQM_Cj00000NkvXXu0mjfE^Jz= literal 0 HcmV?d00001 diff --git a/images/shiny/Regirock.png b/images/shiny/Regirock.png new file mode 100644 index 0000000000000000000000000000000000000000..c82f2a5a866865edadeee77b0442fa8c7fbf2192 GIT binary patch literal 867 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 literal 0 HcmV?d00001 diff --git a/images/shiny/Sableye.png b/images/shiny/Sableye.png new file mode 100644 index 0000000000000000000000000000000000000000..7f502b6bba9e8462083f83eaa70528c625dc2237 GIT binary patch literal 558 zcmV+}0@3}6P)K+wzp zIso^a8vqdP0m6Y%(98gY@brC5(8(fTA^Cd@J08qEY}e&Ez37hmVCbgy!jda04-b{37Ek(H~;_u07*qoM6N<$f@w$kAOHXW literal 0 HcmV?d00001 diff --git a/images/shiny/Salamence.png b/images/shiny/Salamence.png new file mode 100644 index 0000000000000000000000000000000000000000..df822d057723dec99de96f0e599cc3bf6378f760 GIT binary patch literal 798 zcmV+(1L6FMP)f?zptxwjXxMmAfRK=8nP#|fNO(vv5MUq}7#MeJchmp?00DGTPE!Ct z=GbNc00N>(L_t(|+U?iTlENSi1yBl=n&jsHe|HHG!D2^8U-zy%I&JS++Tg>6|9lp< z{LF#~QezZaUZ2u{2goLGQP$a}#F0IR^O0DAe=+&N+~h#d#ihY2*TG(;JwyG_WeLEb&CdBfU6~l)syX>xgVYd z;majZ?>k_GqRPi703}O?XpG2@00@S<@EY*GHR65CQ_9gM9NxbaFk1eRNELW|FE0TN z77&15L{23jt(*ZZqc5@o8$y7`1b}%KWVB>ifeH2`P;9~N)&%BCpaRoA6t&0<_#|*} z1@u`cAsPM9V#W#_4G1QHT`&#e{gF!OqpvWa_QMcz7gA2_cU(~aVyPlVjB8(-TYaIWzM zECSVYc47cTq|+3c7hueg?9(^_vN$jZiv#8lhicyidH@J>pccCZr5B61B-PXQ17n->#YUlHv-5mWDpews$O3M5ETJku(TmHpl+Cma2X&MfK_|f z-h4!l$8*0H5UGuToFG*l0&=Nu+g-2v1t+Qi^|_#(Z~$@JaJ>NBBVxodBX9>oP=A1z zLX70sEC9mWpssoe+8hwRP2URmrJsERd=ss+E#v!MP^*_0!ne`5MU+?gUO`u%M{GP>6_#fS4#yP*6Zv01yxmFm1!_00001bW%=J06^y0W&i*I zmPtfGRCwC$mcfdwKoA7A(@C>3|Nnm<-951L_AuMdo)!!cyhKnfrMTVP-24&jU+Qpv z;{!%Mm6Pr_=0h6*$qxc{x-CpdUq3bh2IJ)mbG z`sRCEL;)}ZkHI0$6Rh$K`0=Eqbbp<&`&(5ywIxorDpfngc1)9jMVNMN*6K@TN z(O00nCKv{&o2S6&OQGy988G{GLW0BSe4*r*DG$RM;-|n^UJ^hCQOiIH4r3ew@XP?k zS8)<(C(0ytt{Bgk1 z=Onh1u&vr3X~UO~XAGJI$PSZ9@B;rz0FmW9Kw zBvpxm5GbCco#0c^glhnCfb^j4dkT{ei5c5PNU93zjf9!i9#9WW=aB69 z`1r8u5*GyZUoY`(;?yDZz8@n~FbtuS+jYPZGm=OlnF2C|eeZ7Mb{Awbj9POFp?l1j z_Tbq)_dK1i^R!dwP9<`G@V(v&>M;e!;yXnPPd(oX=%jH9`oQb12xrc$uM0Xkh)=qY z_B_1rUgXwsrW8YITd{JcDP{`-?#6FW^)E1xPtE(Xr3HKQhLXr o*)i;j3~!}#<>$-eC;ubA08SM!ZE>*>J^%m!07*qoM6N<$g42Cj#Q*>R literal 0 HcmV?d00001 diff --git a/images/shiny/Sceptile.png b/images/shiny/Sceptile.png new file mode 100644 index 0000000000000000000000000000000000000000..a9475254be41f37b0b98df7fd022fe43d8c0aa98 GIT binary patch literal 955 zcmV;s14R6ZP)9Yd07A9HEB<-^; zkWJoqUq~*Or3yF~VEO#K^qdz|@R^Et1#=aP-xQSNvJ`K9ycxL%ZyWwv5JRx8>+h@e zZEB4&1lH^I_NxJ*J%3YFc>TH?aMrMXUDcw3>#;!C8SGhbeF%8xzY8G0%$aTt^9gQl z!+_3{Q;T6hCqc0Z?AD0l^94WfO|7ve`_gdR1g)O9Po`03mH*_2fCwV6@sUgy zL_O{p%@&LR!kYOaED{c28%DUm5gTY=KoQ9D_kjVxrU`Hyed3+lLzDx>?*r7$nFxZ> zm;#e@1+i@c;pfkXplx8iv9&6Mc>$_vD+~)i^CXb9tl360!jZwcmLmme`V-#=DQFDF z5Ulvv9F_w3osVcS_+auGR2-?m&wL5y80d|zbOmx^=Jg!Vid;yvRP0-J!zOF@am0bgIxvROR% zWyzXAF&!rI+H5-kTMB$xmf{C~xkP#)l8CzMmEum|F1TkI$-yQLBx~xm011Ov8x3j&0v0`ev~WlFGh-!I+YB7%1px+Jy dBzOG#{{hCLAMdjVMTh_Z002ovPDHLkV1oA~x9I=? literal 0 HcmV?d00001 diff --git a/images/shiny/Seadra.png b/images/shiny/Seadra.png new file mode 100644 index 0000000000000000000000000000000000000000..2e3ea7af157423badbdaaf255f910bc4bdfa390b GIT binary patch literal 677 zcmV;W0$TlvP)%((th~iGd70(mEU{s zqkV#W#|Nx;e$?IH2n+z|-TB}@1^T#s7IqxyE3gZt_6s|W498N~+LCYBPGH{*`bXPd z69^A84Da3j<&kFoVUvmqJSBV;xGQ!C6gpUh?E?F&Ft#6w_6&Dng54c_jlf8?c3zkh z0PONBpjZPO7bY<0G#jNaU+oNF70R!J!D3|MG+?_>{!K-G>q)P`F#iQBa9@mH1Cdg$ zCD>P+#Kn@8|GQ8q=9DDZ*8(HAQF6q0`#{#Y5bSG$LUGxV-|rJz37CCu7-NxArqI3x ziU@abnAu=e%vNFR+y5SA6|@pGbFvafA5uR1O^R^U?Q9j`z;)<(;6royy8sy6R|1cI z=`$j{iP4x9t4#KsD?_WSj?F-@OW5&pg5Uk09bGcpg2HKP*4yM5GHWiHvj+t0d!JM zQvg8b*k%9#0@z7JK~#9!?bpkaqeu*eVGc({wxp5X|8Xa87{VB8YC3w?|Hf?27a7K3 z?B#ENAl2UmkiQG~hg11~2OP-vJxTuw;B%+*1t2*OpAfIDkI6BGymp8+eixo1Q|%_g9nfQV$? z0QS`@9S9&3Rtz0*qDBe{*Sy&yGx7Ch+iHlc!M5U{vo`hsTs4=^K;}QS3Ty_Qz-CG2 z*o&Y8ckke@y087Rt(wLYZWu= zuVn%_(s#fC=nAj}tlKPN0{PmD2tdCAEI4Z0Y;8O6+DDDN3PL*rt-g;2OhE#OmRtoV z&cNE1wMLZKfsk83hzZQvxHa#>6hKbkUGNJqgzW;zzGt3+Yyi(dZ| zEs#JLu4%L&1L^x4;6^Y;grEx#z@mVNrd2qJxdmwKl6 zlc+=kB!n`6C0#^3bNRl^WC+m{0&|p?_49`sEe_y^CQB#s>k^pJ-V*?P~OqE?J+ z-x@a_qmC=qFYV8f(t3U#CqWoBulbZx+|Sp`^J(@ji1QF#<1wdnBv3oS;wjhQLar-T zJyi}rh^)5DH>zyVG%fn^hvZ}>OcO+c&)_d}I;V2>2x&|jt78~!e4|ycbVlZKP-1fC`@)Ad+>MSq#zyI2(dkWY{1p0apylGVBOio(~Pg%tOap z0cJW8$g$wKg7R(!;6eojzgCcD2tmSm1qEt6^!e8*m~kZVSZ`QCgAN4NKZv|E2%!@k zRR|tyH$p7$)!PUmoC+W=Ft&q>fgsWZdj_Sx}*} zQ=!u3MIw4gC*E6-lGp7{7Fm<+x4LMfH;|hx*`3@&K7A?lCLpixhW=zHrH#U4#n{HV zLSzO)M>mh77VYu4OWZ(sgWycpl<=Y;(7dIz8PQ?49J6EU+8fHkW`z_EP3tc8s@77= q&pDm5Nj_g-fOv4=P$0lKC{R!!_{fkZ00001bW%=J06^y0W&i*I zJxN4CRCwC$*0FK}Aq+)P79?bG|NnmjvO{L#B7m#R>?!Q(-Cc0wbi4f*W*_dai}VSu zOG)QYGdm4fHv*il%XJmZfRlOAa&^T}RoLB^zK%lCVC?O+jIoXH5_47dp06dS4VZRp z>|Q5hf1LpXTRsEKM_b2W z8dwWByj{UYz{w2ndq|4`M??Vh2S8flz(cYK2u!WD)qsHH4svANy#>-5&rgnz4@5Qt zt&eN&2qMyg`)a_m_$} z8|>^eZ6?Trh_DmLQi0gVx^|>>5DRyQ5euXp1cB^xe}F{JtsMqJoS=22L(~D%F^2oU d=IwU-(-&`U6M&>Jp?3fP002ovPDHLkV1i4F%KQKT literal 0 HcmV?d00001 diff --git a/images/shiny/Seviper.png b/images/shiny/Seviper.png new file mode 100644 index 0000000000000000000000000000000000000000..65ad62e8be09ec331495dc334dbf097279f5d0f1 GIT binary patch literal 778 zcmV+l1NHogP)5K7uuymqurO#iScp(aNLVmHGcz+NARqt$0AMUjp8x;=0d!JM zQvg8b*k%9#0*gsRK~#9!?bqRMt1t`&;M67<68pUW<6i89(GG%IRl2`+qzy4~KAlu+ zrKZ2U8`SzGFweDqE6iUBm|Un|3B`%8fd40`MF9K)-V)5pv?Uk6IP#fLgtlTSH5ZQ~ zcmiBl*Lqhciee5Rg7hk^W1&2lNO(&<08M9L#bsZjPi#PT;27}U1m)-x)_I2IqyO%N z@*t{0w!${S$EzRU1dIeFqFR|TKLF&Y$AIez^*n&6wHtU>N|Z z+E&k7zo;=03CrGRScw2;S3q(g>DJ%k0O(}^gPQm4okn1r( zcK|!k`gefVat0LI?lf`-SSk4h(4s|6BYy3QjbDQL1jNI^MDX-`2>c%43#@nS9iT>i z2co}M^tOLYcwi<1GsjM zy&{%$;Me}(8EO7>Anlw2t=uZL0l>O%?w1=dQB7#j3iTxt^Cw6VU{23K$1qul05`@G zIxw5OjD>a{L_l8vvjGwLGK8UG{Zj-k5hfy$QGlg}0a5Vn8Ue8og9B(v?mil7zD)oE z2pJLqQ_qj=2|ZzRBb0)i3!@eMK@U%^kx&5F0dUEcLW~F)>I52(8nBsTP?FLD5(NuK z{Rm7IAlwRV23X*5R}Eih3PNLvQo!AhrvXr#x+wuUh)kcM`br#NP~nawnmkQT6)v0^1CbQUfdu6r%k!zyumUMHWElcmB>m*k>KS&7l;W zYzci9ciRVDmP4P%JCI6S{UM#T|SlKoMBo!PjF5N0XEPt%ne{@p#T5?07*qoM6N<$g7gO&f&c&j literal 0 HcmV?d00001 diff --git a/images/shiny/Shedinja.png b/images/shiny/Shedinja.png new file mode 100644 index 0000000000000000000000000000000000000000..2395c6bfcb7abd2ee87a3f3973111fc8bd3ac04d GIT binary patch literal 565 zcmV-50?Pe~P)#g;d zSxbJhj1VlMzp9F~Gd96MP z_?rTd`#RvTU>hh&(`y>2i9k65ONImjs!GqR@$~x%sDwzsB4tsUdzh8gr+cF^!8R)G znE^MIC>H{C-?MrEDeh(f>7W2s!lWla;)5~PhYta91elyaQqTFeJ_>+htuWKR&m$+y z6LT(oAJE?cA&=ri<JuP7Z*UoG zD-+IyNN;ZtWvS38jQ~W4EFsDQj6iQnK?iNAEQxUIc2BVdqAZ$)K7_m;NP(Ut02=#s zk^5!~LzFj!y6pD$K1H+Ll>4`Z?1=I|B0hipKYqSHd@B$v*cgr800000NkvXXu0mjf Da&-O5 literal 0 HcmV?d00001 diff --git a/images/shiny/Shelgon.png b/images/shiny/Shelgon.png new file mode 100644 index 0000000000000000000000000000000000000000..7863af971a7ca82b83278a54d0f401cc557ff4ab GIT binary patch literal 551 zcmV+?0@(eDP)^DG{xu+;J*aB9l{w2VhO~4e;Lqh%;-hK#}vG}kG=_i7AA0WMGdjV#C5Ss7CAD{=wL}tog z+3oPc{b`1q0!twiwiQCQp!~al{7MakA9e)pe1ihhvb^8pSPCMD0%HY{cL5`i%QWR% zz|IuE5ioZw)10#c)1?4JPav0h^XD0MK;Uo-uNO5yPk=7~u>p!TKm~dWFQkws6C@2izFDk+97HOhy=P|M03dlhniRt)oK^x` pdvBlZco_Kk03r+DKMh}gn}0T+631JoI^_TW002ovPDHLkV1k<2?}GpU literal 0 HcmV?d00001 diff --git a/images/shiny/Shiftry.png b/images/shiny/Shiftry.png new file mode 100644 index 0000000000000000000000000000000000000000..5881a06f9c94106af7f01eaf230e0564ab50f7a8 GIT binary patch literal 871 zcmV-t1DO1YP)m+w=T z-%%g+w}BrOWS$;-pnk(&MMBEi3*Y`QvZf@%Le9CyXW^X(3|-bWMFAxW?%xJb3cBv3 zC};#~cCG^Av_RKqp*35f-uXl8Z?A{IDpHEJK)wiwlh#8Z&48ao4}n_iiNC&pYAdAU z2wrG`>2tX#M8GFVa|A!j2xts&5un;E3_l9H&rdfP0az)D^p3c%;h!TB08~!`Nwhk= z@b3blUj_U%oCcz>EVsS~>{DQsOFsf$Xo2l4u*yv!M$icCVv0ZIW`JJUHrF>dP6~4E zH@z3a7a#>Az~v)!zZc9b4d0Qc0MZU3$tcSOY?HdKsz3^a&!;y;RDq`~S4eWKl%mco zJRNvQ9q>93elK8~1;qE_4}dGbFCi>uuu%xu0}d|NAfY&l5jYf}O5P;m$8Z$f$1y;4 z7!BM96lOdG(4R30dkG)?1X%Np20H{O4#yUfSWX!Mmtkf!nuIN>$LYuA3WXA(7Pwub?i(FzB-+;R526aL@Mr;-cdE~z z?&q3I&V*|tU=0v-rjK(!JATj}2&}_xKr(tK{(u(&ht?8!TP2YhU`(*#gKwrFboB;{fvqI|NmR!g!ZsfNwU|>N_#-e5Cf4oHk-|65aNTGzwlLA z73&2C2mmoJ2NHrT6^H~4Azsi0s@iH<5EfDj=o1I$eBTN^^Uv8 zoDU(ckf0*&GF}jXm?Wtks)dOsK}fj&H{>SP19M9dJG(=I`{$ZLW)&sQjZIiCQ%&OxH8FvH_Ng-g(8V2=NMZ2+3TKLoAt zva8xFN36})5C3%pj!G`%qd+_mNYaP&3?u}SFh#_mFT$)X6wFT{Mz=!M-7`c{iWi>R zO>tA)ofQ&Z+{`n9IL3*3;fQb#ySYlAelk(2cisLK$2{T5T}Xd{DDEZlo*aur><^sH bW;4tWIpPhF!PctC00000NkvXXu0mjf=W@C> literal 0 HcmV?d00001 diff --git a/images/shiny/Shuppet.png b/images/shiny/Shuppet.png new file mode 100644 index 0000000000000000000000000000000000000000..107055a27202f26bb269acaeead9cd99be44b740 GIT binary patch literal 381 zcmV-@0fPRCP)+z^Mw0BvO{i;LE%J`Rx0)5!y1YO#ihvHW1oIBHhDZ*L??- z0Rs8~7{JrlX6U4^Cg2^0FM`@2kd21iAOJsMR5ai3klN1xKuaP4rGQdcERohDecaEZ z?g!Qx3p6hSnxBP3JAKpqg|nlyq1d^Ts-v b{1tux2j>-Q&sk5;00000NkvXXu0mjf2r;HT literal 0 HcmV?d00001 diff --git a/images/shiny/Silcoon.png b/images/shiny/Silcoon.png new file mode 100644 index 0000000000000000000000000000000000000000..78ee20718832f45c9a341da7c88ffc93d825a249 GIT binary patch literal 458 zcmV;*0X6=KP) zXc!O>7+8R~Kv;Ko}Sp__$d3*pT?}z~G=*F>*|v00001bW%=J06^y0W&i*I zR7pfZRCwC$meFd%Fc1W_YNNZ|`~Ux~Bb`%06FDIiO7VcO4W8jFy||p5ocv`%@qXbS zjBu|IuZ^(t!dOv~*tqPpjk3|yj(j0?NtbUVHKc!7z|iM{I_Vz(3D7;7)SlT)m;7gf ztx-)V9bh$rUrDX60m&wz>ryNN*8)?YFN9n&Kmr!N)FywvY3c})~;WB~-68o>ZTibAdMZvx={T&M=upT9CA%*^?!ctVo7 zic5cNu=WxD(BQ}fp6$A!QHaJ%0DlDtSujl9YPD)zPk$6<0@XkOAm{*G(xwMdnEEW3 zkEH=*?(Z%=?7o3`dlGX+mh%t^aY)ZX_+}i-UJ$k~!X}vdQ^B?Z(F1e-PutIL%z`4I z;ME7z+LDw>YfF(O7=f5``gLyK1~bvF*K1q!FoK@W>2bqj`{Z^f5|4#j(;R^YY41zj zPG5=<_62wb#1TNPy)gB(%M;7>{`sDudd$q8^s-~g4-j~9!*&E(2ExxdZ_Cu* z6qr{qMo^6cl=}6qkNe*jMnI$y>;dL~N9m`Y>=XH3YgzE{oyvmDtcJGfx8OCA`K#6f z4RC?V0rL88p$~f`p5||HKk5M)AdpfKR$prCEd)xsIup0G;4%nK0R#|!OFjKI)%`8D zrU)2mo&j}V%l#$nl;0y|LHRto%m_&BmWNOM;RoQp)bcBm41lXfpf~e$T^|XWe(>`Q zJ-}*a5)}ThZ|f!A6XyHCvMfq0{Q3VMcIZhYoaG%}$y!GM611^wxIP5x^jD<(gl=Y@ zu)Kvo1P~jhJ5CMs?|Vflc~0mxZ+^i@9LHheeZ76?yvz%Pz5zt_4IlpgK7U)-_6 z8U^-1dbIC;@#>F(eiJU&F+U630{twM6sp8>05_vDka`lb%26CZCWt}G$02%xXZ(bu zlJOw_H?Y2K@01gP3TT|>On{XtzX}jqOD6+1G*-FJ_zdgxAxKS!kj@?;p>Qb)Urmxe72KnD;n#rFPceV@ zv6Of*7<<( literal 0 HcmV?d00001 diff --git a/images/shiny/Skitty.png b/images/shiny/Skitty.png new file mode 100644 index 0000000000000000000000000000000000000000..cfbc64acb942b142080e141e9c6a189e811dd068 GIT binary patch literal 559 zcmV+~0?_@5P)8j3siU~)s-7Bl5opE_$R_RP=H{0mrk}~& zxe;@F4iMLOgj^B&?w|>Vy_j$Dv;nba0gRJC%4~7j81^(U25=VOXdFJCy~*PJs(Lyh z{*FskMet>WK@L>Sy`A9hVRzlt#7o#Uv9CVt)VCo+Gz-300h7|PzZx*& zoL68EV;qPmGPdvM0h5shivac=kdcTg%Gc9?re6~bJ47CVm>+?q1v$YWLHWr`AM*LD za>ztKSPSUK0u=!|g-Ha&)4ZLbj~DvktD=V=^xjdQuPsnCOTTMDO9d4ze=gu@RjTvL z094Db0D3?Gs3%wmOka@!-?$gN`9h%K(}HHPz`1;1TF^|BI%c^%&AJn&zYwq)NURr} z<+XyhDo{tLai1f)n%5*Kq%@2V`^|-yZrH zqQ#Yhjd3l|JQF6-d4Gh=d+c1l|Oi^n%|GY@`A8VtYT(Ieen>`9gr0iHV4b x!+#qma^EQK&Q}7>eP;6C%eddaeQ*8({{Rpq6+X$r9H9UJ002ovPDHLkV1m|P0bl?C literal 0 HcmV?d00001 diff --git a/images/shiny/Slaking.png b/images/shiny/Slaking.png new file mode 100644 index 0000000000000000000000000000000000000000..985143c78ae372cc09638ad439d1911e9b87c579 GIT binary patch literal 901 zcmV;01A6?4P)6&`>D&cu=4)Ao%$B_~?-Mz-YLDK*Px}V*mgE0d!JM zQvg8b*k%9#0|rS%K~#9!?U&20;xG^eZ=ciMCQjV{|GDEw>_8AgquI>j79^~y)HX2^ zKfnC)pTo*O=%AS@@bj7YqF0psoQM*ieH*CqV@fg_Md;Q<(1!OD99H-8@-`$6PJ zSkAyMY=NW1`xE>UusC`Eq)PX9b0_xpVR4@TU9T6X-#2<^>@obj@6iIaK#%e|0UC6g zF;SIQ!Kx;?6A{u2K=Y4yT|GP{8tYBz!09uwJn}-^-3Z)#?Y_1`vU+nLdc_j*49tQ@ z^GjU*3@|0vl#;n4js`uU9f8#l>w!LjtiV}t8v&#D!U*uOZC66H2P)w%F9GRCyD_^y~Ud#JvD{ zD}ZLQ{3{R@k8)20?g6@;1?|uma1RV^-5|FBh7VjLEHDoL3Pio$)&O%8vKREdFalxC zRgDt3k8n)@&Vt!hFss(M69@pp+XR*O!f2R*XF!8E5v~N~{1ym^V4Z8g7G!9JSO_ax zAvwNC2n8#_78bD!l6XeASU(9r0;wO9e#&7dQuz|-jW<@V@)~&yeCHk+`tbicviSW= b^2^B|!HG0a64C3&00000NkvXXu0mjfI|!Yh literal 0 HcmV?d00001 diff --git a/images/shiny/Slakoth.png b/images/shiny/Slakoth.png new file mode 100644 index 0000000000000000000000000000000000000000..02c1e166022e828cda49ebecc7be2c6b2907f723 GIT binary patch literal 533 zcmV+w0_y#VP)k0d!JM zQvg8b*k%9#0hUQbK~#9!?bbn#<1h?FQA=!7B;%_4A9qAc7zh|A>F%rs@LPD3)Q9A3 zvfXaC+cS3hU@j-{mwWjO{A@3({A~Y=LM(I50=9uaJ%FZsa_o&iIsgGpO8_apc>v^u zOMww43D{l!XFAJ0tw)qbB z8Q?6(C^-2nppulcb(FqWh%kpUA*$}=aa;ye=5J3%23V+~Brp;h+IeUDana!Xm}V{= zg{lr}AnD*ItCjx*;KP_ts+!YS_R03kOL&5;bQab*$fH(137EKrtp#_kYo5z|UKd~i z%z{N&4xt*rT)#v&34DDa#vX`Jcc+RNNo?=Xr0-jWbR%VFK&5j_+e_$yc9chJ?Sa}_ zFJ!>Alk_eF0ZQNZV>Fbbv>E6|V{#nFbpRT`gRQYWdg{Cae9|Nddnwn2aotDqz&w#`IU*mSW{a5|~ XZ8IF}JQ5Wn00000NkvXXu0mjfO+e~~ literal 0 HcmV?d00001 diff --git a/images/shiny/Slugma.png b/images/shiny/Slugma.png new file mode 100644 index 0000000000000000000000000000000000000000..1072b54e2869f04aa6908ac71eff1b488a27e6a5 GIT binary patch literal 465 zcmV;?0WSWDP)FfX z%hf3zb>3U@t^VEVED5Q5{%w*y=D`WCzfc0T|M^~XTqH~FZ{?>Ayov;zm%{`$dFkQ{ z*xY{k1o^6ogJeB{Azdwvy+lE(wVg^sZZN25+TE@6s>yi)5M5H%h9Jz)SVCya#$t>E zIy6l6@j+;yQoDHJs(j2C!VJ79tTl^_rN2m?3Zlc)mPaLktk87K3b$86&V@GT=Qj)z z_?W=^mSw=LHdP0B351;{0xt5MBq9qq5u^)$p^vZ|cKi_&cCnq^RJw{v7WAV7 zUhsPI+JO!-`vk|4 zYL3HCQ?R)wNM}@uI52GL5R_g^1C+o#e4@>NgMHuM``#HM=HUqfilzSEwynGh@&}9w z##DfPb6~40Vg-OPL70lLeFLSB4#>a&Fscws*-8o!sRC%R0RW6nSW2oEBl&=_2?BsS z(E;+lCtnW$gG)fB+5oWkWe@;2!yNGX7+?ZveZW$(5~5yrL9Pb~dOlxa#2KjrE+@EQ zswd#Acz+T&h5Wis&i>|TC3*t>`9nkpO7sgbuMZNj#w>S0MAZAkLb=dhU8sE*+?q literal 0 HcmV?d00001 diff --git a/images/shiny/Solrock.png b/images/shiny/Solrock.png new file mode 100644 index 0000000000000000000000000000000000000000..34e23dd3fb75a51f5522caf64cd0829c418cfc69 GIT binary patch literal 861 zcmV-j1ETziP)fQPyopIh;VTDKsb0{NZ244P*7O7001~B7!VK;_gdK)00001 zbW%=J06^y0W&i*J+et)0RCwCGmrHWvFboAl%o9RBP{93fI|L<{#))OeQPs4)v%1ai zLLdJD)oXq!#V-crQb0xESNtM?Unqzm3zsHvrH}y?0RDSl6o6g`K;`!VEu}yK#m@qw zs^9##0tI&kMWToQIv`N$KZQ&@@KyEf*aLS7)$akNo?b7{f)0*=-uqNaDMe2L+*j>Z z;MV{pfu3%wkA&=s%1Tuljehvaxt}8>0rlKMYpQG$-wc-d{~0)gR3%hbDPjxRcFaBf z0dxk=aaUiPiD227zKA%13_SOf;V%YoxzP+F@cmRNUig}WUyOg2{7eYI70|@}^$oOi zcYi`UQzlb?!D>C-yFwdK>CbeMo8M{-#jJfTnAxeXsv;nV-8U!p%*1$WKB z09d;W`tk2kOOYD2odk|X0<6)iNE`v(Mi);5iBEK`@%hs}kNaZ|p=Ydv-Uj=pxj46FaLzXxb$jlz~hj|ymnB}4WP*B!w9k+16rh+r1__(sfiNv7a4 z;c0&d)DdXb0B<|f?Uvk>lpg_z$S9DOw8Sjz#$lc7lG6le2mKu%ngPPi4oD+u{yabx zq`t3{Q+e}M>8i}%o(9rB9!Vt=%?RD@z>CD!ec7B@V9p9N0sr_ht~0@{OA%=DMnUfc zYz6YiK5_Wl5ahif5V(7Mn*`nn2ypj2Nmamq>Y-0DUc8uxB~q@yxac;&Lk}q`jhfv00000NkvXXu0mjf>m7;# literal 0 HcmV?d00001 diff --git a/images/shiny/Spheal.png b/images/shiny/Spheal.png new file mode 100644 index 0000000000000000000000000000000000000000..9747db2609e063f425b2f30468477802877b95cf GIT binary patch literal 451 zcmV;!0X+VRP){V$k34J@WA-^*!cMP`1t6!=-8;>$dH+tW@uP20002?q=0q+0004WQchCNkl)kF!1gX z02zf^2ZY>uoosu87V-*xu)W(X t^x5c-vvd!hEq`3V2lp@2&CSityfOud?;LxC0Krry&sHi|#u)tWTkZ6#gIB> z0Y4{bd+l$V1b{#2+a|;+;0#Fb1#0W z6D&n<_`SjDNEK%z{;?(3RqpY1in2%D3I@9S$KQjmPmyaivdZD0eLGsJs^hX zfOR1ZfEYg>TAeXq2?<0{+d!g{Ibcly*d`jxBUnR7F9Epd>+aK-{u(H`@2~ijXzNbF ze^8V}4QR8r08C3(a$N$20A*d@Bx96}#GeMnC+Sz0CUD3c0lFNZWLpxqG$;&62;Fg@639X($mer^G9*pEP=FNAecuB@(ND-!7(w9XR}&Lg{nPeLv?%KK zc^t=iHniW6VY}q-d-_cR(As%sF2bJ&jwB=rNfxsBc_Dlp*2O3!l@}3V4Q9ZP3gMd{ zQ9Xz_b|tNmeSH-ld(tFga8Tz7vrMcBMIOdZal~mvE_)oDd<}!^3|#CLihh z-n*VS_HEntJ`jquyp3lDFx_gjtgy%}7&qr%&i^)cn`c$pwb9 zC3FLofJZO^v_RwEH6~06fTT^D8~}MgnfPS`lk(+VkYB`tmdLt!Vok>;eEwG+zQPY0 WEESOLO#kZu00006sKAOJIF2q<6>5D>~fq|5*S00DGTPE!Ct z=GbNc00MtWL_t(|+U=LoisLX0MUzynT;1OP|J{}3hy+@1rhQtLIn2XQIA>&GaA*1D zKL@~aLRIitK%pl?*Y(2!1gczi5Wev1fQJ8JKqU+1|16+-@+(mOMW6<)21Y=6@^R&h zt`77ZAlCAQmjN#X3P8+6p&GuKT?P_lA%V4Kis5ftw^KlY=?F)`1Kluu4=@8MtH`u~ zDCh`u*Q|cY032}uRnA5Tv;wW0S>K`*0jdt&;dF#5q}ZCvJqH+p(955UPzB}@oJdpv z(DLU6b41zOW{=zLb{`2d2IbFzZH}dXdpOVM!xMc=8q2>3Y%Tm4zzfdUWbcg^^TT1! z{cpSPg~#2(_9}s?4?x9Husb^s~0j8aRF9AIO#Vi7G`1J3&18QFK_X+Y8h)dWvdnC_it$-$?$s|E7f7>G9f8E!3 z_c`2ec?l@VULlsE8gL)sXTdyh_Zi#|Hisg``wOw_t)*ajjPUb=R)ykSV71U&cQWDl zH1$bqJZ!%8*Ojet+=R^&NfwMw`FORD_anDSOEJhmr#dB1Z*%w}nt}A3QJ^MZu72*T z?i;3CZ4dN406?8tq2A9U(2qbApz$MupZcvcFfUXan(vObU?UBkWNb^TuH8jfDQSFh(QlZP-t|Kg>oE90j}`Vc4&M+6|UtiYQE|05rf6 z81-u4uK|4*NaJYmM?M$41Oo8-1jC;Moa;dPRroMaexiE-p9WYv8v%U&75Dou$tnoH t;4CnQ_o!Ia_>Jhu|afwRq!gu3tJ44z+H0wU$lNVZAnioI~CIv5Ajf~1IJpz1ml`KG`isv@Ee3}cB+*){_tTJViZIKU#bgdgpRN#B-xo*k^BeLi u@ZxBbaP1$f1i2)r6Ig=${Oy1EpZEn@avORiK0vDg00001zrXFQh$Y!&-joD&8`B&$~ zi>(zX%LRNfzal8by)B=Or$#ZiDTSw$tgT{Z_S^u4H%IbPicO3GXj8by20qR6hkDXP z4L%hx1gB_1zzjVhX9ZaUXr35>WW}MXHRoJGf(_h`14K}31<>;#aWhU5f1GD_$ED(o z3;!t?im;QHd6Bq>ot^}v;Lt$r7rjt-#UQVgC@^Kv1N(tD3Je}{Vt@|U1p|Y~%?e8p%Z9fLg!|LD*?cI!){+jn8sFbi00000NkvXX Hu0mjfOud$j literal 0 HcmV?d00001 diff --git a/images/shiny/Swablu.png b/images/shiny/Swablu.png new file mode 100644 index 0000000000000000000000000000000000000000..19e3ddd97697863a3876add466248c063551c8a1 GIT binary patch literal 494 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 literal 0 HcmV?d00001 diff --git a/images/shiny/Trapinch.png b/images/shiny/Trapinch.png new file mode 100644 index 0000000000000000000000000000000000000000..870d10fd92e61f56b91965f8613cc981a6d6797e GIT binary patch literal 369 zcmV-%0gnEOP)VVS0BdIP%q^L)73AWy>e zy$v}?@}1|Cw+kpQ1s!53aCTsu5l~bEgU4Pj?4{J7fT9q{vp{NaA#fHX)X|7SKqsqf zKXE&NEfIVih-<)L38;L<7ZzUzs09{ufdRsmgGA^7z&1ptDHX1q2V5vzxk<__yv6Gt zbl~$s7@q9bfI^^)(QrF30-KkLIC#w2_MP2cN^EF!o9*4Ww#OT7>;Z#Z*$cdF-VSRY zqhdffyn0>N2urdcO8bE5`mKUe0K%LD1CA)2V!xio1r;P)6ugP&k-CC=d`3I-D~f00001 zbW%=J06^y0W&i*Izez+vRCwC$*UOITFc1V#597EoRd)UV-(I@q1lZ)^S=EVqYn}j z00M}<7HaN42;^tc?}E$y`wHOamrp=5KxA1af#n5g6378yS+v|w1LP*;6?g_`0cKnG zKL%j9-vKbKkq)lDpg7Og0Ph1R@9hkcMkp+U(dcb%fF#-uz!)1!>j+>a>#Lt#r1mxd z&5T0;SUk}mCIRe>ASqT&l73XTK1s<)z`w`)cpy|M6_f~A1dx<=BZ(L%vzCI$Kws@M z2vBdu1us)xz7jXe?RF~wX74Wb=Bc34T*?5TG(SMBfqw;{{{)0k>okx`t+kX2a1yA+ z0|$C*t?R0zI{NLIhv%XpN&uj?3SnFUC^3L{LMe6ivp^R>wGTpiJerRC6y<HFIA&0+ol*X<^^`SwVF P00000NkvXXu0mjfbk+d- literal 0 HcmV?d00001 diff --git a/images/shiny/Tropius.png b/images/shiny/Tropius.png new file mode 100644 index 0000000000000000000000000000000000000000..6f0b575e41544cf066751df9c5d5aac9069c9b5a GIT binary patch literal 1036 zcmV+n1oQieP))N4-{-Yq zE@b%@GvEF^R;zFSLjd?@e@L4lV;SXt>wmFZOSN@XlD``eY|!;Mw3Ky~_2(W**Ouet zMWmD>>!g4!0PNp5knoXFiL@S<0b7M_b=>X=cNk_9FX}xm!wFZ^>TTZ@7&riPyeO%q zNQmAH)r0oP0E3V6IQMRVsro!g=Vt?|$6ArC0?8jyz?%RxApu8*fsHmpGoWTRz?^SE z-Od1%ec#itP$Db)T>lwtTkwW08|-0-*7{aq47^=Et^#;i@W%blV5Auwg)2gkyzybl zJ1s7-CSXZH-bYU;ngAiN2SppNl;`u=1XG2=ypL94U2zpK(IN!QL@4`dAaMzbw4@>V zRD^*3)blSh74a2t0RY$s!9q4R6?XDW{`Ha)g2yQ^H*gk2Sg#WBBObaIp}t-(EzVQ# z1R0W@uhowa@;EKxypcEs#1ObY1wCvuQiJv!M-Q`QAxHq0iy-SHh_KVu;Z!Jj?rkAF zSz#88&^qo3g(nPO1w(;=CWTD`SyQ0F&5GoQVm73pl&Qd^NO)GjhCtVO2HzDpoa+LW zN$^Dh|E(2iFj(-p1h-*2kR^^Zm_gR5z;}nUVW8Qz1^-=;4jM8C;&V!)z!3Z@G3Qf| z1$6l}Y?iGBrSpZq(J}hT*D$E_zYBo=spEV-H|@Oshy$?rPwPLmB5*1E5wF45#(OmQ z!r$-;3&DssUcccG)J05(Q1bM6qyT|>OJ05(oNf3vJ-3qMZNM3`Qc^JSu zdIL~9KLmrn5d=L3cU~sJ%!4249Nc3RkuJdCj{_l?@Sq*9S-|pv)8pu9RfFSAV4U9R z(Bf-}r7X+kjLS0~5r1Q>B0*n3;HMD4HG1Mkdf9<|_ z2H#_(jA)EsB3e)B*;L&!DyWoZ|>etOLgrRV}A^9#&v%xIL^mE_&X%Zx37a0w7 z@DXjNDm`32Mnygg{DN}fEuUfMNexfKEpSN5lQv8=Uc%-&nT!ob^E?^{uAEtH^z_OdH)7w>0YwEVNbmP0000ad&z^WkfQ80xE)cvl27Zj~f1FHP+)%oG)>eoUW0Rm0e zoyo!10nXmG`~SJ0-QdmhPrsAYTFeOzEeYjp>a)2$sUf(S2 zl;XY!L1F6lQz*ePGnP`ITcCS?3aKW{4-ZoUw?MBRLn$%DU?a@~*aKjvPL>o>sDXKA z9Z)FJa}Om1aIlE_ z=fKcb5OnRZoCYd@b@=010bPOSkITs^>kKR*`(gPh(DdSm#r>ziG8P^oK*gQ>IuOQ6 zSO67@_^`u{z%srEGX6P$b_IgP7)wC?a{z_iUSSBqAX7XBOxA#31#AhS`66+8J5Hkc z*8#@md z4L$faTtS&0Aq47F{m+7;3~*BbNinDM4ZQ(AvM)B)OHkpL11KeB zfRyGLP!;=b08R5W#kuHn0%`W;0GeWqb0wkjZ9vl;tA6k?_Z29jid4XX^nbw4d`L#s zOjWU?`hURGP6ucOYNgqQl;9u!ML?8<9>F1C-2C$ZQ7T80?|RAOB0!Oo!0gR7qQK!| z0wW3e2qd=xR_rPuW)Pvi10=@|%}x@;7ATYI5s>b9!>)Fy+d>u%io4Qqi~aC5Ww-%y6P0n}Bu0DTh-APK;33+wLYX6D=j8)i3!{h&La z$H3EJFz+oqGq1x=z;eN!L}$UOzvKRVf>vI=g?fd@1iZY48>}YI&iTFE@XnL}07o7o U_h1VMD*ylh07*qoM6N<$f~Es#2LJ#7 literal 0 HcmV?d00001 diff --git a/images/shiny/Vileplume.png b/images/shiny/Vileplume.png new file mode 100644 index 0000000000000000000000000000000000000000..d9adc55e0a34e6edd66344b3a77c149fa196b2c6 GIT binary patch literal 648 zcmV;30(bq1P)I&xPUNlm}sb27)WqHAV?Sx5D*TzMD73p00DGTPE!Ct z=GbNc00In2L_t(|+U=LoZlo{}1i=gpZruO>yJx%cS%f7A+|!*>PZ8Rx%#28+9e((q z0V}{e8wep-#vR~uJp}pVXkOqm-?E+6iVL=lZuy02+U;?yzFVk({DUrR*TD)*Q`N=5 z?`#tQ=}rbgn(cnsjaRzqbOPiYD8fv)#??_ZrV90hTmw1J>$;L*rF#!JKKVhk6FNgE zexZ)gFXGPceBqo!=qtM~=8fc%&0UQHvC%sWLJ*__p_hSK`G36n>(-fGHe;Oe( zPUX3M3`~8gZDrOkPo+($j6i3r!HfvpujmncR#!n4LM#5ll(Iz zYe3=wS#%-)Bh-|~LYo`?QXHa_=v;xQHmq2r;wV z3k;-m0KK5Z&0}&Ah8{@NDLLE^XoW;-0v3i_Fm}HjjtUI-*>tdiF0U8iKHOp>#o}s! z2QV9ZU@K7m1DHjTbim;;Z0LY*pv3gI0lp1r`4)Pvr~dZvxv#%m`EN+E`L6>R`R`~i i&wCQdpD%9z3cmo%D~Pyhe`;2mwm00001 zbW%=J06^y0W&i*JDM>^@RCwC$m(g?FUx*wQdC93mTi0)?#oagC1gB|=FxQzRwA^!V(_P}W5UU(Up4Po<5OxdbAtWbVl#6A66O0fabb*1ltQp#$C5h&@rB2hO-E2ZoK#>>Fn z0#A|iB8&jhZG{mii#3>EwLFiUi72J!M+z25t3YkOp;grju6u!Cfx88SUjz>IfF)3C zMJZOux!nvDZuiCY7XdHa{()LSA*N1TFCBULL}?SKT0kMmMi_cO`CT90})esw*StwF# zSVTmiilrYft%ho0F+WBc1gQHf=tAuQMe=`vF$37~dq54G22DS^z7dGf;it3F^^|e! zK+ysY0P2C%!LbLm0OWZdiC_KwfEB>SZ#;>V1{wPWf^rc7tUyG=S7SSYA}+uKPDbwv> R-;w|T002ovPDHLkV1kv9HERF> literal 0 HcmV?d00001 diff --git a/images/shiny/Voltorb.png b/images/shiny/Voltorb.png new file mode 100644 index 0000000000000000000000000000000000000000..37fc0d7f45612de537227914d197b055b2db9071 GIT binary patch literal 346 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 Bqs9OL literal 0 HcmV?d00001 diff --git a/images/shiny/Weezing.png b/images/shiny/Weezing.png new file mode 100644 index 0000000000000000000000000000000000000000..3bd1780411e3d1926547369bea80321e549d6383 GIT binary patch literal 876 zcmV-y1C#uTP)pg+dKN*esKE zfFeKv6!i=!{(YWr{J>S9Q^ZsX-j-q|kV-cE3sA2-$v8`(NS8`C0x5x#!oL76k!%5i zJMLmF0NuYXFmSXN1{Pca$?zT1EeKv;TAWnjT)&T%AWMPnxB7j^y>8~GKvMWW2f^R? zIu-u%USV6-^_@cdguhI0jj$|lJ%(*smgS%R+Wi}JLm)81+YCJb0000&LfWY9W==gw;sQCE!kcgPrU@-W2P_RHSEOc&y00001 zbW%=J06^y0W&i*J2T4RhRCwC$m*I}$FboFsrLF@Dj^F=n&vuiDWgF;Kx|3F7RP_hS zOr5p@kv@F*-{hR*bXKQzT>(20PWkHtX9_e4obVm|zQ8C{!~By^0jO0~Yd!fKk zLIk|g0`5;nkf!&Twm>2a@JclTDNxz-^?4qTj6E#wZw1jLZ~XzY2TUCSA5;$b*)Tgd zWF81#e%RzJ%d!^`oevQ9LQYRi0y97CyE76!u;e8QF9*of{ZSYJFJS)-c<_Vnk3jfd zh`@XRj@=76()|&L2`~)|pDI4P_zvBS?*SQ4J{y=H_V=X86e+afkrl{Z9&cN0F#2h zs$CesaDN2mL#QRPFYmBH>skt$-=>-tpc+5_yg{@EQBc>~jhO|IGeWo;>%d9{E-}F5 zEI^tCP?#QFw+%L5eIE$Y1Q@oO*ywJ+qNW>2Z$Wv6n53cU0P0unkgD?K!kdnC1oGwD z5TgZvbkP3-Adk@H%18C&m)mZq)>^m0`Evc@bP&3fz7`u^yK$c$jdwaM)OIK!{klFhE#XXecN+a0nRg=1@@p0004WQchCW$l z^n>|v6q3HXKl;9uM*8l)46dYquy3{2uYua_?jz7S=0vxXc&+^^xZzXX+^+yf~X9&Ri{k9+p0B;23w*k!uT?+sdCd~lo2yCgO zD-j9o2ZGH39Vvj~ptMW;N)jihdxhY1fpv2qWb+$c+yjtp)j{)esbD}yClBf(u*%*>h0h`>;waG+3t5O6>kNEk>E5D)=Mu?_$L00DGTPE!Ct z=GbNc00HYsL_t(|+U=LouA49r1#OdMv*Dco|J`oZP9d#>joPQH%o8BZXt4o_^yOz^ z_OF3rcn<;>1Em}c6X#L^#layb5aG2EXvM06@Gk~XNS4Aw0G$9Tp8_o65~PUhFykMt zl?wa!u#ps@2Le?!?zV||n9hd)$`%FX9#Gb4!w#9-w)Oo4u_!2^dqCBY5cZiLKsPVA z0@dal)N#Mrj#a-O(9NMjUzpXvK@b1D0Kv=0%iqFQ6}o>~Q1?Y(!S9f{u8!;H016j9 z0mlshrVTJn0LwYA*0urJvFNxy1@iKELUX=BN7#eqlV!Mgr8UBNbH5`bIyO~f?os?=oeJUkuM0pUr^XEp#4Cu zzMA38k4Gi^en36I(|{@?&@JdNkVvL+U;rfd(f<@c8ezH5EdoeG@WH>eI~aqL0MZ2P z`?r07>xJ9AA25{N4s6;7jJLl~1Lt%T2YA<41)Ukcl=kJqx&u<5fYZJMfB_KK0*(Sw zeZ0@RCk&%P49d>RPQQ)h$IWpDfl=G}{#JeI^9$GWB9#H~@gx8M002ovPDHLkV1m0b B8OHzs literal 0 HcmV?d00001 diff --git a/images/shiny/Wingull.png b/images/shiny/Wingull.png new file mode 100644 index 0000000000000000000000000000000000000000..644fae6b776ba6b78bfaa22b3ac8ae32dd396ef6 GIT binary patch literal 425 zcmV;a0apHrP)s4#fQSb&(I*nj|7m^fx;W{6l2C}=1%Gcy1H0HX_FUH||90d!JM zQvg8b*k%9#0V+vEK~#9!?bXq0!!QhmVaro|V%gIBKkj5T8zo!ZExQ`{gHQ;Zza$uv zmStJ~2Otf--<&gPf}~!0tuG=7r+Y-C;uk> zo)Q4sns+So0YLhdwr`Eu#`IRBy=~jxcreq?Cu87;e?RsS5c6Nt*arap^_$py-`Xx_ zUTc2K6PXU{t3cnNV zRVWiApgVR$1UM|LYSq#KnBGtH?+Lg?-}5$LHU2;4Zm=PPw_aWkl{-Xqa_+x@l{zU_Ict`MV1;(2d@Lq)`@Rut9V0h-$3IL3{ z&)cZLKM5=`mgQ9gRzWpzP~dxm@~J%T+|C;$XoeUS92&@=U*`>ACS}Yljlz4Lxw!|^ zIT&{&2wD=ha`MikCyPyrPS@+@GIbQl#3x`==CX3lj_HX3p~{8k0!)T!%}@FBy#e7> zfCr3L9BS}X5bh6gD+lI?90lv_zt$uGl9qu4nW8XzzW-WNNevPpTc&p&i52dqNum50 hJT76Gzjwl4%YWYYI_KOZ6Bhsg002ovPDHLkV1oLI1l#}s literal 0 HcmV?d00001 diff --git a/images/shiny/Wurmple.png b/images/shiny/Wurmple.png new file mode 100644 index 0000000000000000000000000000000000000000..86297fbf18205e9491c276ff3f77b8e8ff331dce GIT binary patch literal 478 zcmV<40U`d0P)?B4nR-yPGS&#mWSX269MDeOg>NHM*gnhMuI0G+%Py$kcjS~9keHth?!0Ok?-aDrtkt!leU*HBy ziw1T^y<|uPj-^EboM|{jg4kGuI5|$pLyIG#JAxUX3fuzmO|A-@kSKKulw6)d;sM83 z=ByLu3}9^vjPeor8Wpf+18li~OF~kj1!@Lc9s)szgmSTSD?^23Ss({wF#rGn literal 0 HcmV?d00001 diff --git a/images/shiny/Wynaut.png b/images/shiny/Wynaut.png new file mode 100644 index 0000000000000000000000000000000000000000..02e369369d99ce42832c12a6bb8a3b2c36ca031f GIT binary patch literal 463 zcmV;=0WkiFP)3`4K&rrjX_|GirpU3i+-bbI7Tr~=hT4k{9_hlhusVeprH z`$oimejJZ2^c6Kw+u}7EAYPz+Be`f*p|Ukq1_HpYrti&YTnvJZ;0|) zPIeDeYyK9vZwz70(;&Iz^$J954J}eLTCHHxJ^l?U0+|9D<^owo0Kw2L;=RKNP$&sV z^xlCU3=EJ^!C*%8WQ-B2ssOZ1e*|L+xGpeqR)}~StSAscoB0GR3&QXg^bz?GSVaI5 zW5z+!JOuKB;05Ca`~`AZfJR!Z=`cht1jM=^_8OC!%R8?KAc;Zdpj532i2Nci1GHQr zw^|Fbg%D5ID_9oDd{V4113;rh@H_<&VIT;2C<*`c&m#;A zI7xFO5o-YWc^td0kg#R!r_!ZwRyddBOK1o)Z*fuK*^1R@%00`@U*15Hu__?90)HaX}n7 z_6}_08_WPZwr#`8lK`N)1I&{^QvQ-^t37&xe%&i-T)6F1uSjv>+9%WrL0`3V+2bz( zv@HB+?pTJn&#LKQGD-$bZOkAOD^WX^8-YdMTph`lsry&3Y>ePLpWa{ zX9oi5*n41RI)GvkfPFv8pfJ$b_n!>_F@UZLQSc)ubEB(F3527u)S)bT*1*B$}<70m1o*mD42b^zA{g98BqKLDgy_+E-u zrJJRctV>VvY84SeDw*V{))dOb>qyBAa7!$g^teJ)eLgw~B0^wq=lm-69SwN@+4^sN Y0137n)0=bH-~a#s07*qoM6N<$f~za#r~m)} literal 0 HcmV?d00001 diff --git a/images/shiny/Zangoose.png b/images/shiny/Zangoose.png new file mode 100644 index 0000000000000000000000000000000000000000..74333b0b74cd36bae601daefef7da446ce54e396 GIT binary patch literal 747 zcmVAZx2w7cYPs(h?%wVF{R}G9T-dw zz~Z{2_k3aM0IP3zkFXO7fTm>AJ=y8-Gn6>6ETUILG#^!yQMB* zi{qwH`@u8kDh{Q1)U&3-pk`chTv!cMk0<0V>Smo z>PNm1F?C{!7{{2i1P2Xf$vIR%TnunOMS_!E4~^C4o{{kE3&0e+@6;M#VP)7u5Bb0c zQ|h`yTmxd=9|Y&fFV%N9HlONCJO;Mrhb|B7$=7wj3T*)$1%!?K>?b%JhfnPgYawZA z{h2Uh6+~|Mh@O9qEPkA-p|cn;>S>O9%wmt(Cs$Ri6Q|$J>oXuky6jf&}rv`&j+@ d`w#Tj`44Ui9~p@ba(@5-002ovPDHLkV1hPTTu1-_ literal 0 HcmV?d00001 diff --git a/images/shiny/Zigzagoon.png b/images/shiny/Zigzagoon.png new file mode 100644 index 0000000000000000000000000000000000000000..a8fa1f211ebe71be36ec1d3a02b053afd2994ed1 GIT binary patch literal 708 zcmV;#0z3VQP)C{J|MwQzrI0f7nt5Gx(Hs&M4Ci2L$V}RY4s!GUVa|je49gejA1?orcY}5s^K$H&>hGn-=U2|EilSoP>YD` zu}}93Aae~LaK8!xpS-@lPr@^!{7EdGTHw@i`AvYI zhP^8_Gs#L6Zv__FpuKky)oR4MeuK#LkzM;L99Aloe9P}pQAJ5z^$1{E%zSHvEt4I6 q-J0mQN!i{cFDXC&=RSP+@Av_nvmlyIDbSbz0000B=`Afkv-(&ZoYj22S+GZw3U__=i5bT@46+ zE~vz=&-3Mg_6C)5_#Fe9BUGr}pVMWa6iF29094-r#zm({em;VdIxiqw-@p|qUkCUu zAc@pfV4u(ilomv~Syw{V2J(Vv){$r?fU3Sjc8%HzssXRn-U1pQ){Xv~Ak_fu20A8) z5l~7!KB?C)2T$D-QgZ8n5yEQ$TJ@aKH^AKeNPwh*?(?k90p>Y*kT6OBh@hwJa~;rG za3`fwO2q2dKpoJB&z_x8{fO$Pl0Lek;a0C*!{o)sl3T#*2hx=~O(;S+JCzo3m; z*oh#mm+66phom_C2&y~qfra&<*T9V%fE|%&0(TOk#I3-afoYmh;l@3Gs{RKAGweR^ z1Rhudk3d}`sxHy32^HHAu|2-Ycwke%9}qPbplmRJu>iHd2L=rKV;A5EjUgKZf4^}* Zn|~8#8j@V;?u7sV002ovPDHLkV1jqU?S23N literal 0 HcmV?d00001 From f4950b7e90cc799ebfa417fb5ffc2e3fc9fe6373 Mon Sep 17 00:00:00 2001 From: Cal <43823915+CalRL@users.noreply.github.com> Date: Wed, 12 Nov 2025 18:48:04 +0100 Subject: [PATCH 24/49] log to terminal in debug mode only --- src/logger/mod.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/logger/mod.rs b/src/logger/mod.rs index 562ccde..ec4e336 100644 --- a/src/logger/mod.rs +++ b/src/logger/mod.rs @@ -153,7 +153,9 @@ impl Logger { if let Some(mtx) = Self::sender() { if let Ok(sender) = mtx.lock() { let string: String = message.into().clone(); - println!("{:?} > {}", level, string); + if cfg!(debug_assertions) { + println!("{:?} > {}", level, string); + } let _ = sender.send(LogMessage { level, content: string, From e814ef1985a6535ca8f8830b4d1cbc9b48191f42 Mon Sep 17 00:00:00 2001 From: Cal <43823915+CalRL@users.noreply.github.com> Date: Wed, 12 Nov 2025 18:48:12 +0100 Subject: [PATCH 25/49] Fix path --- src/ui/screen/single_screen.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ui/screen/single_screen.rs b/src/ui/screen/single_screen.rs index 98b4d6c..db33ec0 100644 --- a/src/ui/screen/single_screen.rs +++ b/src/ui/screen/single_screen.rs @@ -454,7 +454,7 @@ impl ScreenTrait for SingleScreen { } if data.is_shiny { let res: Response = ui.add( - Image::new(format!("{}/shiny.png", get_images_path())) + Image::new(format!("{}shiny.png", get_images_path())) .corner_radius(5) .bg_fill(Color32::from_rgb(50, 50, 50)) .fit_to_exact_size(Vec2::new(16.0, 16.0)) @@ -472,7 +472,7 @@ impl ScreenTrait for SingleScreen { } } else { let res: Response = ui.add( - Image::new(format!("{}/non_shiny.png", get_images_path())) + Image::new(format!("{}non_shiny.png", get_images_path())) .corner_radius(5) .bg_fill(Color32::from_rgb(0, 0, 0)) .fit_to_exact_size(Vec2::new(16.0, 16.0)) From bfd7c9c2117663e87166a9c6a6b3049db47f653d Mon Sep 17 00:00:00 2001 From: Cal <43823915+CalRL@users.noreply.github.com> Date: Wed, 12 Nov 2025 18:48:24 +0100 Subject: [PATCH 26/49] Fix generator on non-windows --- src/utils/generator.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/utils/generator.rs b/src/utils/generator.rs index ae2dd28..0d346ab 100644 --- a/src/utils/generator.rs +++ b/src/utils/generator.rs @@ -1,3 +1,4 @@ +use std::io::Error; use crate::logger::Logger; use crate::pkmn::Move; @@ -88,7 +89,7 @@ impl Generator { } #[cfg(target_os = "windows")] -fn run_generator(settings: Generator) -> std::io::Result<()> { +fn run_generator(_settings: Generator) -> std::io::Result<()> { use std::{env, fs, process::Command}; let path = env::temp_dir().join("generator.exe"); @@ -102,6 +103,9 @@ fn run_generator(settings: Generator) -> std::io::Result<()> { } #[cfg(not(target_os = "windows"))] -fn run_generator() { - Logger::info(format!("Generator not available on this platform: {}", std::env::consts::OS.to_string())); +fn run_generator(_settings: Generator) -> std::io::Result<()> { + let msg = format!("Generator not available on this platform: {}", std::env::consts::OS.to_string()); + + Logger::info(msg.clone()); + Ok(()) } From 6cc0ca0102fc7e605833d2344f07cc1fac825e48 Mon Sep 17 00:00:00 2001 From: Cal <43823915+CalRL@users.noreply.github.com> Date: Wed, 12 Nov 2025 18:53:26 +0100 Subject: [PATCH 27/49] add build.yml --- .github/workflows/build.yml | 79 +++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 .github/workflows/build.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..0b0c68b --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,79 @@ +name: Build + +on: + workflow_dispatch: + push: + branches: + - main + - actions-test + tags: + - "v*" + +jobs: + # ---------------------------- + # Build Linux Binary + # ---------------------------- + build-linux: + name: Build (Linux) + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Install Rust + uses: dtolnay/rust-toolchain@stable + + - name: Build release binary + run: cargo build --release --target x86_64-unknown-linux-gnu + + - name: Strip binary + run: strip target/x86_64-unknown-linux-gnu/release/gammaeditor + + - name: Upload Linux binary + uses: actions/upload-artifact@v4 + with: + name: gammaeditor-linux + path: target/x86_64-unknown-linux-gnu/release/gammaeditor + + # ---------------------------- + # Build Windows Binary + # ---------------------------- + build-windows: + name: Build (Windows) + runs-on: windows-latest + + steps: + - uses: actions/checkout@v4 + + - name: Install Rust + uses: dtolnay/rust-toolchain@stable + + - name: Build release binary + run: cargo build --release --target x86_64-pc-windows-msvc + + - name: Upload Windows binary + uses: actions/upload-artifact@v4 + with: + name: gammaeditor-windows + path: target/x86_64-pc-windows-msvc/release/gammaeditor.exe + + # ---------------------------- + # Package Source Code + # ---------------------------- + package-source: + name: Package Source Code + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Create source archive + run: | + mkdir -p dist + zip -r "dist/Source code.zip" . -x "target/*" ".git/*" ".idea/*" ".vscode/*" + + - name: Upload source code + uses: actions/upload-artifact@v4 + with: + name: "Source code" + path: "dist/Source code.zip" \ No newline at end of file From 9a93b0aa1a5f84fc5a236f4f850ba83a630d442f Mon Sep 17 00:00:00 2001 From: Cal <43823915+CalRL@users.noreply.github.com> Date: Wed, 12 Nov 2025 19:07:40 +0100 Subject: [PATCH 28/49] update build removed linux support, as full game can only run on windows --- .github/workflows/build.yml | 43 +++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0b0c68b..027c61c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -13,27 +13,28 @@ jobs: # ---------------------------- # Build Linux Binary # ---------------------------- - build-linux: - name: Build (Linux) - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - - name: Install Rust - uses: dtolnay/rust-toolchain@stable - - - name: Build release binary - run: cargo build --release --target x86_64-unknown-linux-gnu - - - name: Strip binary - run: strip target/x86_64-unknown-linux-gnu/release/gammaeditor - - - name: Upload Linux binary - uses: actions/upload-artifact@v4 - with: - name: gammaeditor-linux - path: target/x86_64-unknown-linux-gnu/release/gammaeditor +# Linux is commented out for now as the game itself can only run on windows +# build-linux: +# name: Build (Linux) +# runs-on: ubuntu-latest +# +# steps: +# - uses: actions/checkout@v4 +# +# - name: Install Rust +# uses: dtolnay/rust-toolchain@stable +# +# - name: Build release binary +# run: cargo build --release --target x86_64-unknown-linux-gnu +# +# - name: Strip binary +# run: strip target/x86_64-unknown-linux-gnu/release/gammaeditor +# +# - name: Upload Linux binary +# uses: actions/upload-artifact@v4 +# with: +# name: gammaeditor-linux +# path: target/x86_64-unknown-linux-gnu/release/gammaeditor # ---------------------------- # Build Windows Binary From e33b60cdaabeb6f4f34bd77789992c3a25966213 Mon Sep 17 00:00:00 2001 From: Cal <43823915+CalRL@users.noreply.github.com> Date: Wed, 12 Nov 2025 19:07:46 +0100 Subject: [PATCH 29/49] format --- src/app.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app.rs b/src/app.rs index b48a061..658d935 100644 --- a/src/app.rs +++ b/src/app.rs @@ -146,7 +146,7 @@ impl App { } #[derive(Embed)] -#[folder = "images/"] +#[folder = "images"] pub struct Asset; impl eframe::App for App { From 5143a9c89aa48b58f90728b282f786921e6c6fcb Mon Sep 17 00:00:00 2001 From: Cal <43823915+CalRL@users.noreply.github.com> Date: Wed, 12 Nov 2025 19:08:44 +0100 Subject: [PATCH 30/49] cargo fmt --- src/main.rs | 2 +- src/save/mod.rs | 1 + src/save/pokemon/mod.rs | 5 +++-- src/save/pokemon/pokemon_classes.rs | 7 ++----- src/ui/image.rs | 3 +-- src/ui/screen/party_screen.rs | 19 +++++++------------ src/ui/screen/single_screen.rs | 17 ++++++++++------- src/utils/generator.rs | 27 ++++++++++++++++++++------- 8 files changed, 45 insertions(+), 36 deletions(-) diff --git a/src/main.rs b/src/main.rs index 9e0541f..8ab6a27 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,8 +1,8 @@ use eframe::NativeOptions; +use egui::TextBuffer; use gammaeditor::app::App; use gammaeditor::logger::Logger; use std::process; -use egui::TextBuffer; fn main() { Logger::init().unwrap(); diff --git a/src/save/mod.rs b/src/save/mod.rs index b9c70c1..a4e01d8 100644 --- a/src/save/mod.rs +++ b/src/save/mod.rs @@ -8,6 +8,7 @@ use std::path::PathBuf; use std::sync::{Arc, RwLock, RwLockReadGuard, RwLockWriteGuard}; pub mod pokemon; pub mod utils; +pub mod backup; pub type SharedGvas = Arc>; pub type SharedState = Arc>; diff --git a/src/save/pokemon/mod.rs b/src/save/pokemon/mod.rs index d8ee61f..74aa949 100644 --- a/src/save/pokemon/mod.rs +++ b/src/save/pokemon/mod.rs @@ -59,6 +59,7 @@ impl SelectedMon { pub fn correct_name(name: String) -> String { match name.as_str() { "Metacross" => "Metagross", - other => other - }.to_string() + other => other, + } + .to_string() } diff --git a/src/save/pokemon/pokemon_classes.rs b/src/save/pokemon/pokemon_classes.rs index 84f24ce..ee9853c 100644 --- a/src/save/pokemon/pokemon_classes.rs +++ b/src/save/pokemon/pokemon_classes.rs @@ -61,8 +61,8 @@ impl<'a> PokemonClasses<'a> { pub fn classes(&self) -> Option> { let array: &ArrayProperty = match self.property.get_array() { - None => {return None} - Some(arr) => { arr } + None => return None, + Some(arr) => arr, }; let mut strings: Vec<&String> = Vec::new(); match array { @@ -75,9 +75,7 @@ impl<'a> PokemonClasses<'a> { } _ => {} } - } - } _ => {} }; @@ -85,7 +83,6 @@ impl<'a> PokemonClasses<'a> { Some(strings) } - pub fn parse_class(&self, class: &str) -> Option { parse_class(class) } diff --git a/src/ui/image.rs b/src/ui/image.rs index 5a6f375..15df40d 100644 --- a/src/ui/image.rs +++ b/src/ui/image.rs @@ -1,9 +1,8 @@ use crate::app::Asset; +use crate::save::pokemon::pokemon_classes::parse_class; use crate::save::pokemon::{correct_name, StorageType}; -use crate::ui::screen::render_pokemon_path; use egui::{Color32, ColorImage, Context, TextureHandle, Vec2}; use std::collections::HashMap; -use crate::save::pokemon::pokemon_classes::parse_class; #[derive(Clone, Debug)] pub struct ImageContainer { diff --git a/src/ui/screen/party_screen.rs b/src/ui/screen/party_screen.rs index e7678e4..f3fd730 100644 --- a/src/ui/screen/party_screen.rs +++ b/src/ui/screen/party_screen.rs @@ -4,15 +4,15 @@ use crate::save::pokemon::pokemon_classes::{class_at, parse_class, PokemonClasse use crate::save::pokemon::shiny_list::get_shiny_list; use crate::save::pokemon::{correct_name, SelectedMon, StorageType}; use crate::ui::image::ImageContainer; -use crate::ui::{render_image, render_texture}; use crate::ui::screen::single_screen::{SingleScreen, SingleScreenBuffer}; use crate::ui::screen::{render_pokemon_path, Screen, ScreenAction, ScreenTrait}; +use crate::ui::{render_image, render_texture}; +use crate::unwrap_gvas; use crate::utils::set_data_persisted; use egui::{CursorIcon, Direction, Image, Layout, Response, RichText, Sense, TextBuffer, Ui}; use gvas::properties::Property; use gvas::GvasFile; use std::ops::Deref; -use crate::unwrap_gvas; #[derive(Clone)] pub struct PartyScreen { @@ -33,7 +33,7 @@ impl ScreenTrait for PartyScreen { Logger::error("Failed to create classes wrapper"); return; } - Some(w) => {w} + Some(w) => w, }; let classes: Vec<&String> = match wrapper.classes() { @@ -41,9 +41,7 @@ impl ScreenTrait for PartyScreen { Logger::error("Failed to get names"); return; } - Some(v) => { - v - } + Some(v) => v, }; let Some(parsed) = wrapper.parse_classes(classes) else { @@ -70,7 +68,7 @@ impl ScreenTrait for PartyScreen { Logger::info(format!("Failed to get parsed at index {}", i)); continue; } - Some(class) => {class.clone()} + Some(class) => class.clone(), }; let shiny = shiny_vec.get(i).unwrap().clone(); @@ -101,10 +99,8 @@ impl ScreenTrait for PartyScreen { for option in self.containers.iter() { let container: &ImageContainer = match option { - None => { - continue - }, - Some(p) => p + None => continue, + Some(p) => p, }; if let Some(tex) = app.image_cache.get(ui.ctx(), container.path.as_str()) { let image: Image = render_texture(tex).sense(Sense::click()); @@ -137,7 +133,6 @@ impl ScreenTrait for PartyScreen { } else { Logger::info(format!("No such image: {}", container.path.as_str())); } - } }); }); diff --git a/src/ui/screen/single_screen.rs b/src/ui/screen/single_screen.rs index db33ec0..cfead18 100644 --- a/src/ui/screen/single_screen.rs +++ b/src/ui/screen/single_screen.rs @@ -327,8 +327,8 @@ impl ScreenTrait for SingleScreen { let idx = match app.selected_mon.clone() { None => { Logger::info("Failed to get mon.idx"); - return - }, + return; + } Some(sel) => sel.index, }; @@ -337,8 +337,8 @@ impl ScreenTrait for SingleScreen { Some(l) => match l.get_shiny_at(idx) { None => { Logger::info("Failed to get is_shiny"); - return - }, + return; + } Some(s) => s.clone(), }, }; @@ -346,8 +346,8 @@ impl ScreenTrait for SingleScreen { let party = match PokemonInfo::new_party(gvas_file) { None => { Logger::info("Failed to get mon name"); - return - }, + return; + } Some(c) => c, }; @@ -414,7 +414,10 @@ impl ScreenTrait for SingleScreen { ivs, }); self.loaded = true; - Logger::info(format!("Loaded info in SingleScreen for: {:?}", parse_class(class.as_str()))); + Logger::info(format!( + "Loaded info in SingleScreen for: {:?}", + parse_class(class.as_str()) + )); } fn ui(&mut self, ui: &mut Ui, app: &mut App) -> ScreenAction { diff --git a/src/utils/generator.rs b/src/utils/generator.rs index 0d346ab..0fa7fba 100644 --- a/src/utils/generator.rs +++ b/src/utils/generator.rs @@ -1,6 +1,6 @@ -use std::io::Error; use crate::logger::Logger; use crate::pkmn::Move; +use std::io::Error; #[cfg(target_os = "windows")] pub const GENERATOR_BIN: &[u8] = include_bytes!("../../bin/generator.exe"); @@ -62,10 +62,22 @@ impl Generator { args.push(format!("--form {}", f)); } if let Some(ivs) = &self.ivs { - args.push(format!("--ivs {}", ivs.iter().map(|v| v.to_string()).collect::>().join(","))); + args.push(format!( + "--ivs {}", + ivs.iter() + .map(|v| v.to_string()) + .collect::>() + .join(",") + )); } if let Some(evs) = &self.evs { - args.push(format!("--evs {}", evs.iter().map(|v| v.to_string()).collect::>().join(","))); + args.push(format!( + "--evs {}", + evs.iter() + .map(|v| v.to_string()) + .collect::>() + .join(",") + )); } if let Some(moves) = &self.moves { for (i, m) in moves.iter().enumerate() { @@ -95,16 +107,17 @@ fn run_generator(_settings: Generator) -> std::io::Result<()> { let path = env::temp_dir().join("generator.exe"); fs::write(&path, GENERATOR_BIN)?; - Command::new(&path) - .arg("--example") - .spawn()?; + Command::new(&path).arg("--example").spawn()?; Ok(()) } #[cfg(not(target_os = "windows"))] fn run_generator(_settings: Generator) -> std::io::Result<()> { - let msg = format!("Generator not available on this platform: {}", std::env::consts::OS.to_string()); + let msg = format!( + "Generator not available on this platform: {}", + std::env::consts::OS.to_string() + ); Logger::info(msg.clone()); Ok(()) From d1f5a0f16239e65c22589c9d8f857d0387dcc4b0 Mon Sep 17 00:00:00 2001 From: Cal <43823915+CalRL@users.noreply.github.com> Date: Wed, 12 Nov 2025 19:09:06 +0100 Subject: [PATCH 31/49] fix backup --- src/save/backup.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/save/backup.rs b/src/save/backup.rs index db36e06..241f847 100644 --- a/src/save/backup.rs +++ b/src/save/backup.rs @@ -1,8 +1,5 @@ use std::fs; use std::path::Path; -use tauri::command; - -#[command] pub fn create_backup() -> Result{ let local_appdata = std::env::var("LOCALAPPDATA") .map_err(|_| "Could not find LOCALAPPDATA variable...".to_string())?; From 7491f9724c446ad0ab6fb6461e944482e385dca4 Mon Sep 17 00:00:00 2001 From: Cal <43823915+CalRL@users.noreply.github.com> Date: Wed, 12 Nov 2025 19:11:41 +0100 Subject: [PATCH 32/49] update build --- .github/workflows/build.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 027c61c..cc0de1e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -52,11 +52,19 @@ jobs: - name: Build release binary run: cargo build --release --target x86_64-pc-windows-msvc + - name: Prepare artifact folder + run: | + mkdir dist + mkdir dist\GammaEditor + mkdir dist\GammaEditor\logs + copy target\x86_64-pc-windows-msvc\release\gammaeditor.exe dist\GammaEditor\gammaeditor.exe + + - name: Upload Windows binary uses: actions/upload-artifact@v4 with: name: gammaeditor-windows - path: target/x86_64-pc-windows-msvc/release/gammaeditor.exe + path: dist/GammaEditor/ # ---------------------------- # Package Source Code From bf02a38ca0d1ae8f2c428c232cfcd651955b242f Mon Sep 17 00:00:00 2001 From: Cal <43823915+CalRL@users.noreply.github.com> Date: Wed, 12 Nov 2025 19:11:50 +0100 Subject: [PATCH 33/49] Update Changelog.md --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d1646cd..47d8488 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,4 +4,5 @@ - Added nickname editor - Added icon in singlescreen - Added shiny toggle -- Images are now loaded from cache on startup (rather than loaded at runtime) \ No newline at end of file +- Images are now loaded from cache on startup (rather than loaded at runtime) +- Stopped terminal from popping up on start. \ No newline at end of file From da542f5afea0f61d146f3eb2334f970916741647 Mon Sep 17 00:00:00 2001 From: Cal <43823915+CalRL@users.noreply.github.com> Date: Wed, 12 Nov 2025 19:36:51 +0100 Subject: [PATCH 34/49] Update build.yml --- .github/workflows/build.yml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cc0de1e..5cf9113 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -59,12 +59,11 @@ jobs: mkdir dist\GammaEditor\logs copy target\x86_64-pc-windows-msvc\release\gammaeditor.exe dist\GammaEditor\gammaeditor.exe - - name: Upload Windows binary uses: actions/upload-artifact@v4 with: name: gammaeditor-windows - path: dist/GammaEditor/ + path: dist/ # ---------------------------- # Package Source Code @@ -76,13 +75,13 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Create source archive + - name: Prepare source folder run: | - mkdir -p dist - zip -r "dist/Source code.zip" . -x "target/*" ".git/*" ".idea/*" ".vscode/*" + mkdir -p "dist/Source code" + rsync -av --exclude 'target' --exclude '.git' --exclude '.idea' --exclude '.vscode' ./ "dist/Source code/" - name: Upload source code uses: actions/upload-artifact@v4 with: name: "Source code" - path: "dist/Source code.zip" \ No newline at end of file + path: "dist/Source code/" \ No newline at end of file From e3c168b4184a3596e6519a7d0ee0c4dd0b25853d Mon Sep 17 00:00:00 2001 From: Cal <43823915+CalRL@users.noreply.github.com> Date: Wed, 12 Nov 2025 20:34:07 +0100 Subject: [PATCH 35/49] cargo fmt --- src/save/backup.rs | 13 +++++++------ src/save/mod.rs | 2 +- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/save/backup.rs b/src/save/backup.rs index 241f847..e66fb4b 100644 --- a/src/save/backup.rs +++ b/src/save/backup.rs @@ -1,6 +1,6 @@ use std::fs; use std::path::Path; -pub fn create_backup() -> Result{ +pub fn create_backup() -> Result { let local_appdata = std::env::var("LOCALAPPDATA") .map_err(|_| "Could not find LOCALAPPDATA variable...".to_string())?; @@ -12,7 +12,10 @@ pub fn create_backup() -> Result{ let original_path = save_dir.join("Slot1.sav"); if !original_path.exists() { - return Err(format!("Slot1.sav does not exist: {:?}", original_path.display())); + return Err(format!( + "Slot1.sav does not exist: {:?}", + original_path.display() + )); } let timestamp = chrono::Local::now().format("%d %m %Y %H-%M-%S").to_string(); @@ -29,9 +32,7 @@ pub fn create_backup() -> Result{ let new_filename = format!("{file_stem} - {timestamp}.{}", extension); let new_path = save_dir.join(new_filename); - fs::copy(&original_path, &new_path) - .map_err(|e| format!("Failed to copy file: {}", e))?; + fs::copy(&original_path, &new_path).map_err(|e| format!("Failed to copy file: {}", e))?; Ok("Success!".to_string()) - -} \ No newline at end of file +} diff --git a/src/save/mod.rs b/src/save/mod.rs index a4e01d8..e97d71c 100644 --- a/src/save/mod.rs +++ b/src/save/mod.rs @@ -6,9 +6,9 @@ use std::io; use std::io::Write; use std::path::PathBuf; use std::sync::{Arc, RwLock, RwLockReadGuard, RwLockWriteGuard}; +pub mod backup; pub mod pokemon; pub mod utils; -pub mod backup; pub type SharedGvas = Arc>; pub type SharedState = Arc>; From 3a77367f5f05186d56e47a4f44e253d82b500f87 Mon Sep 17 00:00:00 2001 From: Cal <43823915+CalRL@users.noreply.github.com> Date: Wed, 12 Nov 2025 20:34:14 +0100 Subject: [PATCH 36/49] stop terminal on windows --- src/main.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main.rs b/src/main.rs index 8ab6a27..e954521 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,5 @@ +#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] + use eframe::NativeOptions; use egui::TextBuffer; use gammaeditor::app::App; From 06d4d55c352264949e189289629aed42aa358acf Mon Sep 17 00:00:00 2001 From: Cal <43823915+CalRL@users.noreply.github.com> Date: Wed, 12 Nov 2025 21:09:46 +0100 Subject: [PATCH 37/49] remove old generator --- src/main.rs | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/src/main.rs b/src/main.rs index e954521..1ded7d8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -21,18 +21,4 @@ fn main() { }), ) .expect("How did we get here?"); -} - -fn run_generator(args: Vec) -> Result { - println!("Starting generator"); - - let output = process::Command::new("bin/generator.exe") - .args(args) - .output() - .map_err(|e| format!("Failed to run generator.exe: {e}"))?; - - if !output.status.success() { - return Err(String::from_utf8_lossy(&output.stderr).to_string()); - } - Ok(String::from_utf8_lossy(&output.stdout).to_string()) -} +} \ No newline at end of file From 882439ec0ae0fe0b3a47e781df2920a8198d5924 Mon Sep 17 00:00:00 2001 From: Cal <43823915+CalRL@users.noreply.github.com> Date: Wed, 12 Nov 2025 21:09:53 +0100 Subject: [PATCH 38/49] fix casing --- src/ui/screen/mod.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ui/screen/mod.rs b/src/ui/screen/mod.rs index 178d9fd..435d9a9 100644 --- a/src/ui/screen/mod.rs +++ b/src/ui/screen/mod.rs @@ -81,9 +81,9 @@ impl Screen { pub fn as_str(&self) -> &str { match &self { - Screen::Party(PartyScreen) => "Party", - Screen::Single(SingleScreen) => "Single", - Screen::Home(HomeScreen) => "Home", + Screen::Party(party_screen) => "Party", + Screen::Single(single_screen) => "Single", + Screen::Home(home_screen) => "Home", } } } From 19fd21da0b14295efcf1923256c52eeb05206632 Mon Sep 17 00:00:00 2001 From: Cal <43823915+CalRL@users.noreply.github.com> Date: Wed, 12 Nov 2025 21:25:36 +0100 Subject: [PATCH 39/49] App changes formatting + err handling --- src/app.rs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/app.rs b/src/app.rs index 658d935..08bfc3e 100644 --- a/src/app.rs +++ b/src/app.rs @@ -7,15 +7,15 @@ use crate::ui::screen::party_screen::PartyScreen; use crate::ui::screen::single_screen::SingleScreen; use crate::ui::screen::ScreenTrait; use crate::ui::screen::{render_screen, Screen}; -use eframe::emath::Align; use egui::panel::TopBottomSide; -use egui::{CursorIcon, Direction, Id, Label, Layout, RichText, Sense}; +use egui::{CursorIcon, Id, Label, RichText, Sense}; use gvas::GvasFile; use rfd::MessageLevel; use rust_embed::Embed; use std::fs::File; use std::io::{Cursor, Write}; use std::sync::{Arc, OnceLock, RwLock, RwLockReadGuard}; +use eframe::IntegrationInfo; pub static GVAS_FILE: OnceLock>> = OnceLock::>>::new(); @@ -34,7 +34,7 @@ pub struct Screens { impl App { pub fn new(cc: &eframe::CreationContext<'_>) -> Self { - let logger = match Logger::init() { + match Logger::init() { Ok(_) => {} Err(e) => { rfd::MessageDialog::new() @@ -100,9 +100,9 @@ impl App { Ok(_) => Ok(()), Err(e) => { let msg = "Failed to load save (is it already loaded?)"; - Logger::error(msg.clone()); + Logger::error(msg); - Err(msg.to_string()) + Err(format!("{}: {:?}", msg, e)) } } } @@ -154,6 +154,7 @@ impl eframe::App for App { ctx.data_mut(|map| { map.insert_persisted(Id::new("selected_mon"), None::>) }); + render_menu_bar(self, ctx); render_navigation_bar(self, ctx); render_screen(self, ctx); From 104ee3077665deb79cc9ff1a20bbd5a4efe5a0d4 Mon Sep 17 00:00:00 2001 From: Cal <43823915+CalRL@users.noreply.github.com> Date: Wed, 12 Nov 2025 22:31:16 +0100 Subject: [PATCH 40/49] add build.rs + change cargo files --- Cargo.lock | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++---- Cargo.toml | 3 +++ build.rs | 0 3 files changed, 67 insertions(+), 5 deletions(-) create mode 100644 build.rs diff --git a/Cargo.lock b/Cargo.lock index 55b9946..401a175 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1679,6 +1679,7 @@ dependencies = [ "rust-embed", "serde", "serde_json", + "winresource", ] [[package]] @@ -3801,6 +3802,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e24345aa0fe688594e73770a5f6d1b216508b4f93484c0026d521acd30134392" +dependencies = [ + "serde_core", +] + [[package]] name = "serde_with" version = "3.12.0" @@ -4036,7 +4046,7 @@ dependencies = [ "cfg-expr", "heck", "pkg-config", - "toml", + "toml 0.8.22", "version-compare", ] @@ -4206,11 +4216,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae" dependencies = [ "serde", - "serde_spanned", - "toml_datetime", + "serde_spanned 0.6.9", + "toml_datetime 0.6.9", "toml_edit", ] +[[package]] +name = "toml" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae2a4cf385da23d1d53bc15cdfa5c2109e93d8d362393c801e87da2f72f0e201" +dependencies = [ + "indexmap 2.11.3", + "serde_core", + "serde_spanned 1.0.3", + "toml_datetime 0.7.3", + "toml_parser", + "toml_writer", + "winnow", +] + [[package]] name = "toml_datetime" version = "0.6.9" @@ -4220,6 +4245,15 @@ dependencies = [ "serde", ] +[[package]] +name = "toml_datetime" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" +dependencies = [ + "serde_core", +] + [[package]] name = "toml_edit" version = "0.22.26" @@ -4228,11 +4262,26 @@ checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" dependencies = [ "indexmap 2.11.3", "serde", - "serde_spanned", - "toml_datetime", + "serde_spanned 0.6.9", + "toml_datetime 0.6.9", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b551886f449aa90d4fe2bdaa9f4a2577ad2dde302c61ecf262d80b116db95c10" +dependencies = [ "winnow", ] +[[package]] +name = "toml_writer" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df8b2b54733674ad286d16267dcfc7a71ed5c776e4ac7aa3c3e2561f7c637bf2" + [[package]] name = "tracing" version = "0.1.41" @@ -5340,6 +5389,16 @@ dependencies = [ "memchr", ] +[[package]] +name = "winresource" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1ef04dd590e94ff7431a8eda99d5ca659e688d60e930bd0a330062acea4608f" +dependencies = [ + "toml 0.9.6", + "version_check", +] + [[package]] name = "wit-bindgen" version = "0.46.0" diff --git a/Cargo.toml b/Cargo.toml index ba414fd..fa924b5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,6 +23,9 @@ image = { version = "0.25.8" } ordered-float = { version = "4.6.0"} criterion = "0.7.0" +[build-dependencies] +winresource = "0.1.27" + [[bench]] name = "gvas_read" harness = false diff --git a/build.rs b/build.rs new file mode 100644 index 0000000..e69de29 From 1d93ccd9e0a76d89530f9f78d2fcd541cc844e4a Mon Sep 17 00:00:00 2001 From: Cal <43823915+CalRL@users.noreply.github.com> Date: Wed, 12 Nov 2025 22:31:27 +0100 Subject: [PATCH 41/49] add settings screen --- src/ui/screen/mod.rs | 7 ++++ src/ui/screen/settings_screen.rs | 67 ++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 src/ui/screen/settings_screen.rs diff --git a/src/ui/screen/mod.rs b/src/ui/screen/mod.rs index 435d9a9..f76b93d 100644 --- a/src/ui/screen/mod.rs +++ b/src/ui/screen/mod.rs @@ -1,6 +1,7 @@ pub mod home_screen; pub mod party_screen; pub(crate) mod single_screen; +pub mod settings_screen; use crate::app::App; use crate::logger::Logger; @@ -9,12 +10,14 @@ use egui::{CentralPanel, Ui}; use party_screen::PartyScreen; use single_screen::SingleScreen; use std::fmt::format; +use crate::ui::screen::settings_screen::SettingsScreen; #[derive(Clone)] pub enum Screen { Party(PartyScreen), Single(SingleScreen), Home(HomeScreen), + Settings(SettingsScreen) } impl ScreenTrait for Screen { @@ -23,6 +26,7 @@ impl ScreenTrait for Screen { Screen::Home(s) => s.load(app), Screen::Party(s) => s.load(app), Screen::Single(s) => s.load(app), + Screen::Settings(s) => s.load(app) } } @@ -31,6 +35,7 @@ impl ScreenTrait for Screen { Screen::Home(s) => s.ui(ui, app), Screen::Party(s) => s.ui(ui, app), Screen::Single(s) => s.ui(ui, app), + Screen::Settings(s) => s.ui(ui, app) } } } @@ -84,6 +89,7 @@ impl Screen { Screen::Party(party_screen) => "Party", Screen::Single(single_screen) => "Single", Screen::Home(home_screen) => "Home", + Screen::Settings(s) => "Settings" } } } @@ -116,6 +122,7 @@ pub fn render_screen(app_state: &mut App, ctx: &egui::Context) { Screen::Home(s) => s.ui(ui, app_state), Screen::Party(s) => s.ui(ui, app_state), Screen::Single(s) => s.ui(ui, app_state), + Screen::Settings(s) => {s.ui(ui, app_state)} }; handle_screen_action(app_state, ctx, action) diff --git a/src/ui/screen/settings_screen.rs b/src/ui/screen/settings_screen.rs new file mode 100644 index 0000000..e80f866 --- /dev/null +++ b/src/ui/screen/settings_screen.rs @@ -0,0 +1,67 @@ +use std::fs; +use std::fs::File; +use std::path::Path; +use egui::{ScrollArea, TextEdit, Ui}; +use crate::app::App; +use crate::logger::{get_log_path, Logger}; +use crate::ui::screen::{ScreenAction, ScreenTrait}; + +#[derive(Clone)] +pub struct SettingsScreen { + log_path: String, + log_contents: Option +} + +impl SettingsScreen { + + pub fn new() -> Self { + Self { + log_path: get_log_path(), + log_contents: None, + } + } +} + +impl ScreenTrait for SettingsScreen { + fn load(&mut self, app: &mut App) { + let file = match File::open(self.log_path.as_str()) { + Ok(f) => {f} + Err(_) => { + Logger::error("Failed to open log file..."); + return; + } + }; + + self.log_contents = match fs::read_to_string(&self.log_path) { + Ok(content) => {Some(content)} + Err(e) => { + Logger::error(format!("{}", e.to_string())); + return; + } + }; + + } + + fn ui(&mut self, ui: &mut Ui, app: &mut App) -> ScreenAction { + let mut action = ScreenAction::None; + ui.heading("Settings"); + + ui.add_space(5.0); + if let Some(logs) = &mut self.log_contents { + ScrollArea::both() + .id_source("log_viewer") + .auto_shrink([false, false]) + .show(ui, |ui| { + ui.add( + TextEdit::multiline(logs) + .code_editor() + .interactive(false) + .desired_width(f32::INFINITY) + .frame(true) + ); + }); + } + + action + } +} \ No newline at end of file From c91ee0320454400e89f63ba2d11fc6faf6b6fffa Mon Sep 17 00:00:00 2001 From: Cal <43823915+CalRL@users.noreply.github.com> Date: Wed, 12 Nov 2025 22:31:34 +0100 Subject: [PATCH 42/49] add get_log_path --- src/logger/mod.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/logger/mod.rs b/src/logger/mod.rs index ec4e336..7870843 100644 --- a/src/logger/mod.rs +++ b/src/logger/mod.rs @@ -35,6 +35,13 @@ pub fn get_log_file() -> File { } } +pub fn get_log_path() -> String { + let curr: DateTime = Utc::now(); + let file_name: String = format!("logs/{}.log", curr.format("%d-%m-%y")); + + file_name +} + static LOGGER_SENDER: OnceLock>> = OnceLock::new(); static LAST_LOGGED: OnceLock>> = OnceLock::new(); From fa021aadd0d5fe596e3a880b7c3afe37894e6559 Mon Sep 17 00:00:00 2001 From: Cal <43823915+CalRL@users.noreply.github.com> Date: Wed, 12 Nov 2025 22:31:43 +0100 Subject: [PATCH 43/49] add icon --- src/main.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index 1ded7d8..294abea 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,15 +1,23 @@ #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] use eframe::NativeOptions; -use egui::TextBuffer; +use egui::{TextBuffer, ViewportBuilder}; use gammaeditor::app::App; use gammaeditor::logger::Logger; use std::process; +use std::sync::Arc; fn main() { Logger::init().unwrap(); + let mut builder = ViewportBuilder::default(); + let icon_bytes = include_bytes!("../images/pokeball.ico"); + let icon = eframe::icon_data::from_png_bytes(icon_bytes).unwrap(); + builder.icon = Some(Arc::new(icon)); + let native_options: NativeOptions = NativeOptions { + viewport: builder, + ..Default::default() + }; - let native_options: NativeOptions = NativeOptions::default(); let app_name: String = format!("GammaEditor {}", env!("CARGO_PKG_VERSION")); eframe::run_native( From bc2b2913f5038f605623997f72e62af5a863b01f Mon Sep 17 00:00:00 2001 From: Cal <43823915+CalRL@users.noreply.github.com> Date: Wed, 12 Nov 2025 22:31:54 +0100 Subject: [PATCH 44/49] add settings screen in app.rs --- src/app.rs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/app.rs b/src/app.rs index 08bfc3e..c5c0f2c 100644 --- a/src/app.rs +++ b/src/app.rs @@ -1,4 +1,4 @@ -use crate::logger::Logger; +use crate::logger::{get_log_file, get_log_path, Logger}; use crate::save::pokemon::SelectedMon; use crate::ui::image::ImageCache; use crate::ui::menu::render_menu_bar; @@ -16,6 +16,8 @@ use std::fs::File; use std::io::{Cursor, Write}; use std::sync::{Arc, OnceLock, RwLock, RwLockReadGuard}; use eframe::IntegrationInfo; +use egui::util::undoer::Settings; +use crate::ui::screen::settings_screen::SettingsScreen; pub static GVAS_FILE: OnceLock>> = OnceLock::>>::new(); @@ -126,6 +128,10 @@ impl App { Screen::Home(mut s) => { s.load(self); Screen::Home(s) + }, + Screen::Settings(mut s) => { + s.load(self); + Screen::Settings(s) } }; @@ -154,7 +160,7 @@ impl eframe::App for App { ctx.data_mut(|map| { map.insert_persisted(Id::new("selected_mon"), None::>) }); - + render_menu_bar(self, ctx); render_navigation_bar(self, ctx); render_screen(self, ctx); @@ -170,6 +176,7 @@ fn render_navigation_bar(app: &mut App, ctx: &egui::Context) { loaded: false, containers: vec![], }), + Screen::Settings(SettingsScreen::new()) ] { let text: RichText = RichText::new(screen.as_str()).size(18.0); From 5085370c2e8dc924a84e48e1e04365e479627b5d Mon Sep 17 00:00:00 2001 From: Cal <43823915+CalRL@users.noreply.github.com> Date: Wed, 12 Nov 2025 22:32:00 +0100 Subject: [PATCH 45/49] build.rs --- build.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/build.rs b/build.rs index e69de29..d78ed72 100644 --- a/build.rs +++ b/build.rs @@ -0,0 +1,9 @@ +fn main() { + #[cfg(windows)] + { + let _ = winresource::WindowsResource::new() + .set_icon("images/pokeball.ico") + .compile() + .expect("Failed to add Windows icon"); + } +} \ No newline at end of file From b53aa3bd59b59373a2d2b7415a41fc5b02422412 Mon Sep 17 00:00:00 2001 From: Cal <43823915+CalRL@users.noreply.github.com> Date: Wed, 12 Nov 2025 22:32:06 +0100 Subject: [PATCH 46/49] add icons --- images/pokeball.ico | Bin 0 -> 101763 bytes images/pokeball.png | Bin 0 -> 637 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/pokeball.ico create mode 100644 images/pokeball.png diff --git a/images/pokeball.ico b/images/pokeball.ico new file mode 100644 index 0000000000000000000000000000000000000000..acf7e8557aaa029c2a44a50ba61f7fa1ced023fb GIT binary patch literal 101763 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 literal 0 HcmV?d00001 diff --git a/images/pokeball.png b/images/pokeball.png new file mode 100644 index 0000000000000000000000000000000000000000..1409f304932b91ed66c288a13aff878f167e9e90 GIT binary patch literal 637 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58CaNs)Vi3hp+HJ2z$e5NNDDLsiti|qzR;}n zc%sSESqhqlNtz6MH5tAoGF-J}NJ>ol4+7uHlFJsC*U!0~4dCi(^Q| zt+#g%`Z7E6v_8yj6w81hMcoTdQ43gss47u6F(vZb86Eax)Bcrv-bi`-{)qrCtUv&&jMtfVvtj>+%@B-4UqkX;m5-B-H``@%msD|(SM9Q*??Yf&_9r| zanEb#eK`>`$|5*Ux<@2$WdC|KW7% zk6J^qq;#MWKt0nY@KxGx-W8+#{l(vXJwO!!!VkPX*2U^7$m^=ie0myWnki!-r)%@l zls5~V=cT7koeDDO6;qmO3cr+{ppv#Skb8ygg~R{GC9(espM6&UWaE5-C*BPx{DS#} zm#bLaP7Nh3eIWM>Ys$n=9~pLlvcmK3Q0o{P=OWYwps|Ko4JF7EshVlC+3l=Wh|nLWZ3Gjw(RL z6b6@$P>(GZQG7s?elc{PP>5V~w9XPJQ^jC&$l2}Vch}8e?FNU=7|jMcuA!SFM8^>bP0l+XkK=4j`@ literal 0 HcmV?d00001 From 49b059ee6eb584a5f5a68409a453f13de91ec592 Mon Sep 17 00:00:00 2001 From: Cal <43823915+CalRL@users.noreply.github.com> Date: Thu, 13 Nov 2025 11:43:50 +0100 Subject: [PATCH 47/49] workflows --- .github/workflows/build.yml | 87 ----------------------------------- .github/workflows/check.yml | 21 +++++++++ .github/workflows/master.yml | 73 +++++++++++++++++++++++++++++ .github/workflows/release.yml | 54 ++++++++++++++++++++++ 4 files changed, 148 insertions(+), 87 deletions(-) delete mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/check.yml create mode 100644 .github/workflows/master.yml create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index 5cf9113..0000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,87 +0,0 @@ -name: Build - -on: - workflow_dispatch: - push: - branches: - - main - - actions-test - tags: - - "v*" - -jobs: - # ---------------------------- - # Build Linux Binary - # ---------------------------- -# Linux is commented out for now as the game itself can only run on windows -# build-linux: -# name: Build (Linux) -# runs-on: ubuntu-latest -# -# steps: -# - uses: actions/checkout@v4 -# -# - name: Install Rust -# uses: dtolnay/rust-toolchain@stable -# -# - name: Build release binary -# run: cargo build --release --target x86_64-unknown-linux-gnu -# -# - name: Strip binary -# run: strip target/x86_64-unknown-linux-gnu/release/gammaeditor -# -# - name: Upload Linux binary -# uses: actions/upload-artifact@v4 -# with: -# name: gammaeditor-linux -# path: target/x86_64-unknown-linux-gnu/release/gammaeditor - - # ---------------------------- - # Build Windows Binary - # ---------------------------- - build-windows: - name: Build (Windows) - runs-on: windows-latest - - steps: - - uses: actions/checkout@v4 - - - name: Install Rust - uses: dtolnay/rust-toolchain@stable - - - name: Build release binary - run: cargo build --release --target x86_64-pc-windows-msvc - - - name: Prepare artifact folder - run: | - mkdir dist - mkdir dist\GammaEditor - mkdir dist\GammaEditor\logs - copy target\x86_64-pc-windows-msvc\release\gammaeditor.exe dist\GammaEditor\gammaeditor.exe - - - name: Upload Windows binary - uses: actions/upload-artifact@v4 - with: - name: gammaeditor-windows - path: dist/ - - # ---------------------------- - # Package Source Code - # ---------------------------- - package-source: - name: Package Source Code - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - - name: Prepare source folder - run: | - mkdir -p "dist/Source code" - rsync -av --exclude 'target' --exclude '.git' --exclude '.idea' --exclude '.vscode' ./ "dist/Source code/" - - - name: Upload source code - uses: actions/upload-artifact@v4 - with: - name: "Source code" - path: "dist/Source code/" \ No newline at end of file diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml new file mode 100644 index 0000000..dffc2d7 --- /dev/null +++ b/.github/workflows/check.yml @@ -0,0 +1,21 @@ +name: Check + +on: + workflow_dispatch: + +jobs: + check-windows: + name: Cargo check + runs-on: windows-latest + + steps: + - uses: actions/checkout@v4 + + - name: Install Rust + uses: dtolnay/rust-toolchain@stable + + - name: Cargo check + run: cargo check --release + + - name: Cargo test + run: cargo test --release \ No newline at end of file diff --git a/.github/workflows/master.yml b/.github/workflows/master.yml new file mode 100644 index 0000000..6dc17d5 --- /dev/null +++ b/.github/workflows/master.yml @@ -0,0 +1,73 @@ +name: Build & Release PR > Master + +on: + # Run checks on pull requests to main + pull_request: + branches: + - master + + # Create release draft when code is merged into main + push: + branches: + - master + +permissions: + contents: write + +jobs: + check: + if: github.event_name == 'pull_request' + name: Cargo Check & Test (PR) + runs-on: windows-latest + + steps: + - uses: actions/checkout@v4 + - uses: dtolnay/rust-toolchain@stable + + - name: Cargo check + run: cargo check --release + + - name: Cargo test + run: cargo test --release + + release: + if: github.event_name == 'push' && github.ref == 'refs/heads/main' + name: Build and Draft Release (Windows) + runs-on: windows-latest + needs: [] # can't "need" PR jobs, different event type + + steps: + - uses: actions/checkout@v4 + - uses: dtolnay/rust-toolchain@stable + + - name: Build release binary + run: cargo build --release --target x86_64-pc-windows-msvc + + - name: Prepare artifact folder + run: | + mkdir dist + mkdir dist\GammaEditor + mkdir dist\GammaEditor\logs + copy target\x86_64-pc-windows-msvc\release\gammaeditor.exe dist\GammaEditor\gammaeditor.exe + + - name: Extract latest changelog section + id: changelog + shell: bash + run: | + CONTENT=$(awk ' + /^## \[/ { if (NR>1) exit } NR>1 { print } + ' CHANGELOG.md) + + echo "changelog<> $GITHUB_OUTPUT + echo "$CONTENT" >> $GITHUB_OUTPUT + echo "EOF" >> $GITHUB_OUTPUT + + - name: Create GitHub Release (draft) + uses: softprops/action-gh-release@v2 + with: + draft: true + tag_name: "v${{ github.run_number }}" + name: "GammaEditor v${{ github.run_number }}" + body: ${{ steps.changelog.outputs.changelog }} + files: | + dist/GammaEditor/gammaeditor.exe diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..fd199ea --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,54 @@ +name: Release + +on: + workflow_dispatch: + +permissions: + contents: write + +jobs: + release-windows: + name: Build and Draft Release (Windows) + runs-on: windows-latest + + steps: + - uses: actions/checkout@v4 + + - name: Install Rust + uses: dtolnay/rust-toolchain@stable + + - name: Build release binary + run: cargo build --release --target x86_64-pc-windows-msvc + + - name: Prepare artifact folder + run: | + mkdir dist + mkdir dist\GammaEditor + mkdir dist\GammaEditor\logs + copy target\x86_64-pc-windows-msvc\release\gammaeditor.exe dist\GammaEditor\gammaeditor.exe + + - name: Extract changelog for this version + id: changelog + shell: bash + run: | + TAG_NAME="${GITHUB_REF#refs/tags/}" + echo "Tag: $TAG_NAME" + CONTENT=$(awk -v tag="## [${TAG_NAME#v}]" ' + $0 == tag {flag=1; next} + /^## \[/ && flag {exit} + flag {print} + ' CHANGELOG.md) + + echo "changelog<> $GITHUB_OUTPUT + echo "$CONTENT" >> $GITHUB_OUTPUT + echo "EOF" >> $GITHUB_OUTPUT + + - name: Create GitHub Release (draft) + uses: softprops/action-gh-release@v2 + with: + draft: true + tag_name: ${{ github.ref_name }} + name: "GammaEditor ${{ github.ref_name }}" + body: ${{ steps.changelog.outputs.changelog }} + files: | + dist/GammaEditor/gammaeditor.exe From 0dfac466e0e3464b678a74e762e55b925c4eafc7 Mon Sep 17 00:00:00 2001 From: Cal <43823915+CalRL@users.noreply.github.com> Date: Thu, 13 Nov 2025 11:44:39 +0100 Subject: [PATCH 48/49] Changelog --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 47d8488..3d1ad5c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,4 +5,6 @@ - Added icon in singlescreen - Added shiny toggle - Images are now loaded from cache on startup (rather than loaded at runtime) -- Stopped terminal from popping up on start. \ No newline at end of file +- Stopped terminal from popping up on start. +- Added App icon +- Added App icon and version in titlebar \ No newline at end of file From 5d41c18b382966ccca45662d8537813ef2293bf6 Mon Sep 17 00:00:00 2001 From: Cal <43823915+CalRL@users.noreply.github.com> Date: Thu, 13 Nov 2025 11:55:43 +0100 Subject: [PATCH 49/49] update release.yml --- .github/workflows/release.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index fd199ea..d6d0554 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -27,6 +27,12 @@ jobs: mkdir dist\GammaEditor\logs copy target\x86_64-pc-windows-msvc\release\gammaeditor.exe dist\GammaEditor\gammaeditor.exe + - name: Create ZIP archive + run: | + $zipName = "GammaEditor-${{ github.ref_name }}.zip" + Compress-Archive -Path "dist\GammaEditor" -DestinationPath "dist\$zipName" + Write-Host "Created archive: dist\$zipName" + - name: Extract changelog for this version id: changelog shell: bash @@ -51,4 +57,4 @@ jobs: name: "GammaEditor ${{ github.ref_name }}" body: ${{ steps.changelog.outputs.changelog }} files: | - dist/GammaEditor/gammaeditor.exe + dist/GammaEditor-${{ github.ref_name }}.zip