diff --git a/data/pokemon/README.md b/data/pokemon/README.md new file mode 100644 index 0000000..68ee236 --- /dev/null +++ b/data/pokemon/README.md @@ -0,0 +1,155 @@ +# Pokémon Data (CSV Format) + +This directory contains Pokémon data in CSV format for easy editing and maintenance. + +## File Structure + +``` +/data/pokemon/ +├── gen1-kanto.csv # Gen 1 Pokémon (Kanto region, #1-151) +├── gen2-johto.csv # Gen 2 Pokémon (Johto region, #152-251) - Future +├── gen3-hoenn.csv # Gen 3 Pokémon (Hoenn region, #252-386) - Future +├── games.csv # All Pokémon games definitions +└── README.md # This file +``` + +## CSV Format + +### gen{N}-{region}.csv + +One CSV file per generation/region containing all Pokémon from that generation. + +**Columns:** +- `pokedexNumber` - National Pokédex number (e.g., 1, 25, 151) +- `name` - Pokémon name (e.g., Bulbasaur, Pikachu, Mew) +- `form` - Form name (empty for base form, "Female" for gender differences, "Alolan" for regional forms, etc.) +- `games` - Pipe-separated list of games where this Pokémon can be caught (e.g., "Red|Blue|Yellow") +- `regionalNumber` - Regional Pokédex number for base forms (empty for gender/alternative forms) + +**Example (gen1-kanto.csv):** +```csv +pokedexNumber,name,form,games,regionalNumber +1,Bulbasaur,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,1 +3,Venusaur,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,3 +3,Venusaur,Female,Red|Blue|Yellow|LG: Pikachu|LG: Eevee, +25,Pikachu,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,25 +151,Mew,,Red|Blue|Yellow,151 +``` + +### games.csv + +Defines all Pokémon games. + +**Columns:** +- `id` - Unique game identifier (lowercase, hyphenated, e.g., "red", "lg-pikachu") +- `displayName` - Display name for the game (e.g., "Red", "LG: Pikachu") +- `region` - Region/generation the game belongs to (e.g., "Kanto", "Johto") +- `generation` - Generation number (1-9) + +**Example:** +```csv +id,displayName,region,generation +red,Red,Kanto,1 +blue,Blue,Kanto,1 +lg-pikachu,LG: Pikachu,Kanto,7 +``` + +## Editing with Excel/Google Sheets + +CSV files are designed to be edited in spreadsheet applications: + +1. Open the CSV file in Excel or Google Sheets +2. Use formulas, sorting, and filtering for bulk operations +3. Save as CSV when done + +**Example workflows:** + +### Adding a new game to existing Pokémon +Find & Replace in the `games` column: +- Find: `Red|Blue` +- Replace: `Red|Blue|NewGame` + +### Adding a new Pokémon +Add a new row with all required fields: +```csv +152,Chikorita,,Gold|Silver|Crystal,1 +``` + +### Adding a regional form +Add a new row with the form name: +```csv +19,Rattata,Alolan,Sun|Moon|US|UM, +``` + +## Generating SQL Migrations + +After editing CSV files, generate SQL migrations using npm scripts: + +```bash +# Generate migration for Kanto +npm run seed:kanto + +# Generate migration for Johto (when ready) +npm run seed:johto + +# Custom region +npm run seed:generate +``` + +Generated migrations will be created in `/supabase/migrations/` with timestamp prefixes. + +## Testing Changes + +After generating a migration: + +```bash +# Reset local database to test +npm run supabase:reset + +# Verify the changes loaded correctly +``` + +## Important Notes + +1. **Regional Numbers**: Only base forms (no `form` value) should have `regionalNumber` values. Forms like "Female" or "Alolan" should leave this column empty. + +2. **Game Names**: Must exactly match the `displayName` in `games.csv`. Use pipe `|` as separator, no spaces around pipes. + +3. **National Dex Numbers**: Must be accurate. Gender forms and regional variants share the same `pokedexNumber` as their base form. + +4. **CSV Encoding**: Save files with UTF-8 encoding to support special characters. + +5. **Quotes**: Only use quotes around values containing commas. Excel/Google Sheets handles this automatically. + +## Common Operations + +### Add a new generation (e.g., Gen 2 - Johto) + +1. Create `gen2-johto.csv` with the format above +2. Add Johto games to `games.csv` +3. Run `npm run seed:johto` +4. Test with `npm run supabase:reset` + +### Add a new game to existing generation + +1. Open `games.csv`, add new game row +2. Open the relevant `gen{N}-{region}.csv` file +3. Use Find & Replace to add the new game to the `games` column +4. Regenerate the migration: `npm run seed:{region}` +5. Test with `npm run supabase:reset` + +### Add DLC/expansion Pokémon + +1. Add new Pokémon rows to the appropriate generation CSV +2. Update the `games` column with the DLC games +3. Regenerate the migration +4. Test + +## Database Schema + +Generated migrations insert data into two tables: + +- **`pokedex_entries`**: Pokémon species data (name, form, games, etc.) +- **`regional_dex_numbers`**: Regional Pokédex numbers (separate table for scalability) + +This design allows adding new regions without database schema changes. diff --git a/data/pokemon/games.csv b/data/pokemon/games.csv new file mode 100644 index 0000000..f5f0043 --- /dev/null +++ b/data/pokemon/games.csv @@ -0,0 +1,12 @@ +id,displayName,region,generation,releaseYear +red,Red,Kanto,1,1996 +blue,Blue,Kanto,1,1996 +yellow,Yellow,Kanto,1,1998 +lg--pikachu,LG: Pikachu,Kanto,7,2018 +lg--eevee,LG: Eevee,Kanto,7,2018 +gold,Gold,Johto,2,1999 +silver,Silver,Johto,2,1999 +crystal,Crystal,Johto,2,2000 +heartgold,HeartGold,Johto,4,2009 +soulsilver,SoulSilver,Johto,4,2009 +legends-arceus,Legends: Arceus,Hisui,8,2022 \ No newline at end of file diff --git a/data/pokemon/gen1-kanto.csv b/data/pokemon/gen1-kanto.csv new file mode 100644 index 0000000..77bc781 --- /dev/null +++ b/data/pokemon/gen1-kanto.csv @@ -0,0 +1,175 @@ +pokedexNumber,name,form,originGames,regionalDexGames,regionalNumber +1,Bulbasaur,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,1 +2,Ivysaur,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,2 +3,Venusaur,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,3 +3,Venusaur,Female,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee, +4,Charmander,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,4 +5,Charmeleon,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,5 +6,Charizard,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,6 +7,Squirtle,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,7 +8,Wartortle,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,8 +9,Blastoise,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,9 +10,Caterpie,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,10 +11,Metapod,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,11 +12,Butterfree,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,12 +12,Butterfree,Female,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee, +13,Weedle,,Red|Blue|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,13 +14,Kakuna,,Red|Blue|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,14 +15,Beedrill,,Red|Blue|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,15 +16,Pidgey,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,16 +17,Pidgeotto,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,17 +18,Pidgeot,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,18 +19,Rattata,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,19 +19,Rattata,Female,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee, +20,Raticate,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,20 +20,Raticate,Female,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee, +21,Spearow,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,21 +22,Fearow,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,22 +23,Ekans,,Red|Blue|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,23 +24,Arbok,,Red|Blue|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,24 +25,Pikachu,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,25 +25,Pikachu,Female,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee, +26,Raichu,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,26 +26,Raichu,Female,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee, +27,Sandshrew,,Blue|Yellow|LG: Pikachu,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,27 +28,Sandslash,,Blue|Yellow|LG: Pikachu,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,28 +29,Nidoran♀,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,29 +30,Nidorina,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,30 +31,Nidoqueen,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,31 +32,Nidoran♂,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,32 +33,Nidorino,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,33 +34,Nidoking,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,34 +35,Clefairy,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,35 +36,Clefable,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,36 +37,Vulpix,,Blue|Yellow|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,37 +38,Ninetales,,Blue|Yellow|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,38 +39,Jigglypuff,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,39 +40,Wigglytuff,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,40 +41,Zubat,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,41 +41,Zubat,Female,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee, +42,Golbat,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,42 +42,Golbat,Female,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee, +43,Oddish,,Red|Yellow|LG: Pikachu,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,43 +44,Gloom,,Red|Yellow|LG: Pikachu,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,44 +44,Gloom,Female,Red|Yellow|LG: Pikachu,Red|Blue|Yellow|LG: Pikachu|LG: Eevee, +45,Vileplume,,Red|Yellow|LG: Pikachu,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,45 +45,Vileplume,Female,Red|Yellow|LG: Pikachu,Red|Blue|Yellow|LG: Pikachu|LG: Eevee, +46,Paras,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,46 +47,Parasect,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,47 +48,Venonat,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,48 +49,Venomoth,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,49 +50,Diglett,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,50 +51,Dugtrio,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,51 +52,Meowth,,Blue|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,52 +53,Persian,,Blue|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,53 +54,Psyduck,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,54 +55,Golduck,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,55 +56,Mankey,,Red|Yellow|LG: Pikachu,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,56 +57,Primeape,,Red|Yellow|LG: Pikachu,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,57 +58,Growlithe,,Red|Yellow|LG: Pikachu,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,58 +59,Arcanine,,Red|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,59 +60,Poliwag,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,60 +61,Poliwhirl,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,61 +62,Poliwrath,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,62 +63,Abra,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,63 +64,Kadabra,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,64 +64,Kadabra,Female,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee, +65,Alakazam,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,65 +65,Alakazam,Female,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee, +66,Machop,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,66 +67,Machoke,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,67 +68,Machamp,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,68 +69,Bellsprout,,Blue|Yellow|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,69 +70,Weepinbell,,Blue|Yellow|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,70 +71,Victreebel,,Blue|Yellow|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,71 +72,Tentacool,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,72 +73,Tentacruel,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,73 +74,Geodude,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,74 +75,Graveler,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,75 +76,Golem,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,76 +77,Ponyta,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,77 +78,Rapidash,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,78 +79,Slowpoke,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,79 +80,Slowbro,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,80 +81,Magnemite,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,81 +82,Magneton,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,82 +83,Farfetch’d,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,83 +84,Doduo,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,84 +84,Doduo,Female,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee, +85,Dodrio,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,85 +85,Dodrio,Female,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee, +86,Seel,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,86 +87,Dewgong,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,87 +88,Grimer,,Red|Blue|Yellow|LG: Pikachu,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,88 +89,Muk,,Red|Blue|Yellow|LG: Pikachu,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,89 +90,Shellder,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,90 +91,Cloyster,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,91 +92,Gastly,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,92 +93,Haunter,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,93 +94,Gengar,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,94 +95,Onix,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,95 +96,Drowzee,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,96 +97,Hypno,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,97 +97,Hypno,Female,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee, +98,Krabby,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,98 +99,Kingler,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,99 +100,Voltorb,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,100 +101,Electrode,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,101 +102,Exeggcute,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,102 +103,Exeggutor,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,103 +104,Cubone,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,104 +105,Marowak,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,105 +106,Hitmonlee,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,106 +107,Hitmonchan,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,107 +108,Lickitung,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,108 +109,Koffing,,Red|Blue|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,109 +110,Weezing,,Red|Blue|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,110 +111,Rhyhorn,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,111 +111,Rhyhorn,Female,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee, +112,Rhydon,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,112 +112,Rhydon,Female,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee, +113,Chansey,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,113 +114,Tangela,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,114 +115,Kangaskhan,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,115 +116,Horsea,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,116 +117,Seadra,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,117 +118,Goldeen,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,118 +118,Goldeen,Female,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee, +119,Seaking,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,119 +119,Seaking,Female,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee, +120,Staryu,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,120 +121,Starmie,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,121 +122,Mr. Mime,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,122 +123,Scyther,,Red|Yellow|LG: Pikachu,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,123 +123,Scyther,Female,Red|Yellow|LG: Pikachu,Red|Blue|Yellow|LG: Pikachu|LG: Eevee, +124,Jynx,,Red|Blue|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,124 +125,Electabuzz,,Red|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,125 +126,Magmar,,Blue|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,126 +127,Pinsir,,Blue|Yellow|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,127 +128,Tauros,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,128 +129,Magikarp,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,129 +129,Magikarp,Female,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee, +130,Gyarados,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,130 +130,Gyarados,Female,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee, +131,Lapras,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,131 +132,Ditto,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,132 +133,Eevee,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,133 +133,Eevee,Female,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee, +134,Vaporeon,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,134 +135,Jolteon,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,135 +136,Flareon,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,136 +137,Porygon,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,137 +138,Omanyte,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,138 +139,Omastar,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,139 +140,Kabuto,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,140 +141,Kabutops,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,141 +142,Aerodactyl,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,142 +143,Snorlax,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,143 +144,Articuno,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,144 +145,Zapdos,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,145 +146,Moltres,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,146 +147,Dratini,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,147 +148,Dragonair,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,148 +149,Dragonite,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,149 +150,Mewtwo,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,150 +151,Mew,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,151 diff --git a/data/pokemon/gen2-johto.csv b/data/pokemon/gen2-johto.csv new file mode 100644 index 0000000..57b28f5 --- /dev/null +++ b/data/pokemon/gen2-johto.csv @@ -0,0 +1,149 @@ +pokedexNumber,name,form,originGames,regionalDexGames,regionalNumber +152,Chikorita,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,1 +153,Bayleef,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,2 +154,Meganium,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,3 +154,Meganium,Female,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver, +155,Cyndaquil,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,4 +156,Quilava,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,5 +157,Typhlosion,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,6 +158,Totodile,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,7 +159,Croconaw,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,8 +160,Feraligatr,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,9 +161,Sentret,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,10 +162,Furret,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,11 +163,Hoothoot,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,12 +164,Noctowl,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,13 +165,Ledyba,,Silver|Crystal|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,14 +165,Ledyba,Female,Silver|Crystal|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver, +166,Ledian,,Silver|Crystal|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,15 +166,Ledian,Female,Silver|Crystal|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver, +167,Spinarak,,Gold|Crystal|HeartGold,Gold|Silver|Crystal|HeartGold|SoulSilver,16 +168,Ariados,,Gold|Crystal|HeartGold,Gold|Silver|Crystal|HeartGold|SoulSilver,17 +169,Crobat,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Gold|Silver|Crystal|HeartGold|SoulSilver,18 +170,Chinchou,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,19 +171,Lanturn,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,20 +172,Pichu,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,21 +173,Cleffa,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,22 +174,Igglybuff,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,23 +175,Togepi,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,24 +176,Togetic,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,25 +177,Natu,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,26 +178,Xatu,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,27 +178,Xatu,Female,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver, +179,Mareep,,Gold|Silver|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,28 +180,Flaaffy,,Gold|Silver|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,29 +181,Ampharos,,Gold|Silver|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,30 +182,Bellossom,,Red|Yellow|LG: Pikachu,Gold|Silver|Crystal|HeartGold|SoulSilver,31 +183,Marill,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,32 +184,Azumarill,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,33 +185,Sudowoodo,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,34 +185,Sudowoodo,Female,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver, +186,Politoed,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Gold|Silver|Crystal|HeartGold|SoulSilver,35 +186,Politoed,Female,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Gold|Silver|Crystal|HeartGold|SoulSilver, +187,Hoppip,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,36 +188,Skiploom,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,37 +189,Jumpluff,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,38 +190,Aipom,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,39 +190,Aipom,Female,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver, +191,Sunkern,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,40 +192,Sunflora,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,41 +193,Yanma,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,42 +194,Wooper,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,43 +194,Wooper,Female,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver, +195,Quagsire,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,44 +195,Quagsire,Female,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver, +196,Espeon,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Gold|Silver|Crystal|HeartGold|SoulSilver,45 +197,Umbreon,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Gold|Silver|Crystal|HeartGold|SoulSilver,46 +198,Murkrow,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,47 +198,Murkrow,Female,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver, +199,Slowking,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Gold|Silver|Crystal|HeartGold|SoulSilver,48 +200,Misdreavus,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,49 +201,Unown,A,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,50 +201,Unown,B,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver, +201,Unown,C,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver, +201,Unown,D,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver, +201,Unown,E,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver, +201,Unown,F,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver, +201,Unown,G,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver, +201,Unown,H,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver, +201,Unown,I,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver, +201,Unown,J,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver, +201,Unown,K,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver, +201,Unown,L,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver, +201,Unown,M,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver, +201,Unown,N,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver, +201,Unown,O,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver, +201,Unown,P,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver, +201,Unown,Q,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver, +201,Unown,R,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver, +201,Unown,S,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver, +201,Unown,T,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver, +201,Unown,U,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver, +201,Unown,V,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver, +201,Unown,W,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver, +201,Unown,X,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver, +201,Unown,Y,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver, +201,Unown,Z,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver, +201,Unown,!,HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver, +201,Unown,?,HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver, +202,Wobbuffet,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,51 +202,Wobbuffet,Female,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver, +203,Girafarig,,Gold|Silver|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,52 +203,Girafarig,Female,Gold|Silver|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver, +204,Pineco,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,53 +205,Forretress,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,54 +206,Dunsparce,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,55 +207,Gligar,,Gold|Crystal|HeartGold,Gold|Silver|Crystal|HeartGold|SoulSilver,56 +207,Gligar,Female,Gold|Crystal|HeartGold,Gold|Silver|Crystal|HeartGold|SoulSilver, +208,Steelix,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Gold|Silver|Crystal|HeartGold|SoulSilver,57 +208,Steelix,Female,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Gold|Silver|Crystal|HeartGold|SoulSilver, +209,Snubbull,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,58 +210,Granbull,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,59 +211,Qwilfish,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,60 +212,Scizor,,Red|Yellow|LG: Pikachu,Gold|Silver|Crystal|HeartGold|SoulSilver,61 +212,Scizor,Female,Red|Yellow|LG: Pikachu,Gold|Silver|Crystal|HeartGold|SoulSilver, +213,Shuckle,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,62 +214,Heracross,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,63 +214,Heracross,Female,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver, +215,Sneasel,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,64 +215,Sneasel,Female,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver, +216,Teddiursa,,Gold|Crystal|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,65 +217,Ursaring,,Gold|Crystal|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,66 +217,Ursaring,Female,Gold|Crystal|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver, +218,Slugma,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,67 +219,Magcargo,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,68 +220,Swinub,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,69 +221,Piloswine,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,70 +221,Piloswine,Female,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver, +222,Corsola,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,71 +223,Remoraid,,Gold|Silver|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,72 +224,Octillery,,Gold|Silver|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,73 +224,Octillery,Female,Gold|Silver|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver, +225,Delibird,,Silver|Crystal|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,74 +226,Mantine,,Gold|Crystal|HeartGold,Gold|Silver|Crystal|HeartGold|SoulSilver,75 +227,Skarmory,,Silver|Crystal|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,76 +228,Houndour,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,77 +229,Houndoom,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,78 +229,Houndoom,Female,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver, +230,Kingdra,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Gold|Silver|Crystal|HeartGold|SoulSilver,79 +231,Phanpy,,Silver|Crystal|HeartGold,Gold|Silver|Crystal|HeartGold|SoulSilver,80 +232,Donphan,,Silver|Crystal|HeartGold,Gold|Silver|Crystal|HeartGold|SoulSilver,81 +232,Donphan,Female,Silver|Crystal|HeartGold,Gold|Silver|Crystal|HeartGold|SoulSilver, +234,Stantler,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,83 +235,Smeargle,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,84 +236,Tyrogue,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,85 +237,Hitmontop,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,86 +238,Smoochum,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,87 +239,Elekid,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,88 +240,Magby,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,89 +241,Miltank,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,90 +242,Blissey,,Red|Blue|Yellow|LG: Pikachu|LG: Eevee,Gold|Silver|Crystal|HeartGold|SoulSilver,91 +243,Raikou,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,92 +244,Entei,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,93 +245,Suicune,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,94 +246,Larvitar,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,95 +247,Pupitar,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,96 +248,Tyranitar,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,97 +249,Lugia,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,98 +250,Ho-Oh,,Gold|Silver|Crystal|HeartGold|SoulSilver,Gold|Silver|Crystal|HeartGold|SoulSilver,99 +251,Celebi,,Crystal,Crystal|HeartGold|SoulSilver,100 diff --git a/scripts/csv-to-migration.js b/scripts/csv-to-migration.js new file mode 100644 index 0000000..fcbb84a --- /dev/null +++ b/scripts/csv-to-migration.js @@ -0,0 +1,183 @@ +#!/usr/bin/env node + +/** + * Generates SQL migration from CSV files + * Usage: node csv-to-migration.js + * Example: node csv-to-migration.js Kanto + */ + +import fs from 'fs'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +/** + * Parse CSV file into array of objects + */ +function parseCSV(filePath) { + const content = fs.readFileSync(filePath, 'utf-8'); + const lines = content.split('\n').filter(line => line.trim()); + const headers = lines[0].split(','); + + return lines.slice(1).map(line => { + const values = parseCSVLine(line); + const obj = {}; + headers.forEach((header, i) => { + obj[header] = values[i] || null; + }); + return obj; + }); +} + +/** + * Parse a single CSV line, handling quoted values + */ +function parseCSVLine(line) { + const values = []; + let current = ''; + let inQuotes = false; + + for (let i = 0; i < line.length; i++) { + const char = line[i]; + + if (char === '"') { + inQuotes = !inQuotes; + } else if (char === ',' && !inQuotes) { + values.push(current); + current = ''; + } else { + current += char; + } + } + values.push(current); + + return values; +} + +/** + * Generate migration SQL from CSV data + */ +function generateMigration(region) { + console.log(`\nGenerating migration for ${region}...`); + + // Determine generation number from region + const regionToGen = { + 'Kanto': 1, 'Johto': 2, 'Hoenn': 3, 'Sinnoh': 4, + 'Unova': 5, 'Kalos': 6, 'Alola': 7, 'Galar': 8, + 'Hisui': 8, 'Paldea': 9 + }; + const gen = regionToGen[region] || 1; + + // 1. Load CSV files + const pokemonPath = path.join(__dirname, '..', 'data', 'pokemon', `gen${gen}-${region.toLowerCase()}.csv`); + const gamesPath = path.join(__dirname, '..', 'data', 'pokemon', 'games.csv'); + + if (!fs.existsSync(pokemonPath)) { + console.error(`Error: Pokemon CSV not found at ${pokemonPath}`); + process.exit(1); + } + + const pokemon = parseCSV(pokemonPath); + const games = parseCSV(gamesPath); + + // 2. Filter for this region + const regionGames = games.filter(g => g.region === region); + + if (regionGames.length === 0) { + console.error(`Error: No games found for region ${region} in games.csv`); + process.exit(1); + } + + // 3. Generate SQL + let sql = `-- Seed ${region} region Pokémon (Gen ${gen})\n`; + sql += `-- Auto-generated from CSV files\n\n`; + + // Region-game mappings + sql += `-- Insert ${region} region-game mappings\n`; + sql += `INSERT INTO region_game_mappings (region, game) VALUES\n`; + sql += regionGames.map(g => ` ('${region}', '${g.displayName}')`).join(',\n'); + sql += `\nON CONFLICT (region, game) DO NOTHING;\n\n`; + + // Pokemon entries (without regional dex number) + sql += `-- Insert ${region} Pokémon entries\n`; + sql += `INSERT INTO pokedex_entries (\n`; + sql += ` "pokedexNumber",\n`; + sql += ` pokemon,\n`; + sql += ` form,\n`; + sql += ` "canGigantamax",\n`; + sql += ` "regionToCatchIn",\n`; + sql += ` "gamesToCatchIn"\n`; + sql += `) VALUES\n`; + + const rows = pokemon.map(p => { + const form = p.form ? `'${p.form}'` : 'NULL'; + // Use regionalDexGames for the database (regional dex availability) + // originGames column is for future origin dex feature + const gamesField = p.regionalDexGames || p.games; // Fallback to old 'games' column for compatibility + const gamesList = gamesField.split('|'); + const gamesArray = `ARRAY[${gamesList.map(g => `'${g}'`).join(', ')}]`; + + return `(${p.pokedexNumber}, '${p.name}', ${form}, false, '${region}', ${gamesArray})`; + }); + + sql += rows.join(',\n'); + sql += '\nON CONFLICT ON CONSTRAINT unique_pokemon_form DO NOTHING;\n\n'; + + // Regional dex numbers (separate table) + sql += `-- Insert ${region} regional dex numbers\n`; + + const dexRows = pokemon + .filter(p => p.regionalNumber) // Only entries with regional dex numbers + .map(p => { + const formCondition = p.form + ? `form = '${p.form}'` + : `form IS NULL`; + + return ` ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = ${p.pokedexNumber} AND ${formCondition}), '${region}', ${p.regionalNumber})`; + }); + + if (dexRows.length > 0) { + sql += `INSERT INTO regional_dex_numbers (\n`; + sql += ` pokedex_entry_id,\n`; + sql += ` region,\n`; + sql += ` dex_number\n`; + sql += `) VALUES\n`; + sql += dexRows.join(',\n'); + sql += ';\n\n'; + } else { + sql += '-- No regional dex numbers for this region\n\n'; + } + + // Add metadata + sql += `-- Add metadata\n`; + sql += `INSERT INTO metadata (key, value) VALUES\n`; + sql += ` ('${region.toLowerCase()}_seeded', 'true'),\n`; + sql += ` ('${region.toLowerCase()}_seed_date', NOW()::TEXT),\n`; + sql += ` ('${region.toLowerCase()}_pokemon_count', '${pokemon.filter(p => !p.form).length}');\n`; + + // 4. Write file + const timestamp = new Date().toISOString().replace(/[-:T.]/g, '').slice(0, 14); + const filename = `${timestamp}_seed_${region.toLowerCase()}.sql`; + const outputPath = path.join(__dirname, '..', 'supabase', 'migrations', filename); + + fs.writeFileSync(outputPath, sql); + + console.log(`✓ Generated ${filename}`); + console.log(` - ${pokemon.length} Pokemon entries`); + console.log(` - ${dexRows.length} regional dex numbers`); + console.log(` - ${regionGames.length} games\n`); + + return filename; +} + +// Run +const region = process.argv[2]; +if (!region) { + console.error('Usage: node csv-to-migration.js '); + console.error('Example: node csv-to-migration.js Kanto'); + process.exit(1); +} + +generateMigration(region); diff --git a/src/lib/components/PokemonSprite.svelte b/src/lib/components/PokemonSprite.svelte index 4b0602b..d90fd50 100644 --- a/src/lib/components/PokemonSprite.svelte +++ b/src/lib/components/PokemonSprite.svelte @@ -31,13 +31,20 @@ // Sanitise the pokemon name by making it all lowercase and replacing any spaces with hyphens and removing other characters let sanitisedPokemonName = pokemonName.toLowerCase().replace(/[^a-z]/g, ''); - // Get the PokeApi id for the pokemon + /** + * Sprite Resolution Strategy: + * 1. For forms with PokeAPI entries (regional forms): Use PokeAPI ID (e.g., 10107.png) + * 2. For forms without PokeAPI entries (Unown, Burmy, etc.): Use {pokedexNumber}-{form} (e.g., 201-a.png) + * 3. For base forms: Use PokeAPI ID matching species_id + */ let pokeApiId; if (form && form.length > 0 && form !== 'Female') { // Sanitise the form by making it all lowercase and replacing spaces with hyphens let sanitisedForm = form .toLowerCase() .replaceAll(' ', '-') + .replaceAll('!', 'exclamation') + .replaceAll('?', 'question') .replaceAll('2', 'two') .replaceAll('3', 'three') .replaceAll('4', 'four'); @@ -59,20 +66,17 @@ break; } - // If the form is contained in the identifier, use that - if ( - pokeApiPokemon.find( - (pokemon) => pokemon.identifier === sanitisedPokemonName + '-' + sanitisedForm - ) - ) { - pokeApiId = pokeApiPokemon.find( - (pokemon) => pokemon.identifier === sanitisedPokemonName + '-' + sanitisedForm - )?.id; + // Try to find by PokeAPI identifier (e.g., "meowth-alola" -> 10107) + const pokeApiEntry = pokeApiPokemon.find( + (pokemon) => pokemon.identifier === sanitisedPokemonName + '-' + sanitisedForm + ); + + if (pokeApiEntry) { + // Pattern 1: Use PokeAPI ID (e.g., 10107.png for Meowth-Alola) + pokeApiId = pokeApiEntry.id; } else { - // If the form is not contained in the identifier, use the species_id - pokeApiId = pokeApiPokemon.find( - (pokemon) => pokemon.species_id.toString() === strippedPokedexNumber - )?.id; + // Pattern 2: Use {pokedexNumber}-{form} (e.g., 201-a.png for Unown-A) + pokeApiId = `${strippedPokedexNumber}-${sanitisedForm}`; } } else { pokeApiId = pokeApiPokemon.find( diff --git a/src/lib/components/pokedex/PokedexCard.svelte b/src/lib/components/pokedex/PokedexCard.svelte new file mode 100644 index 0000000..1cb6949 --- /dev/null +++ b/src/lib/components/pokedex/PokedexCard.svelte @@ -0,0 +1,51 @@ + + +
+
+

+ {pokedex.name} +

+ + {#if pokedex.description} +

{pokedex.description}

+ {/if} + +
+ {#each typeBadges as badge} + {badge} + {/each} +
+ + {#if pokedex.gameScope} +
+ Game: + {pokedex.gameScope} +
+ {:else} +
+ Scope: All Games +
+ {/if} + +
+ + + +
+
+
diff --git a/src/lib/components/pokedex/PokedexEntryCatchRecord.svelte b/src/lib/components/pokedex/PokedexEntryCatchRecord.svelte index 85b931d..75a4dd4 100644 --- a/src/lib/components/pokedex/PokedexEntryCatchRecord.svelte +++ b/src/lib/components/pokedex/PokedexEntryCatchRecord.svelte @@ -10,6 +10,7 @@ export let showForms: boolean; export let showShiny: boolean; export let userId: string | null = null; + export let pokedexId: string; // Create a default catch record if none exists $: if (!catchRecord) { @@ -17,6 +18,7 @@ _id: '', // Empty string, not temp ID - will be created by server userId: userId || '', pokedexEntryId: pokedexEntry._id, + pokedexId: pokedexId, haveToEvolve: false, caught: false, inHome: false, @@ -58,17 +60,6 @@ {/if}
- {#if showForms} -

Box: {pokedexEntry.boxPlacementForms.box}

-

Row: {pokedexEntry.boxPlacementForms.row}

-

Column: {pokedexEntry.boxPlacementForms.column}

-

Can Gigantamax: {pokedexEntry.canGigantamax ? 'Yes' : 'No'}

- {:else} -

Box: {pokedexEntry.boxPlacement.box}

-

Row: {pokedexEntry.boxPlacement.row}

-

Column: {pokedexEntry.boxPlacement.column}

- {/if} - {#if pokedexEntry.evolutionInformation}

How to evolve: {pokedexEntry.evolutionInformation}

{:else} @@ -83,74 +74,77 @@
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
- {#if pokedexEntry.canGigantamax && showForms} + {#if catchRecord} +
- {/if} -

- - -

-
+
+
+ +
+
+
+
+ +
+
+ {#if pokedexEntry.canGigantamax && showForms} +
+
+ +
+
+ {/if} +

+ + +

+
+ {/if}
{#if showOrigins} @@ -206,7 +200,8 @@ diff --git a/src/lib/components/pokedex/PokedexSidebar.svelte b/src/lib/components/pokedex/PokedexSidebar.svelte deleted file mode 100644 index fb25d38..0000000 --- a/src/lib/components/pokedex/PokedexSidebar.svelte +++ /dev/null @@ -1,129 +0,0 @@ - - - diff --git a/src/lib/components/pokedex/PokedexViewBoxes.svelte b/src/lib/components/pokedex/PokedexViewBoxes.svelte index 6aa3d35..f6bb523 100644 --- a/src/lib/components/pokedex/PokedexViewBoxes.svelte +++ b/src/lib/components/pokedex/PokedexViewBoxes.svelte @@ -1,14 +1,13 @@ - -
-
- {#if combinedData && combinedData.length > 0} - {#each combinedData as { pokedexEntry, catchRecord }} - - {/each} - {:else if failedToLoad} - {#if creatingRecords && totalRecordsCreated > 0} -

Processed {totalRecordsCreated} Pokédex entries so far...

-

Please be patient, this may take some time.

- {:else if creatingRecords} -

Processing...

-

Please be patient, this may take some time.

- {:else} -

Failed to load

-

- If you're seeing this, you probably haven't created your Pokédex data yet. Please do so by - clicking this button. -

- - {/if} - {:else} -
-

Loading Pokédex

- -
- {/if} -
-
diff --git a/src/lib/models/CatchRecord.ts b/src/lib/models/CatchRecord.ts index c5a3f42..244598e 100644 --- a/src/lib/models/CatchRecord.ts +++ b/src/lib/models/CatchRecord.ts @@ -3,6 +3,7 @@ export interface CatchRecord { _id: string; // Maps to Supabase 'id' field for frontend compatibility userId: string; pokedexEntryId: string; // String representation of the foreign key + pokedexId: string; // NEW: Foreign key to pokedexes table haveToEvolve: boolean; caught: boolean; inHome: boolean; @@ -15,6 +16,7 @@ export interface CatchRecordDB { id: string; userId: string; pokedexEntryId: number; // Numeric foreign key in database + pokedexId: string; // NEW: Foreign key to pokedexes table haveToEvolve: boolean; caught: boolean; inHome: boolean; diff --git a/src/lib/models/Pokedex.ts b/src/lib/models/Pokedex.ts new file mode 100644 index 0000000..4a910b7 --- /dev/null +++ b/src/lib/models/Pokedex.ts @@ -0,0 +1,25 @@ +export interface Pokedex { + _id: string; + userId: string; + name: string; + description: string; + isLivingDex: boolean; + isShinyDex: boolean; + isOriginDex: boolean; + isFormDex: boolean; + gameScope: string | null; +} + +export interface PokedexDB { + id: string; + userId: string; + name: string; + description: string; + isLivingDex: boolean; + isShinyDex: boolean; + isOriginDex: boolean; + isFormDex: boolean; + gameScope: string | null; + createdAt: string; + updatedAt: string; +} diff --git a/src/lib/models/PokedexEntry.ts b/src/lib/models/PokedexEntry.ts index a8f8934..e8f471c 100644 --- a/src/lib/models/PokedexEntry.ts +++ b/src/lib/models/PokedexEntry.ts @@ -2,8 +2,6 @@ export interface PokedexEntry { _id: string; // Maps to Supabase 'id' field for frontend compatibility pokedexNumber: number; - boxPlacement: { box: number; row: number; column: number }; - boxPlacementForms: { box: number; row: number; column: number }; pokemon: string; form: string; canGigantamax: boolean; @@ -12,6 +10,7 @@ export interface PokedexEntry { regionToEvolveIn: string; evolutionInformation: string; catchInformation: string[]; + // Note: Regional dex numbers stored in separate regional_dex_numbers table } // Database record type for Supabase @@ -26,12 +25,7 @@ export interface PokedexEntryDB { regionToEvolveIn: string | null; evolutionInformation: string | null; catchInformation: string[] | null; - boxPlacementFormsBox: number | null; - boxPlacementFormsRow: number | null; - boxPlacementFormsColumn: number | null; - boxPlacementBox: number | null; - boxPlacementRow: number | null; - boxPlacementColumn: number | null; + // Note: Regional dex numbers stored in separate regional_dex_numbers table createdAt: string; updatedAt: string; } diff --git a/src/lib/repositories/CatchRecordRepository.ts b/src/lib/repositories/CatchRecordRepository.ts index c3c22c9..564d4c0 100644 --- a/src/lib/repositories/CatchRecordRepository.ts +++ b/src/lib/repositories/CatchRecordRepository.ts @@ -4,7 +4,8 @@ import type { SupabaseClient } from '@supabase/supabase-js'; class CatchRecordRepository { constructor( private supabase: SupabaseClient, - private userId: string + private userId: string, + private pokedexId: string ) {} // Transform Supabase data to frontend format (minimal transformation) @@ -13,6 +14,7 @@ class CatchRecordRepository { _id: record.id, userId: record.userId, pokedexEntryId: record.pokedexEntryId.toString(), + pokedexId: record.pokedexId, haveToEvolve: record.haveToEvolve, caught: record.caught, inHome: record.inHome, @@ -31,6 +33,7 @@ class CatchRecordRepository { } dbData.pokedexEntryId = numericId; } + if (data.pokedexId !== undefined) dbData.pokedexId = data.pokedexId; if (data.haveToEvolve !== undefined) dbData.haveToEvolve = data.haveToEvolve; if (data.caught !== undefined) dbData.caught = data.caught; if (data.inHome !== undefined) dbData.inHome = data.inHome; @@ -46,6 +49,7 @@ class CatchRecordRepository { .select('*') .eq('id', id) .eq('userId', this.userId) + .eq('pokedexId', this.pokedexId) .single(); if (error || !data) return null; @@ -56,7 +60,8 @@ class CatchRecordRepository { const { data, error } = await this.supabase .from('catch_records') .select('*') - .eq('userId', this.userId); + .eq('userId', this.userId) + .eq('pokedexId', this.pokedexId); if (error || !data) return []; return data.map((record) => this.transformCatchRecord(record)); @@ -66,7 +71,8 @@ class CatchRecordRepository { const { data, error } = await this.supabase .from('catch_records') .select('*') - .eq('userId', userId); + .eq('userId', userId) + .eq('pokedexId', this.pokedexId); if (error || !data) return []; return data.map((record) => this.transformCatchRecord(record)); @@ -75,6 +81,7 @@ class CatchRecordRepository { async create(data: Partial): Promise { const dbData = { userId: this.userId, + pokedexId: this.pokedexId, ...this.transformToDatabase(data) }; @@ -104,6 +111,7 @@ class CatchRecordRepository { .update(dbData) .eq('id', id) .eq('userId', this.userId) + .eq('pokedexId', this.pokedexId) .select() .single(); @@ -116,7 +124,8 @@ class CatchRecordRepository { .from('catch_records') .delete() .eq('id', id) - .eq('userId', this.userId); + .eq('userId', this.userId) + .eq('pokedexId', this.pokedexId); if (error) { console.error('Error deleting catch record:', error); @@ -128,8 +137,8 @@ class CatchRecordRepository { if (data._id) { return this.update(data._id, data); } else if (data.pokedexEntryId) { - // Try to find existing record for this user and pokemon - const existing = await this.findByUserAndPokemon(this.userId, data.pokedexEntryId); + // Try to find existing record for this user, pokemon, and pokedex + const existing = await this.findByUserAndPokemon(this.userId, data.pokedexEntryId, this.pokedexId); if (existing) { return this.update(existing._id, data); } else { @@ -139,7 +148,7 @@ class CatchRecordRepository { return this.create(data); } - async findByUserAndPokemon(userId: string, pokedexEntryId: string): Promise { + async findByUserAndPokemon(userId: string, pokedexEntryId: string, pokedexId: string): Promise { const numericId = Number(pokedexEntryId); if (isNaN(numericId)) { return null; @@ -149,6 +158,7 @@ class CatchRecordRepository { .select('*') .eq('userId', userId) .eq('pokedexEntryId', numericId) + .eq('pokedexId', pokedexId) .single(); if (error || !data) return null; diff --git a/src/lib/repositories/CombinedDataRepository.ts b/src/lib/repositories/CombinedDataRepository.ts index 7bd49e5..48ed007 100644 --- a/src/lib/repositories/CombinedDataRepository.ts +++ b/src/lib/repositories/CombinedDataRepository.ts @@ -6,7 +6,8 @@ import type { SupabaseClient } from '@supabase/supabase-js'; class CombinedDataRepository { constructor( private supabase: SupabaseClient, - private userId: string + private userId: string | null, + private pokedexId: string | null ) {} // Transform Supabase data to match frontend expectations (minimal transformation) @@ -21,17 +22,8 @@ class CombinedDataRepository { gamesToCatchIn: entry.gamesToCatchIn || [], regionToEvolveIn: entry.regionToEvolveIn || '', evolutionInformation: entry.evolutionInformation || '', - catchInformation: entry.catchInformation || [], - boxPlacementForms: { - box: entry.boxPlacementFormsBox || 0, - row: entry.boxPlacementFormsRow || 0, - column: entry.boxPlacementFormsColumn || 0 - }, - boxPlacement: { - box: entry.boxPlacementBox || 0, - row: entry.boxPlacementRow || 0, - column: entry.boxPlacementColumn || 0 - } + catchInformation: entry.catchInformation || [] + // Note: Regional dex numbers are stored in separate regional_dex_numbers table }; } @@ -40,6 +32,7 @@ class CombinedDataRepository { _id: record.id, userId: record.userId, pokedexEntryId: record.pokedexEntryId.toString(), + pokedexId: record.pokedexId, haveToEvolve: record.haveToEvolve, caught: record.caught, inHome: record.inHome, @@ -58,7 +51,8 @@ class CombinedDataRepository { // Apply filters if (!enableForms) { - query = query.not('boxPlacementBox', 'is', null); + // Filter to only base forms (form is NULL) OR Unown "A" (since Unown has no base form) + query = query.or('form.is.null,and(pokemon.eq.Unown,form.eq.A)'); } if (region) { @@ -69,18 +63,9 @@ class CombinedDataRepository { query = query.contains('gamesToCatchIn', [game]); } - // Order by box placement - if (enableForms) { - query = query - .order('boxPlacementFormsBox', { ascending: true }) - .order('boxPlacementFormsRow', { ascending: true }) - .order('boxPlacementFormsColumn', { ascending: true }); - } else { - query = query - .order('boxPlacementBox', { ascending: true }) - .order('boxPlacementRow', { ascending: true }) - .order('boxPlacementColumn', { ascending: true }); - } + // Always order by national dex number + // Note: Regional dex ordering would require joining with regional_dex_numbers table + query = query.order('pokedexNumber', { ascending: true }); const { data: entries, error: entriesError } = await query; @@ -95,12 +80,13 @@ class CombinedDataRepository { // Get catch records for all entries let catchRecords: CatchRecordDB[] = []; - if (userId) { + if (userId && this.pokedexId) { const entryIds = entries.map((entry) => entry.id); const { data: records, error: recordsError } = await this.supabase .from('catch_records') .select('*') .eq('userId', userId) + .eq('pokedexId', this.pokedexId) .in('pokedexEntryId', entryIds); if (!recordsError && records) { @@ -109,7 +95,7 @@ class CombinedDataRepository { } // Combine the data exactly like master branch - return entries.map((entry) => { + const combinedData = entries.map((entry) => { const userCatchRecord = catchRecords.find((record) => record.pokedexEntryId === entry.id) || null; @@ -123,6 +109,9 @@ class CombinedDataRepository { catchRecord: transformedCatchRecord }; }); + + // Box placement is calculated dynamically on the frontend based on the current sort order. + return combinedData; } async findCombinedData( @@ -140,7 +129,8 @@ class CombinedDataRepository { // Apply filters if (!enableForms) { - query = query.not('boxPlacementBox', 'is', null); + // Filter to only base forms (form is NULL) OR Unown "A" (since Unown has no base form) + query = query.or('form.is.null,and(pokemon.eq.Unown,form.eq.A)'); } if (region) { @@ -151,18 +141,9 @@ class CombinedDataRepository { query = query.contains('gamesToCatchIn', [game]); } - // Order by box placement - if (enableForms) { - query = query - .order('boxPlacementFormsBox', { ascending: true }) - .order('boxPlacementFormsRow', { ascending: true }) - .order('boxPlacementFormsColumn', { ascending: true }); - } else { - query = query - .order('boxPlacementBox', { ascending: true }) - .order('boxPlacementRow', { ascending: true }) - .order('boxPlacementColumn', { ascending: true }); - } + // Always order by national dex number + // Note: Regional dex ordering would require joining with regional_dex_numbers table + query = query.order('pokedexNumber', { ascending: true }); const { data: entries, error: entriesError } = await query; @@ -177,12 +158,13 @@ class CombinedDataRepository { // Get catch records for these entries let catchRecords: CatchRecordDB[] = []; - if (userId) { + if (userId && this.pokedexId) { const entryIds = entries.map((entry) => entry.id); const { data: records, error: recordsError } = await this.supabase .from('catch_records') .select('*') .eq('userId', userId) + .eq('pokedexId', this.pokedexId) .in('pokedexEntryId', entryIds); if (!recordsError && records) { @@ -191,7 +173,7 @@ class CombinedDataRepository { } // Combine the data exactly like master branch - return entries.map((entry) => { + const combinedData = entries.map((entry) => { const userCatchRecord = catchRecords.find((record) => record.pokedexEntryId === entry.id) || null; @@ -205,18 +187,18 @@ class CombinedDataRepository { catchRecord: transformedCatchRecord }; }); + + // Box placement is calculated dynamically on the frontend based on the current sort order. + return combinedData; } - async countCombinedData( - enableForms: boolean, - region: string, - game: string - ): Promise { + async countCombinedData(enableForms: boolean, region: string, game: string): Promise { let query = this.supabase.from('pokedex_entries').select('id', { count: 'exact', head: true }); // Apply same filters as in findCombinedData if (!enableForms) { - query = query.not('boxPlacementBox', 'is', null); + // Filter to only base forms (form is NULL) OR Unown "A" (since Unown has no base form) + query = query.or('form.is.null,and(pokemon.eq.Unown,form.eq.A)'); } if (region) { diff --git a/src/lib/repositories/PokedexEntryRepository.ts b/src/lib/repositories/PokedexEntryRepository.ts index 73704d0..d3874af 100644 --- a/src/lib/repositories/PokedexEntryRepository.ts +++ b/src/lib/repositories/PokedexEntryRepository.ts @@ -16,17 +16,7 @@ class PokedexEntryRepository { gamesToCatchIn: entry.gamesToCatchIn || [], regionToEvolveIn: entry.regionToEvolveIn || '', evolutionInformation: entry.evolutionInformation || '', - catchInformation: entry.catchInformation || [], - boxPlacementForms: { - box: entry.boxPlacementFormsBox || 0, - row: entry.boxPlacementFormsRow || 0, - column: entry.boxPlacementFormsColumn || 0 - }, - boxPlacement: { - box: entry.boxPlacementBox || 0, - row: entry.boxPlacementRow || 0, - column: entry.boxPlacementColumn || 0 - } + catchInformation: entry.catchInformation || [] }; } @@ -64,16 +54,7 @@ class PokedexEntryRepository { if (data.evolutionInformation !== undefined) dbData.evolutionInformation = data.evolutionInformation; if (data.catchInformation !== undefined) dbData.catchInformation = data.catchInformation; - if (data.boxPlacementForms?.box !== undefined) - dbData.boxPlacementFormsBox = data.boxPlacementForms.box; - if (data.boxPlacementForms?.row !== undefined) - dbData.boxPlacementFormsRow = data.boxPlacementForms.row; - if (data.boxPlacementForms?.column !== undefined) - dbData.boxPlacementFormsColumn = data.boxPlacementForms.column; - if (data.boxPlacement?.box !== undefined) dbData.boxPlacementBox = data.boxPlacement.box; - if (data.boxPlacement?.row !== undefined) dbData.boxPlacementRow = data.boxPlacement.row; - if (data.boxPlacement?.column !== undefined) - dbData.boxPlacementColumn = data.boxPlacement.column; + // Box placement is calculated dynamically - not stored in database const { data: result, error } = await this.supabase .from('pokedex_entries') @@ -98,16 +79,7 @@ class PokedexEntryRepository { if (data.evolutionInformation !== undefined) dbData.evolutionInformation = data.evolutionInformation; if (data.catchInformation !== undefined) dbData.catchInformation = data.catchInformation; - if (data.boxPlacementForms?.box !== undefined) - dbData.boxPlacementFormsBox = data.boxPlacementForms.box; - if (data.boxPlacementForms?.row !== undefined) - dbData.boxPlacementFormsRow = data.boxPlacementForms.row; - if (data.boxPlacementForms?.column !== undefined) - dbData.boxPlacementFormsColumn = data.boxPlacementForms.column; - if (data.boxPlacement?.box !== undefined) dbData.boxPlacementBox = data.boxPlacement.box; - if (data.boxPlacement?.row !== undefined) dbData.boxPlacementRow = data.boxPlacement.row; - if (data.boxPlacement?.column !== undefined) - dbData.boxPlacementColumn = data.boxPlacement.column; + // Box placement is calculated dynamically - not stored in database const { data: result, error } = await this.supabase .from('pokedex_entries') diff --git a/src/lib/repositories/PokedexRepository.ts b/src/lib/repositories/PokedexRepository.ts new file mode 100644 index 0000000..0b1842e --- /dev/null +++ b/src/lib/repositories/PokedexRepository.ts @@ -0,0 +1,108 @@ +import type { Pokedex, PokedexDB } from '$lib/models/Pokedex'; +import type { SupabaseClient } from '@supabase/supabase-js'; + +class PokedexRepository { + constructor( + private supabase: SupabaseClient, + private userId: string + ) {} + + private transform(db: PokedexDB): Pokedex { + return { + _id: db.id, + userId: db.userId, + name: db.name, + description: db.description || '', + isLivingDex: db.isLivingDex, + isShinyDex: db.isShinyDex, + isOriginDex: db.isOriginDex, + isFormDex: db.isFormDex, + gameScope: db.gameScope + }; + } + + private transformToDatabase(data: Partial): Partial { + const dbData: Partial = {}; + if (data.name !== undefined) dbData.name = data.name; + if (data.description !== undefined) dbData.description = data.description; + if (data.isLivingDex !== undefined) dbData.isLivingDex = data.isLivingDex; + if (data.isShinyDex !== undefined) dbData.isShinyDex = data.isShinyDex; + if (data.isOriginDex !== undefined) dbData.isOriginDex = data.isOriginDex; + if (data.isFormDex !== undefined) dbData.isFormDex = data.isFormDex; + if (data.gameScope !== undefined) dbData.gameScope = data.gameScope; + return dbData; + } + + async findById(id: string): Promise { + const { data, error } = await this.supabase + .from('pokedexes') + .select('*') + .eq('id', id) + .eq('userId', this.userId) + .single(); + + if (error || !data) return null; + return this.transform(data); + } + + async findAll(): Promise { + const { data, error } = await this.supabase + .from('pokedexes') + .select('*') + .eq('userId', this.userId) + .order('createdAt', { ascending: true }); + + if (error || !data) return []; + return data.map((d) => this.transform(d)); + } + + async create(data: Partial): Promise { + const dbData = { + userId: this.userId, + ...this.transformToDatabase(data) + }; + + const { data: result, error } = await this.supabase + .from('pokedexes') + .insert(dbData) + .select() + .single(); + + if (error) { + console.error('Error creating pokedex:', error); + throw new Error(`Failed to create pokedex: ${error.message}`); + } + + if (!result) { + throw new Error('Failed to create pokedex: No result returned'); + } + + return this.transform(result); + } + + async update(id: string, data: Partial): Promise { + const dbData = this.transformToDatabase(data); + + const { data: result, error } = await this.supabase + .from('pokedexes') + .update(dbData) + .eq('id', id) + .eq('userId', this.userId) + .select() + .single(); + + if (error || !result) return null; + return this.transform(result); + } + + async delete(id: string): Promise { + const { error } = await this.supabase.from('pokedexes').delete().eq('id', id).eq('userId', this.userId); + + if (error) { + console.error('Error deleting pokedex:', error); + throw new Error(`Failed to delete pokedex: ${error.message}`); + } + } +} + +export default PokedexRepository; diff --git a/src/lib/utils/boxPlacement.ts b/src/lib/utils/boxPlacement.ts new file mode 100644 index 0000000..2ebb0f1 --- /dev/null +++ b/src/lib/utils/boxPlacement.ts @@ -0,0 +1,41 @@ +/** + * Calculate box placement for Pokémon based on their position in a sorted list + * + * Box layout: 6 columns × 5 rows = 30 Pokémon per box + * + * @param index - Zero-based index in the sorted list + * @returns Box placement with box number, row, and column (1-indexed) + */ +export function calculateBoxPlacement(index: number): { + box: number; + row: number; + column: number; +} { + const POKEMON_PER_BOX = 30; + const COLUMNS_PER_BOX = 6; + const ROWS_PER_BOX = 5; + + // Calculate which box this Pokémon belongs to (1-indexed) + const box = Math.floor(index / POKEMON_PER_BOX) + 1; + + // Calculate position within the box (0-indexed) + const positionInBox = index % POKEMON_PER_BOX; + + // Calculate row and column (1-indexed) + const row = Math.floor(positionInBox / COLUMNS_PER_BOX) + 1; + const column = (positionInBox % COLUMNS_PER_BOX) + 1; + + return { box, row, column }; +} + +/** + * Calculate all unique box numbers needed for a list of Pokémon + * + * @param count - Total number of Pokémon + * @returns Array of box numbers (1-indexed) + */ +export function calculateBoxNumbers(count: number): number[] { + const POKEMON_PER_BOX = 30; + const totalBoxes = Math.ceil(count / POKEMON_PER_BOX); + return Array.from({ length: totalBoxes }, (_, i) => i + 1); +} diff --git a/src/lib/utils/regionalDexMapping.ts b/src/lib/utils/regionalDexMapping.ts new file mode 100644 index 0000000..cf2ba31 --- /dev/null +++ b/src/lib/utils/regionalDexMapping.ts @@ -0,0 +1,141 @@ +/** + * Maps game names to their corresponding regional Pokédex identifier. + * This mapping is used to determine which regional dex number to use when + * filtering and ordering Pokémon for a specific game. + */ + +type RegionalDexKey = + | 'kanto' + | 'johto' + | 'hoenn' + | 'sinnoh' + | 'unova_bw' + | 'unova_b2w2' + | 'kalos_central' + | 'kalos_coastal' + | 'kalos_mountain' + | 'alola_sm' + | 'alola_usum' + | 'galar' + | 'galar_isle_of_armor' + | 'galar_crown_tundra' + | 'hisui' + | 'paldea'; + +const gameToRegionalDexMap: Record = { + // Kanto region + 'Red': 'kanto', + 'Blue': 'kanto', + 'Yellow': 'kanto', + 'FireRed': 'kanto', + 'LeafGreen': 'kanto', + 'LG: Pikachu': 'kanto', + 'LG: Eevee': 'kanto', + + // Johto region + 'Gold': 'johto', + 'Silver': 'johto', + 'Crystal': 'johto', + 'HeartGold': 'johto', + 'SoulSilver': 'johto', + + // Hoenn region + 'Ruby': 'hoenn', + 'Sapphire': 'hoenn', + 'Emerald': 'hoenn', + 'OmegaRuby': 'hoenn', + 'AlphaSapphire': 'hoenn', + + // Sinnoh region + 'Diamond': 'sinnoh', + 'Pearl': 'sinnoh', + 'Platinum': 'sinnoh', + 'BrilliantDiamond': 'sinnoh', + 'ShiningPearl': 'sinnoh', + + // Unova region + 'Black': 'unova_bw', + 'White': 'unova_bw', + 'Black2': 'unova_b2w2', + 'White2': 'unova_b2w2', + + // Kalos region - Note: All XY use all three sub-dexes + // We default to Central for simplicity + 'X': 'kalos_central', + 'Y': 'kalos_central', + + // Alola region + 'Sun': 'alola_sm', + 'Moon': 'alola_sm', + 'UltraSun': 'alola_usum', + 'UltraMoon': 'alola_usum', + + // Galar region + 'Sword': 'galar', + 'Shield': 'galar', + + // Hisui region + 'LegendsArceus': 'hisui', + + // Paldea region + 'Scarlet': 'paldea', + 'Violet': 'paldea' +}; + +/** + * Gets the regional dex key for a given game name. + * Returns undefined if the game doesn't have a regional dex mapping. + */ +export function getRegionalDexKey(gameName: string): RegionalDexKey | undefined { + return gameToRegionalDexMap[gameName]; +} + +/** + * Checks if a game has a regional dex mapping. + */ +export function hasRegionalDex(gameName: string): boolean { + return gameName in gameToRegionalDexMap; +} + +/** + * Gets the database column name for a game's regional dex. + * Maps game name → database column name (e.g., 'Scarlet' → 'paldea_dex_number'). + * Returns undefined if the game doesn't have a regional dex mapping. + */ +export function getRegionalDexColumnName(gameName: string): string | undefined { + const regionalKey = getRegionalDexKey(gameName); + if (!regionalKey) return undefined; + return `${regionalKey}_dex_number`; +} + +/** + * Gets the frontend field name for a game's regional dex. + * Maps game name → PokedexEntry field name (e.g., 'Scarlet' → 'paldeaDexNumber'). + * Returns undefined if the game doesn't have a regional dex mapping. + */ +export function getRegionalDexFieldName(gameName: string): string | undefined { + const regionalKey = getRegionalDexKey(gameName); + if (!regionalKey) return undefined; + + // Map regional key to actual PokedexEntry field name (camelCase) + const fieldMap: Record = { + 'kanto': 'kantoDexNumber', + 'johto': 'johtoDexNumber', + 'hoenn': 'hoennDexNumber', + 'sinnoh': 'sinnohDexNumber', + 'unova_bw': 'unovaBwDexNumber', + 'unova_b2w2': 'unovaB2w2DexNumber', + 'kalos_central': 'kalosCentralDexNumber', + 'kalos_coastal': 'kalosCoastalDexNumber', + 'kalos_mountain': 'kalosMountainDexNumber', + 'alola_sm': 'alolaSmDexNumber', + 'alola_usum': 'alolaUsumDexNumber', + 'galar': 'galarDexNumber', + 'galar_isle_of_armor': 'galarIsleOfArmorDexNumber', + 'galar_crown_tundra': 'galarCrownTundraDexNumber', + 'hisui': 'hisuiDexNumber', + 'paldea': 'paldeaDexNumber' + }; + + return fieldMap[regionalKey]; +} diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index f4e3df2..63637d6 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -149,7 +149,7 @@ > {#if localUser}
  • - My Dex + My Pokédexes
  • Profile diff --git a/src/routes/api/combined-data/+server.ts b/src/routes/api/combined-data/+server.ts deleted file mode 100644 index e65df95..0000000 --- a/src/routes/api/combined-data/+server.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { json } from '@sveltejs/kit'; -import CombinedDataRepository from '$lib/repositories/CombinedDataRepository'; -import { getOptionalUserId } from '$lib/utils/auth'; -import type { RequestEvent } from '@sveltejs/kit'; - -export const GET = async (event: RequestEvent) => { - const { url } = event; - const page = parseInt(url.searchParams.get('page') || '1', 10); - const limit = parseInt(url.searchParams.get('limit') || '20', 10); - const enableForms = url.searchParams.get('enableForms') === 'true'; - const region = url.searchParams.get('region') || ''; - const game = url.searchParams.get('game') || ''; - - try { - // Get userId if authenticated, null if not - const userId = await getOptionalUserId(event); - - // If user is authenticated, set their session on the Supabase client - if (userId) { - const { session } = await event.locals.safeGetSession(); - if (session) { - await event.locals.supabase.auth.setSession(session); - } - } - - const repo = new CombinedDataRepository(event.locals.supabase, userId || ''); - const combinedData = await repo.findCombinedData( - userId || '', - page, - limit, - enableForms, - region, - game - ); - - // Return empty array instead of 404 for better UX - if (combinedData.length === 0) { - return json({ combinedData: [], totalPages: 0 }); - } - - const totalCount = await repo.countCombinedData(enableForms, region, game); - const totalPages = Math.ceil(totalCount / limit); - - return json({ combinedData, totalPages }); - } catch (err) { - console.error(err); - if (err && typeof err === 'object' && 'status' in err) { - throw err; - } - return json({ error: 'Internal Server Error' }, { status: 500 }); - } -}; diff --git a/src/routes/api/combined-data/all/+server.ts b/src/routes/api/combined-data/all/+server.ts deleted file mode 100644 index 71a054c..0000000 --- a/src/routes/api/combined-data/all/+server.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { json } from '@sveltejs/kit'; -import CombinedDataRepository from '$lib/repositories/CombinedDataRepository'; -import { getOptionalUserId } from '$lib/utils/auth'; -import type { RequestEvent } from '@sveltejs/kit'; - -export const GET = async (event: RequestEvent) => { - const { url } = event; - const enableForms = url.searchParams.get('enableForms') === 'true'; - const region = url.searchParams.get('region') || ''; - const game = url.searchParams.get('game') || ''; - - try { - // Get userId if authenticated, null if not - const userId = await getOptionalUserId(event); - - // If user is authenticated, set their session on the Supabase client - if (userId) { - const { session } = await event.locals.safeGetSession(); - if (session) { - await event.locals.supabase.auth.setSession(session); - } - } - - const repo = new CombinedDataRepository(event.locals.supabase, userId || ''); - const combinedData = await repo.findAllCombinedData(userId || '', enableForms, region, game); - - // Return empty array instead of 404 for better UX - return json(combinedData); - } catch (err) { - console.error(err); - if (err && typeof err === 'object' && 'status' in err) { - throw err; - } - return json({ error: 'Internal Server Error' }, { status: 500 }); - } -}; diff --git a/src/routes/api/games/+server.ts b/src/routes/api/games/+server.ts new file mode 100644 index 0000000..104302b --- /dev/null +++ b/src/routes/api/games/+server.ts @@ -0,0 +1,32 @@ +import { json } from '@sveltejs/kit'; +import type { RequestHandler } from './$types'; + +/** + * GET /api/games + * Returns all games from the games table, sorted by release year descending (newest first) + */ +export const GET: RequestHandler = async ({ locals }) => { + const { supabase } = locals; + + try { + // Query games table for all games, sorted by release year descending + const { data, error } = await supabase + .from('games') + .select('displayName, releaseYear') + .order('releaseYear', { ascending: false }) + .order('displayName', { ascending: true }); // Secondary sort by name for same year + + if (error) { + console.error('Error fetching games:', error); + return json({ error: 'Failed to fetch games' }, { status: 500 }); + } + + // Extract just the display names + const gameNames = data.map((row) => row.displayName); + + return json({ games: gameNames }); + } catch (err) { + console.error('Unexpected error fetching games:', err); + return json({ error: 'Internal server error' }, { status: 500 }); + } +}; diff --git a/src/routes/api/pokedexes/+server.ts b/src/routes/api/pokedexes/+server.ts new file mode 100644 index 0000000..729f4cf --- /dev/null +++ b/src/routes/api/pokedexes/+server.ts @@ -0,0 +1,47 @@ +import { json } from '@sveltejs/kit'; +import type { Pokedex } from '$lib/models/Pokedex'; +import PokedexRepository from '$lib/repositories/PokedexRepository'; +import { requireAuth } from '$lib/utils/auth'; +import type { RequestEvent } from '@sveltejs/kit'; + +// GET: List all pokedexes for user +export const GET = async (event: RequestEvent) => { + try { + const userId = await requireAuth(event); + const repo = new PokedexRepository(event.locals.supabase, userId); + const pokedexes = await repo.findAll(); + return json(pokedexes); + } catch (err) { + console.error('Error in GET /api/pokedexes:', err); + if (err && typeof err === 'object' && 'status' in err) { + throw err; + } + return json({ error: 'Internal Server Error' }, { status: 500 }); + } +}; + +// POST: Create new pokedex +export const POST = async (event: RequestEvent) => { + try { + console.log('POST /api/pokedexes - Starting request'); + const userId = await requireAuth(event); + console.log('POST /api/pokedexes - User authenticated:', userId); + + const data: Partial = await event.request.json(); + console.log('POST /api/pokedexes - Request data:', data); + + data.userId = userId; + + const repo = new PokedexRepository(event.locals.supabase, userId); + const pokedex = await repo.create(data); + console.log('POST /api/pokedexes - Pokédex created:', pokedex._id); + + return json(pokedex); + } catch (err) { + console.error('Error in POST /api/pokedexes:', err); + if (err && typeof err === 'object' && 'status' in err) { + throw err; + } + return json({ error: 'Internal Server Error' }, { status: 500 }); + } +}; diff --git a/src/routes/api/pokedexes/[id]/+server.ts b/src/routes/api/pokedexes/[id]/+server.ts new file mode 100644 index 0000000..2fea2fd --- /dev/null +++ b/src/routes/api/pokedexes/[id]/+server.ts @@ -0,0 +1,107 @@ +import { json } from '@sveltejs/kit'; +import type { Pokedex } from '$lib/models/Pokedex'; +import PokedexRepository from '$lib/repositories/PokedexRepository'; +import { requireAuth } from '$lib/utils/auth'; +import type { RequestEvent } from '@sveltejs/kit'; + +// GET: Get single pokedex by ID +export const GET = async (event: RequestEvent) => { + try { + const userId = await requireAuth(event); + const { id } = event.params; + + if (!id) { + return json({ error: 'Pokedex ID is required' }, { status: 400 }); + } + + const { session } = await event.locals.safeGetSession(); + if (session) { + await event.locals.supabase.auth.setSession(session); + } + + const repo = new PokedexRepository(event.locals.supabase, userId); + const pokedex = await repo.findById(id); + + if (!pokedex) { + // RLS ensures user can only access own pokédexes + // Return 404 whether it doesn't exist or user doesn't own it (don't leak info) + return json({ error: 'Pokedex not found' }, { status: 404 }); + } + + return json(pokedex); + } catch (err) { + console.error(err); + if (err && typeof err === 'object' && 'status' in err) { + throw err; + } + return json({ error: 'Internal Server Error' }, { status: 500 }); + } +}; + +// PUT: Update pokedex +export const PUT = async (event: RequestEvent) => { + try { + const userId = await requireAuth(event); + const { id } = event.params; + const data: Partial = await event.request.json(); + + if (!id) { + return json({ error: 'Pokedex ID is required' }, { status: 400 }); + } + + const { session } = await event.locals.safeGetSession(); + if (session) { + await event.locals.supabase.auth.setSession(session); + } + + const repo = new PokedexRepository(event.locals.supabase, userId); + const pokedex = await repo.update(id, data); + + if (!pokedex) { + return json({ error: 'Pokedex not found' }, { status: 404 }); + } + + return json(pokedex); + } catch (err) { + console.error(err); + if (err && typeof err === 'object' && 'status' in err) { + throw err; + } + return json({ error: 'Internal Server Error' }, { status: 500 }); + } +}; + +// DELETE: Delete pokedex +export const DELETE = async (event: RequestEvent) => { + try { + const userId = await requireAuth(event); + const { id } = event.params; + + if (!id) { + return json({ error: 'Pokedex ID is required' }, { status: 400 }); + } + + const { session } = await event.locals.safeGetSession(); + if (session) { + await event.locals.supabase.auth.setSession(session); + } + + const repo = new PokedexRepository(event.locals.supabase, userId); + + // Verify pokedex exists and user owns it + const pokedex = await repo.findById(id); + if (!pokedex) { + return json({ error: 'Pokedex not found' }, { status: 404 }); + } + + await repo.delete(id); + + return json({ success: true }); + } catch (err) { + console.error(err); + if (err && typeof err === 'object' && 'status' in err) { + throw err; + } + return json({ error: 'Internal Server Error' }, { status: 500 }); + } +}; diff --git a/src/routes/api/catch-records/+server.ts b/src/routes/api/pokedexes/[id]/catch-records/+server.ts similarity index 55% rename from src/routes/api/catch-records/+server.ts rename to src/routes/api/pokedexes/[id]/catch-records/+server.ts index 280a949..1eb4c70 100644 --- a/src/routes/api/catch-records/+server.ts +++ b/src/routes/api/pokedexes/[id]/catch-records/+server.ts @@ -1,22 +1,35 @@ import { json } from '@sveltejs/kit'; import { type CatchRecord } from '$lib/models/CatchRecord'; import CatchRecordRepository from '$lib/repositories/CatchRecordRepository'; +import PokedexRepository from '$lib/repositories/PokedexRepository'; import { requireAuth } from '$lib/utils/auth'; import type { RequestEvent } from '@sveltejs/kit'; +// GET: Get catch records for specific pokédex export const GET = async (event: RequestEvent) => { try { const userId = await requireAuth(event); + const { id: pokedexId } = event.params; + + if (!pokedexId) { + return json({ error: 'Pokedex ID is required' }, { status: 400 }); + } - // Get the user's session and set it on the Supabase client const { session } = await event.locals.safeGetSession(); if (session) { await event.locals.supabase.auth.setSession(session); } - const repo = new CatchRecordRepository(event.locals.supabase, userId); - const catchData = await repo.findByUserId(userId); - // order by pokedexEntryId property, ascending + // Verify user owns this pokédex (RLS will also check, but explicit verification is better UX) + const pokedexRepo = new PokedexRepository(event.locals.supabase, userId); + const pokedex = await pokedexRepo.findById(pokedexId); + + if (!pokedex) { + return json({ error: 'Pokedex not found' }, { status: 404 }); + } + + const repo = new CatchRecordRepository(event.locals.supabase, userId, pokedexId); + const catchData = await repo.findAll(); const sortedData = catchData.sort( (a, b) => Number(a.pokedexEntryId) - Number(b.pokedexEntryId) ); @@ -30,24 +43,35 @@ export const GET = async (event: RequestEvent) => { } }; +// PUT: Upsert single catch record for specific pokédex export const PUT = async (event: RequestEvent) => { try { - // Check if we can get a session first - const { session, user } = await event.locals.safeGetSession(); - const userId = await requireAuth(event); - + const { id: pokedexId } = event.params; const data: Partial = await event.request.json(); - // Get the user's session and set it on the Supabase client + if (!pokedexId) { + return json({ error: 'Pokedex ID is required' }, { status: 400 }); + } + + const { session } = await event.locals.safeGetSession(); if (session) { await event.locals.supabase.auth.setSession(session); } - // Ensure the userId is set to the authenticated user - data.userId = userId; + // Verify user owns this pokédex + const pokedexRepo = new PokedexRepository(event.locals.supabase, userId); + const pokedex = await pokedexRepo.findById(pokedexId); - const repo = new CatchRecordRepository(event.locals.supabase, userId); + if (!pokedex) { + return json({ error: 'Pokedex not found' }, { status: 404 }); + } + + // Ensure the data is scoped to this pokédex and user + data.userId = userId; + data.pokedexId = pokedexId; + + const repo = new CatchRecordRepository(event.locals.supabase, userId, pokedexId); const upsertedRecord = await repo.upsert(data); return json(upsertedRecord); } catch (err) { @@ -59,23 +83,37 @@ export const PUT = async (event: RequestEvent) => { } }; +// POST: Bulk upsert catch records for specific pokédex export const POST = async (event: RequestEvent) => { try { const userId = await requireAuth(event); + const { id: pokedexId } = event.params; const records: Partial[] = await event.request.json(); - // Get the user's session and set it on the Supabase client + if (!pokedexId) { + return json({ error: 'Pokedex ID is required' }, { status: 400 }); + } + const { session } = await event.locals.safeGetSession(); if (session) { await event.locals.supabase.auth.setSession(session); } - const repo = new CatchRecordRepository(event.locals.supabase, userId); + // Verify user owns this pokédex + const pokedexRepo = new PokedexRepository(event.locals.supabase, userId); + const pokedex = await pokedexRepo.findById(pokedexId); + + if (!pokedex) { + return json({ error: 'Pokedex not found' }, { status: 404 }); + } + + const repo = new CatchRecordRepository(event.locals.supabase, userId, pokedexId); const insertedRecords = []; for (const record of records) { - // Ensure the userId is set to the authenticated user + // Ensure the data is scoped to this pokédex and user record.userId = userId; + record.pokedexId = pokedexId; const upsertedRecord = await repo.upsert(record); insertedRecords.push(upsertedRecord); } diff --git a/src/routes/api/pokedexes/[id]/combined-data/+server.ts b/src/routes/api/pokedexes/[id]/combined-data/+server.ts new file mode 100644 index 0000000..3ee5197 --- /dev/null +++ b/src/routes/api/pokedexes/[id]/combined-data/+server.ts @@ -0,0 +1,72 @@ +import { json } from '@sveltejs/kit'; +import CombinedDataRepository from '$lib/repositories/CombinedDataRepository'; +import PokedexRepository from '$lib/repositories/PokedexRepository'; +import { getOptionalUserId } from '$lib/utils/auth'; +import type { RequestEvent } from '@sveltejs/kit'; + +// GET: Get combined data (pokédex entries + catch records) for specific pokédex +export const GET = async (event: RequestEvent) => { + try { + const userId = await getOptionalUserId(event); + const { id: pokedexId } = event.params; + + if (!pokedexId) { + return json({ error: 'Pokedex ID is required' }, { status: 400 }); + } + + // Parse query parameters + const url = new URL(event.request.url); + const page = parseInt(url.searchParams.get('page') || '1'); + const limit = parseInt(url.searchParams.get('limit') || '20'); + const enableForms = url.searchParams.get('enableForms') === 'true'; + const region = url.searchParams.get('region') || ''; + const game = url.searchParams.get('game') || ''; + + // If authenticated, verify user owns this pokédex and get its gameScope + let pokedex; + if (userId) { + const pokedexRepo = new PokedexRepository(event.locals.supabase, userId); + pokedex = await pokedexRepo.findById(pokedexId); + + if (!pokedex) { + // User is authenticated but doesn't own this pokédex (or it doesn't exist) + return json({ error: 'Pokedex not found' }, { status: 404 }); + } + } else { + // Anonymous users cannot view pokédexes + return json({ error: 'Unauthorized' }, { status: 401 }); + } + + // Use pokédex's gameScope as default filter if no manual game filter is set + const effectiveGame = game || pokedex.gameScope || ''; + + const repo = new CombinedDataRepository(event.locals.supabase, userId, pokedexId); + + // Get paginated combined data + const combinedData = await repo.findCombinedData( + userId!, + page, + limit, + enableForms, + region, + effectiveGame + ); + + // Get total count for pagination + const totalCount = await repo.countCombinedData(enableForms, region, effectiveGame); + const totalPages = Math.ceil(totalCount / limit); + + return json({ + combinedData, + totalPages, + currentPage: page, + totalCount + }); + } catch (err) { + console.error(err); + if (err && typeof err === 'object' && 'status' in err) { + throw err; + } + return json({ error: 'Internal Server Error' }, { status: 500 }); + } +}; diff --git a/src/routes/api/seed/+server.ts b/src/routes/api/seed/+server.ts deleted file mode 100644 index 3b4d661..0000000 --- a/src/routes/api/seed/+server.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { json } from '@sveltejs/kit'; -import { createClient } from '@supabase/supabase-js'; -import { PUBLIC_SUPABASE_URL } from '$env/static/public'; -import { SUPABASE_SERVICE_ROLE_KEY } from '$env/static/private'; -import dex from '$lib/helpers/pokedex.json'; -import RegionGameMappingJson from '$lib/helpers/region-game-mapping.json'; - -export const GET = async () => { - // Only allow seeding in development - if (process.env.NODE_ENV === 'production') { - return json({ message: 'Seeding not allowed in production' }, { status: 403 }); - } - - // Use service role key to bypass RLS for seeding operations - const supabase = createClient(PUBLIC_SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY); - - try { - // Seed Pokédex entries - const { count: entriesCount, error: countError } = await supabase - .from('pokedex_entries') - .select('*', { count: 'exact', head: true }); - - if (countError) { - throw new Error(`Failed to check existing entries: ${countError.message}`); - } - - // Only seed if table is empty - if (!entriesCount || entriesCount === 0) { - console.log('Seeding Pokédex entries...'); - - // Transform data to match database schema - const pokemonData = dex.map((pokemon: any) => ({ - pokedexNumber: pokemon.pokedexNumber, - pokemon: pokemon.pokemon, - form: pokemon.form || null, - canGigantamax: pokemon.canGigantamax || false, - regionToCatchIn: pokemon.regionToCatchIn || null, - gamesToCatchIn: pokemon.gamesToCatchIn || null, - regionToEvolveIn: pokemon.regionToEvolveIn || null, - evolutionInformation: pokemon.evolutionInformation || null, - catchInformation: pokemon.catchInformation || null, - boxPlacementFormsBox: pokemon.boxPlacementForms?.box || null, - boxPlacementFormsRow: pokemon.boxPlacementForms?.row || null, - boxPlacementFormsColumn: pokemon.boxPlacementForms?.column || null, - boxPlacementBox: pokemon.boxPlacement?.box || null, - boxPlacementRow: pokemon.boxPlacement?.row || null, - boxPlacementColumn: pokemon.boxPlacement?.column || null - })); - - const { error: insertError } = await supabase.from('pokedex_entries').insert(pokemonData); - - if (insertError) { - throw new Error(`Failed to seed Pokédex entries: ${insertError.message}`); - } - - console.log(`Seeded ${pokemonData.length} Pokédex entries`); - } else { - console.log('Pokédex entries already exist, skipping seeding'); - } - - // Seed region-game mappings (check if table exists first) - const { count: mappingsCount, error: mappingCountError } = await supabase - .from('region_game_mappings') - .select('*', { count: 'exact', head: true }); - - if (!mappingCountError && (!mappingsCount || mappingsCount === 0)) { - console.log('Seeding region-game mappings...'); - - const { error: mappingInsertError } = await supabase - .from('region_game_mappings') - .insert(RegionGameMappingJson); - - if (mappingInsertError) { - throw new Error(`Failed to seed region-game mappings: ${mappingInsertError.message}`); - } - - console.log(`Seeded ${RegionGameMappingJson.length} region-game mappings`); - } else if (!mappingCountError) { - console.log('Region-game mappings already exist, skipping seeding'); - } - - return json({ - message: 'Seeding completed successfully', - seeded: { - pokemonEntries: !entriesCount || entriesCount === 0, - regionGameMappings: !mappingCountError && (!mappingsCount || mappingsCount === 0) - } - }); - } catch (error) { - console.error('Seeding failed:', error); - return json( - { - message: 'Seeding failed', - error: error instanceof Error ? error.message : 'Unknown error' - }, - { status: 500 } - ); - } -}; diff --git a/src/routes/auth/confirm/+server.ts b/src/routes/auth/confirm/+server.ts index bd03c7a..7915543 100644 --- a/src/routes/auth/confirm/+server.ts +++ b/src/routes/auth/confirm/+server.ts @@ -8,7 +8,7 @@ export const GET = async (event) => { } = event; const token_hash = url.searchParams.get('token_hash') as string; const type = url.searchParams.get('type') as EmailOtpType | null; - const next = url.searchParams.get('next') ?? '/'; + const next = url.searchParams.get('next') ?? '/welcome'; if (token_hash && type) { const { error } = await supabase.auth.verifyOtp({ token_hash, type }); diff --git a/src/routes/my-pokedexes/+page.svelte b/src/routes/my-pokedexes/+page.svelte new file mode 100644 index 0000000..78294ae --- /dev/null +++ b/src/routes/my-pokedexes/+page.svelte @@ -0,0 +1,196 @@ + + + + My Pokédexes - Living Dex Tracker + + +
    +
    +

    My Pokédexes

    + +
    + + {#if pokedexes.length === 0} +
    +

    You haven't created any pokédexes yet!

    +

    Get started by creating your first pokédex to track your collection.

    + +
    + {:else} +
    + {#each pokedexes as pokedex (pokedex._id)} + openEditModal(pokedex)} + onDelete={() => handleDelete(pokedex)} + onView={() => handleView(pokedex)} + /> + {/each} +
    + {/if} +
    + + +{#if showModal} + +{/if} diff --git a/src/routes/mydex/+page.svelte b/src/routes/mydex/+page.svelte deleted file mode 100644 index b29e1b2..0000000 --- a/src/routes/mydex/+page.svelte +++ /dev/null @@ -1,321 +0,0 @@ - - - - Living Dex Tracker - My Dex - - -{#if !localUser} -

    Please sign in

    -{:else} -
    - -
    - - - {#if viewAsBoxes} - - {:else} - - {/if} -
    -
    - - -
    -
    -{/if} diff --git a/src/routes/pokedex/[id]/+page.server.ts b/src/routes/pokedex/[id]/+page.server.ts new file mode 100644 index 0000000..8b4fd69 --- /dev/null +++ b/src/routes/pokedex/[id]/+page.server.ts @@ -0,0 +1,28 @@ +import { error, redirect } from '@sveltejs/kit'; +import PokedexRepository from '$lib/repositories/PokedexRepository'; +import type { PageServerLoad } from './$types'; + +export const load: PageServerLoad = async ({ locals, params }) => { + const { safeGetSession, supabase } = locals; + const { session, user } = await safeGetSession(); + + // Require authentication + if (!session || !user) { + throw redirect(303, '/signin'); + } + + const { id } = params; + + // Fetch pokédex to verify ownership (RLS will also block, but we want a proper 404) + const repo = new PokedexRepository(supabase, user.id); + const pokedex = await repo.findById(id); + + if (!pokedex) { + // Either doesn't exist or user doesn't own it + throw error(404, 'Pokédex not found'); + } + + return { + pokedex + }; +}; diff --git a/src/routes/pokedex/[id]/+page.svelte b/src/routes/pokedex/[id]/+page.svelte new file mode 100644 index 0000000..3227188 --- /dev/null +++ b/src/routes/pokedex/[id]/+page.svelte @@ -0,0 +1,470 @@ + + + + {pokedex ? `${pokedex.name} - Living Dex Tracker` : 'Pokédex - Living Dex Tracker'} + + +{#if !localUser} +

    Please sign in

    +{:else if !pokedex} +

    Loading...

    +{:else} +
    + +
    +
    +
    + +
    +

    {pokedex.name}

    + +
    + + {#if pokedex.isLivingDex} +
    + + + + Living +
    + {/if} + {#if pokedex.isShinyDex} +
    + + + + Shiny +
    + {/if} + {#if pokedex.isOriginDex} +
    + + + + Origin +
    + {/if} + {#if pokedex.isFormDex} +
    + + + + Form +
    + {/if} + + + {#if pokedex.gameScope} +
    +
    + + + + + {pokedex.gameScope} +
    + {:else} +
    +
    + + + + All Games +
    + {/if} +
    + + {#if pokedex.description} +

    {pokedex.description}

    + {/if} +
    + + + +
    +
    +
    + + + +
    + + {#if showModal && selectedPokemon} + + + + {/if} +{/if} diff --git a/src/routes/signin/+page.svelte b/src/routes/signin/+page.svelte index faf8b98..20ca8de 100644 --- a/src/routes/signin/+page.svelte +++ b/src/routes/signin/+page.svelte @@ -24,7 +24,7 @@ if (session) { localUser = session.user; user.set(localUser); - await goto('/mydex', { replace: true }); + await goto('/my-pokedexes'); } else { localUser = null; user.set(localUser); diff --git a/src/routes/welcome/+page.svelte b/src/routes/welcome/+page.svelte new file mode 100644 index 0000000..d0a964f --- /dev/null +++ b/src/routes/welcome/+page.svelte @@ -0,0 +1,365 @@ + + + + Welcome - Living Dex Tracker + + + +
    +
    + + {#if showSuccess} +
    +
    + + + + Account Created Successfully! +
    +
    + {/if} + + +
    +
    + +
    +

    + Welcome to Living Dex Tracker! +

    + +
    + +
    +
    + + + +
    +
    +

    Check Your Email

    +

    + We've sent you a magic link to verify your account. Click the link in your email + to sign in and start tracking your Pokédex progress. +

    +
    +
    + +

    + After clicking the link, you'll be automatically signed in and can start tracking your + Pokémon catches across all generations! +

    + + +
    +

    + Haven't received the email? Check your spam or junk + folder. +

    +

    + Still having trouble? + + Contact support + for assistance. +

    +
    +
    +
    + + +
    +
    +

    + + + + What's Next? +

    + +
      +
    • +
      +
      + + + +
      +
      +
      +

      Check your email

      +

      Look for our verification email in your inbox

      +
      +
    • + +
    • +
      +
      + + + +
      +
      +
      +

      Click the magic link

      +

      This will sign you in and verify your account

      +
      +
    • + +
    • +
      +
      + + + +
      +
      +
      +

      Start tracking your Pokémon

      +

      + Create your first Pokédex and begin your journey! +

      +
      +
    • +
    + + +
    +
    + + + + The verification link expires in 24 hours +
    +
    +
    +
    +
    +
    + + +
    +

    What You Can Do With Living Dex Tracker

    +
    +
    +
    + + + +

    Track Multiple Pokédexes

    +

    + Manage different Living Dex challenges across all generations +

    +
    +
    + +
    +
    + + + +

    Share Your Progress

    +

    Connect with friends and share your Pokédex journey

    +
    +
    + +
    +
    + + + +

    Works Offline

    +

    Track your catches even without an internet connection

    +
    +
    +
    +
    +
    +
    + + diff --git a/supabase/migrations/20250126000002_create_pokemon_schema.sql b/supabase/migrations/20250126000002_create_pokemon_schema.sql index 332ec47..4808d79 100644 --- a/supabase/migrations/20250126000002_create_pokemon_schema.sql +++ b/supabase/migrations/20250126000002_create_pokemon_schema.sql @@ -9,17 +9,7 @@ CREATE TABLE pokedex_entries ( "regionToEvolveIn" TEXT, "evolutionInformation" TEXT, "catchInformation" TEXT[], - - -- Box placement for forms view - "boxPlacementFormsBox" INTEGER, - "boxPlacementFormsRow" INTEGER, - "boxPlacementFormsColumn" INTEGER, - - -- Box placement for no-forms view - "boxPlacementBox" INTEGER, - "boxPlacementRow" INTEGER, - "boxPlacementColumn" INTEGER, - + "createdAt" TIMESTAMPTZ DEFAULT NOW(), "updatedAt" TIMESTAMPTZ DEFAULT NOW() ); @@ -65,8 +55,6 @@ CREATE TABLE metadata ( -- Create indexes for better performance CREATE INDEX idx_pokedex_entries_pokedex_number ON pokedex_entries("pokedexNumber"); CREATE INDEX idx_pokedex_entries_pokemon ON pokedex_entries(pokemon); -CREATE INDEX idx_pokedex_entries_box_placement_forms ON pokedex_entries("boxPlacementFormsBox", "boxPlacementFormsRow", "boxPlacementFormsColumn"); -CREATE INDEX idx_pokedex_entries_box_placement ON pokedex_entries("boxPlacementBox", "boxPlacementRow", "boxPlacementColumn"); CREATE INDEX idx_catch_records_user_id ON catch_records("userId"); CREATE INDEX idx_catch_records_pokedex_entry_id ON catch_records("pokedexEntryId"); diff --git a/supabase/migrations/20250126000004_seed_full_pokemon_data.sql b/supabase/migrations/20250126000004_seed_full_pokemon_data.sql deleted file mode 100644 index 10b38fe..0000000 --- a/supabase/migrations/20250126000004_seed_full_pokemon_data.sql +++ /dev/null @@ -1,1462 +0,0 @@ --- Insert full Pokemon dataset -INSERT INTO pokedex_entries ( - "pokedexNumber", - pokemon, - form, - "canGigantamax", - "regionToCatchIn", - "gamesToCatchIn", - "regionToEvolveIn", - "evolutionInformation", - "boxPlacementFormsBox", - "boxPlacementFormsRow", - "boxPlacementFormsColumn", - "boxPlacementBox", - "boxPlacementRow", - "boxPlacementColumn" -) VALUES -(1, 'Bulbasaur', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 1, 1, 1, 1, 1, 1), -(2, 'Ivysaur', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 1, 1, 2, 1, 1, 2), -(3, 'Venusaur', NULL, true, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 1, 1, 3, 1, 1, 3), -(3, 'Venusaur', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 1, 1, 4, null, null, null), -(4, 'Charmander', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 1, 1, 5, 1, 1, 4), -(5, 'Charmeleon', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 1, 1, 6, 1, 1, 5), -(6, 'Charizard', NULL, true, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 1, 2, 1, 1, 1, 6), -(7, 'Squirtle', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 1, 2, 2, 1, 2, 1), -(8, 'Wartortle', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 1, 2, 3, 1, 2, 2), -(9, 'Blastoise', NULL, true, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 1, 2, 4, 1, 2, 3), -(10, 'Caterpie', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 1, 2, 5, 1, 2, 4), -(11, 'Metapod', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 1, 2, 6, 1, 2, 5), -(12, 'Butterfree', NULL, true, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 1, 3, 1, 1, 2, 6), -(12, 'Butterfree', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 1, 3, 2, null, null, null), -(13, 'Weedle', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 1, 3, 3, 1, 3, 1), -(14, 'Kakuna', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 1, 3, 4, 1, 3, 2), -(15, 'Beedrill', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 1, 3, 5, 1, 3, 3), -(16, 'Pidgey', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 1, 3, 6, 1, 3, 4), -(17, 'Pidgeotto', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 1, 4, 1, 1, 3, 5), -(18, 'Pidgeot', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 1, 4, 2, 1, 3, 6), -(19, 'Rattata', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 1, 4, 3, 1, 4, 1), -(19, 'Rattata', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 1, 4, 4, null, null, null), -(19, 'Rattata', 'Alolan', false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, NULL, 1, 4, 5, null, null, null), -(20, 'Raticate', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 1, 4, 6, 1, 4, 2), -(20, 'Raticate', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 1, 5, 1, null, null, null), -(20, 'Raticate', 'Alolan', false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Route 8, Memorial Hill, Akala Outskirts, Route 10, Tapu Village, Route 14, Route 15, Route 16, Route 17, Mount Lanakila, Poni Plains', 1, 5, 2, null, null, null), -(21, 'Spearow', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 1, 5, 3, 1, 4, 3), -(22, 'Fearow', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 1, 5, 4, 1, 4, 4), -(23, 'Ekans', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'LG: Eevee'], NULL, NULL, 1, 5, 5, 1, 4, 5), -(24, 'Arbok', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'LG: Eevee'], NULL, NULL, 1, 5, 6, 1, 4, 6), -(25, 'Pikachu', NULL, true, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 2, 1, 1, 1, 5, 1), -(25, 'Pikachu', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 2, 1, 2, null, null, null), -(25, 'Pikachu', 'Original Cap', false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Event (powersaves)', 2, 1, 3, null, null, null), -(25, 'Pikachu', 'Hoenn Cap', false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Event (powersaves)', 2, 1, 4, null, null, null), -(25, 'Pikachu', 'Sinnoh Cap', false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Event (powersaves)', 2, 1, 5, null, null, null), -(25, 'Pikachu', 'Unova Cap', false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Event (powersaves)', 2, 1, 6, null, null, null), -(25, 'Pikachu', 'Kalos Cap', false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Event (powersaves)', 2, 2, 1, null, null, null), -(25, 'Pikachu', 'Alola Cap', false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Event (powersaves)', 2, 2, 2, null, null, null), -(25, 'Pikachu', 'Partner Cap', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, 'Event (pkhex)', 2, 2, 3, null, null, null), -(25, 'Pikachu', 'World Cap', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, 'Event (pkhex)', 2, 2, 4, null, null, null), -(26, 'Raichu', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 2, 2, 5, 1, 5, 2), -(26, 'Raichu', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 2, 2, 6, null, null, null), -(26, 'Raichu', 'Alolan', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], 'Alola', NULL, 2, 3, 1, null, null, null), -(27, 'Sandshrew', NULL, false, 'Kanto', ARRAY['Blue', 'Yellow', 'LG: Pikachu'], NULL, NULL, 2, 3, 2, 1, 5, 3), -(27, 'Sandshrew', 'Alolan', false, 'Alola', ARRAY['Moon', 'UM'], NULL, 'Tapu Village, Route 14, Mount Lanakila Ultra Moon only. Evolves via Ice Stone.', 2, 3, 3, null, null, null), -(28, 'Sandslash', NULL, false, 'Kanto', ARRAY['Blue', 'Yellow', 'LG: Pikachu'], NULL, NULL, 2, 3, 4, 1, 5, 4), -(28, 'Sandslash', 'Alolan', false, 'Alola', ARRAY['Moon', 'UM'], NULL, 'Evolves from Sandshrew with an ice stone', 2, 3, 5, null, null, null), -(29, 'Nidoran♀', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 2, 3, 6, 1, 5, 5), -(30, 'Nidorina', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 2, 4, 1, 1, 5, 6), -(31, 'Nidoqueen', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 2, 4, 2, 2, 1, 1), -(32, 'Nidoran♂', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 2, 4, 3, 2, 1, 2), -(33, 'Nidorino', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 2, 4, 4, 2, 1, 3), -(34, 'Nidoking', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 2, 4, 5, 2, 1, 4), -(35, 'Clefairy', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 2, 4, 6, 2, 1, 5), -(36, 'Clefable', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 2, 5, 1, 2, 1, 6), -(37, 'Vulpix', NULL, false, 'Kanto', ARRAY['Blue', 'Yellow', 'LG: Eevee'], NULL, NULL, 2, 5, 2, 2, 2, 1), -(37, 'Vulpix', 'Alolan', false, 'Alola', ARRAY['Sun', 'US'], NULL, 'Tapu Village, Route 14, Mount Lanakila Ultra Sun only. Evolves via Ice Stone.', 2, 5, 3, null, null, null), -(38, 'Ninetales', NULL, false, 'Kanto', ARRAY['Blue', 'Yellow', 'LG: Eevee'], NULL, NULL, 2, 5, 4, 2, 2, 2), -(38, 'Ninetales', 'Alolan', false, 'Alola', ARRAY['Sun', 'US'], NULL, 'Evolves from Vulpix with an ice stone', 2, 5, 5, null, null, null), -(39, 'Jigglypuff', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 2, 5, 6, 2, 2, 3), -(40, 'Wigglytuff', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 3, 1, 1, 2, 2, 4), -(41, 'Zubat', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 3, 1, 2, 2, 2, 5), -(41, 'Zubat', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 3, 1, 3, null, null, null), -(42, 'Golbat', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 3, 1, 4, 2, 2, 6), -(42, 'Golbat', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 3, 1, 5, null, null, null), -(43, 'Oddish', NULL, false, 'Kanto', ARRAY['Red', 'Yellow', 'LG: Pikachu'], NULL, NULL, 3, 1, 6, 2, 3, 1), -(44, 'Gloom', NULL, false, 'Kanto', ARRAY['Red', 'Yellow', 'LG: Pikachu'], NULL, NULL, 3, 2, 1, 2, 3, 2), -(44, 'Gloom', 'Female', false, 'Kanto', ARRAY['Red', 'Yellow', 'LG: Pikachu'], NULL, NULL, 3, 2, 2, null, null, null), -(45, 'Vileplume', NULL, false, 'Kanto', ARRAY['Red', 'Yellow', 'LG: Pikachu'], NULL, NULL, 3, 2, 3, 2, 3, 3), -(45, 'Vileplume', 'Female', false, 'Kanto', ARRAY['Red', 'Yellow', 'LG: Pikachu'], NULL, NULL, 3, 2, 4, null, null, null), -(46, 'Paras', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 3, 2, 5, 2, 3, 4), -(47, 'Parasect', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 3, 2, 6, 2, 3, 5), -(48, 'Venonat', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 3, 3, 1, 2, 3, 6), -(49, 'Venomoth', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 3, 3, 2, 2, 4, 1), -(50, 'Diglett', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 3, 3, 3, 2, 4, 2), -(50, 'Diglett', 'Alolan', false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, NULL, 3, 3, 4, null, null, null), -(51, 'Dugtrio', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 3, 3, 5, 2, 4, 3), -(51, 'Dugtrio', 'Alolan', false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, NULL, 3, 3, 6, null, null, null), -(52, 'Meowth', NULL, true, 'Kanto', ARRAY['Blue', 'LG: Eevee'], NULL, NULL, 3, 4, 1, 2, 4, 4), -(52, 'Meowth', 'Alolan', false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, NULL, 3, 4, 2, null, null, null), -(52, 'Meowth', 'Galarian', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 3, 4, 3, null, null, null), -(53, 'Persian', NULL, false, 'Kanto', ARRAY['Blue', 'LG: Eevee'], NULL, NULL, 3, 4, 4, 2, 4, 5), -(53, 'Persian', 'Alolan', false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Malie Garden, or Meowth: Route 2, Hau’oli City (Shopping District), Hau’oli City (Marina), Route 1 (Trainers’ School), Malie Garden Evolves via level-up with high happiness.', 3, 4, 5, null, null, null), -(54, 'Psyduck', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 3, 4, 6, 2, 4, 6), -(55, 'Golduck', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 3, 5, 1, 2, 5, 1), -(56, 'Mankey', NULL, false, 'Kanto', ARRAY['Red', 'Yellow', 'LG: Pikachu'], NULL, NULL, 3, 5, 2, 2, 5, 2), -(57, 'Primeape', NULL, false, 'Kanto', ARRAY['Red', 'Yellow', 'LG: Pikachu'], NULL, NULL, 3, 5, 3, 2, 5, 3), -(58, 'Growlithe', NULL, false, 'Kanto', ARRAY['Red', 'Yellow', 'LG: Pikachu'], NULL, NULL, 3, 5, 4, 2, 5, 4), -(58, 'Growlithe', 'Hisuian', false, 'Hisui', ARRAY['PLA'], NULL, 'Cobalt Coastlands: Windbreak Stand, Veilstone Cape, massive mass outbreaks (Hisuian Form)', 3, 5, 5, null, null, null), -(59, 'Arcanine', NULL, false, 'Kanto', ARRAY['Red', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 3, 5, 6, 2, 5, 5), -(59, 'Arcanine', 'Hisuian', false, 'Hisui', ARRAY['PLA'], NULL, 'Evolves from Growlithe with a fire stone', 4, 1, 1, null, null, null), -(60, 'Poliwag', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 4, 1, 2, 2, 5, 6), -(61, 'Poliwhirl', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 4, 1, 3, 3, 1, 1), -(62, 'Poliwrath', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 4, 1, 4, 3, 1, 2), -(63, 'Abra', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 4, 1, 5, 3, 1, 3), -(64, 'Kadabra', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 4, 1, 6, 3, 1, 4), -(64, 'Kadabra', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 4, 2, 1, null, null, null), -(65, 'Alakazam', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 4, 2, 2, 3, 1, 5), -(65, 'Alakazam', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 4, 2, 3, null, null, null), -(66, 'Machop', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 4, 2, 4, 3, 1, 6), -(67, 'Machoke', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 4, 2, 5, 3, 2, 1), -(68, 'Machamp', NULL, true, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 4, 2, 6, 3, 2, 2), -(69, 'Bellsprout', NULL, false, 'Kanto', ARRAY['Blue', 'Yellow', 'LG: Eevee'], NULL, NULL, 4, 3, 1, 3, 2, 3), -(70, 'Weepinbell', NULL, false, 'Kanto', ARRAY['Blue', 'Yellow', 'LG: Eevee'], NULL, NULL, 4, 3, 2, 3, 2, 4), -(71, 'Victreebel', NULL, false, 'Kanto', ARRAY['Blue', 'Yellow', 'LG: Eevee'], NULL, NULL, 4, 3, 3, 3, 2, 5), -(72, 'Tentacool', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 4, 3, 4, 3, 2, 6), -(73, 'Tentacruel', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 4, 3, 5, 3, 3, 1), -(74, 'Geodude', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 4, 3, 6, 3, 3, 2), -(74, 'Geodude', 'Alolan', false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Route 12 and Blush Mountain, evolves at level 25', 4, 4, 1, null, null, null), -(75, 'Graveler', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 4, 4, 2, 3, 3, 3), -(75, 'Graveler', 'Alolan', false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Evolves from Geodude at level 25', 4, 4, 3, null, null, null), -(76, 'Golem', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 4, 4, 4, 3, 3, 4), -(76, 'Golem', 'Alolan', false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Evolves from Graveler by trading', 4, 4, 5, null, null, null), -(77, 'Ponyta', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 4, 4, 6, 3, 3, 5), -(77, 'Ponyta', 'Galarian', false, 'Galar', ARRAY['Shield'], NULL, NULL, 4, 5, 1, null, null, null), -(78, 'Rapidash', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 4, 5, 2, 3, 3, 6), -(78, 'Rapidash', 'Galarian', false, 'Galar', ARRAY['Shield'], NULL, NULL, 4, 5, 3, null, null, null), -(79, 'Slowpoke', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 4, 5, 4, 3, 4, 1), -(79, 'Slowpoke', 'Galarian', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 4, 5, 5, null, null, null), -(80, 'Slowbro', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 4, 5, 6, 3, 4, 2), -(80, 'Slowbro', 'Galarian', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 5, 1, 1, null, null, null), -(81, 'Magnemite', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 5, 1, 2, 3, 4, 3), -(82, 'Magneton', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 5, 1, 3, 3, 4, 4), -(83, 'Farfetch’d', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 5, 1, 4, 3, 4, 5), -(83, 'Farfetch’d', 'Galarian', false, 'Galar', ARRAY['Sword'], NULL, 'Route 5, Giant''s Mirror (Galarian Form) Dusty Bowl, North Lake Miloch, Stony Wilderness (Max Raid Battle) (Galarian Form)', 5, 1, 5, null, null, null), -(84, 'Doduo', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 5, 1, 6, 3, 4, 6), -(84, 'Doduo', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 5, 2, 1, null, null, null), -(85, 'Dodrio', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 5, 2, 2, 3, 5, 1), -(85, 'Dodrio', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 5, 2, 3, null, null, null), -(86, 'Seel', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 5, 2, 4, 3, 5, 2), -(87, 'Dewgong', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 5, 2, 5, 3, 5, 3), -(88, 'Grimer', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu'], NULL, NULL, 5, 2, 6, 3, 5, 4), -(88, 'Grimer', 'Alolan', false, 'Alola', ARRAY['US'], NULL, 'Hau’oli City (Shopping District), Hau’oli City (Marina), Route 1 (Trainers’ School), Malie City, Malie City (Outer Cape) Evolves at level 38.', 5, 3, 1, null, null, null), -(89, 'Muk', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu'], NULL, NULL, 5, 3, 2, 3, 5, 5), -(89, 'Muk', 'Alolan', false, 'Alola', ARRAY['US'], NULL, 'Evolves from Grimer at level 38', 5, 3, 3, null, null, null), -(90, 'Shellder', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 5, 3, 4, 3, 5, 6), -(91, 'Cloyster', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 5, 3, 5, 4, 1, 1), -(92, 'Gastly', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 5, 3, 6, 4, 1, 2), -(93, 'Haunter', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 5, 4, 1, 4, 1, 3), -(94, 'Gengar', NULL, true, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 5, 4, 2, 4, 1, 4), -(95, 'Onix', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 5, 4, 3, 4, 1, 5), -(96, 'Drowzee', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 5, 4, 4, 4, 1, 6), -(97, 'Hypno', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 5, 4, 5, 4, 2, 1), -(97, 'Hypno', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 5, 4, 6, null, null, null), -(98, 'Krabby', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 5, 5, 1, 4, 2, 2), -(99, 'Kingler', NULL, true, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 5, 5, 2, 4, 2, 3), -(100, 'Voltorb', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 5, 5, 3, 4, 2, 4), -(100, 'Voltorb', 'Hisuian', false, 'Hisui', ARRAY['PLA'], NULL, 'Coronet Highlands: Celestica Ruins (in boxes), Sacred Plaza (also in boxes), massive mass outbreaks (Hisuian Form)', 5, 5, 4, null, null, null), -(101, 'Electrode', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 5, 5, 5, 4, 2, 5), -(101, 'Electrode', 'Hisuian', false, 'Hisui', ARRAY['PLA'], NULL, 'Evolves from Voltorb with a leaf stone', 5, 5, 6, null, null, null), -(102, 'Exeggcute', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 6, 1, 1, 4, 2, 6), -(103, 'Exeggutor', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 6, 1, 2, 4, 3, 1), -(103, 'Exeggutor', 'Alolan', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], 'Alola', NULL, 6, 1, 3, null, null, null), -(104, 'Cubone', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 6, 1, 4, 4, 3, 2), -(105, 'Marowak', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 6, 1, 5, 4, 3, 3), -(105, 'Marowak', 'Alolan', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], 'Alola', NULL, 6, 1, 6, null, null, null), -(106, 'Hitmonlee', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 6, 2, 1, 4, 3, 4), -(107, 'Hitmonchan', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 6, 2, 2, 4, 3, 5), -(108, 'Lickitung', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 6, 2, 3, 4, 3, 6), -(109, 'Koffing', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'LG: Eevee'], NULL, NULL, 6, 2, 4, 4, 4, 1), -(110, 'Weezing', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'LG: Eevee'], NULL, NULL, 6, 2, 5, 4, 4, 2), -(110, 'Weezing', 'Galarian', false, 'Kanto', ARRAY['Red', 'Blue', 'LG: Eevee'], 'Galar', NULL, 6, 2, 6, null, null, null), -(111, 'Rhyhorn', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 6, 3, 1, 4, 4, 3), -(111, 'Rhyhorn', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 6, 3, 2, null, null, null), -(112, 'Rhydon', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 6, 3, 3, 4, 4, 4), -(112, 'Rhydon', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 6, 3, 4, null, null, null), -(113, 'Chansey', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 6, 3, 5, 4, 4, 5), -(114, 'Tangela', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 6, 3, 6, 4, 4, 6), -(115, 'Kangaskhan', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 6, 4, 1, 4, 5, 1), -(116, 'Horsea', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 6, 4, 2, 4, 5, 2), -(117, 'Seadra', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 6, 4, 3, 4, 5, 3), -(118, 'Goldeen', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 6, 4, 4, 4, 5, 4), -(118, 'Goldeen', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 6, 4, 5, null, null, null), -(119, 'Seaking', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 6, 4, 6, 4, 5, 5), -(119, 'Seaking', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 6, 5, 1, null, null, null), -(120, 'Staryu', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 6, 5, 2, 4, 5, 6), -(121, 'Starmie', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 6, 5, 3, 5, 1, 1), -(122, 'Mr. Mime', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 6, 5, 4, 5, 1, 2), -(122, 'Mr. Mime', 'Galarian', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 6, 5, 5, null, null, null), -(123, 'Scyther', NULL, false, 'Kanto', ARRAY['Red', 'Yellow', 'LG: Pikachu'], NULL, NULL, 6, 5, 6, 5, 1, 3), -(123, 'Scyther', 'Female', false, 'Kanto', ARRAY['Red', 'Yellow', 'LG: Pikachu'], NULL, NULL, 7, 1, 1, null, null, null), -(124, 'Jynx', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 7, 1, 2, 5, 1, 4), -(125, 'Electabuzz', NULL, false, 'Kanto', ARRAY['Red', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 7, 1, 3, 5, 1, 5), -(126, 'Magmar', NULL, false, 'Kanto', ARRAY['Blue', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 7, 1, 4, 5, 1, 6), -(127, 'Pinsir', NULL, false, 'Kanto', ARRAY['Blue', 'Yellow', 'LG: Eevee'], NULL, NULL, 7, 1, 5, 5, 2, 1), -(128, 'Tauros', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 7, 1, 6, 5, 2, 2), -(128, 'Tauros', 'Paldean', false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 7, 2, 1, null, null, null), -(128, 'Tauros', 'Paldean-Fire', false, 'Paldea', ARRAY['Scarlet'], NULL, NULL, 7, 2, 2, null, null, null), -(128, 'Tauros', 'Paldean-Water', false, 'Paldea', ARRAY['Violet'], NULL, NULL, 7, 2, 3, null, null, null), -(129, 'Magikarp', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 7, 2, 4, 5, 2, 3), -(129, 'Magikarp', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 7, 2, 5, null, null, null), -(130, 'Gyarados', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 7, 2, 6, 5, 2, 4), -(130, 'Gyarados', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 7, 3, 1, null, null, null), -(131, 'Lapras', NULL, true, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 7, 3, 2, 5, 2, 5), -(132, 'Ditto', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 7, 3, 3, 5, 2, 6), -(133, 'Eevee', NULL, true, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 7, 3, 4, 5, 3, 1), -(133, 'Eevee', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 7, 3, 5, null, null, null), -(134, 'Vaporeon', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], 'Kanto', 'evolves from Eevee when exposed to a Water Stone.', 7, 3, 6, 5, 3, 2), -(135, 'Jolteon', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], 'Kanto', 'evolves from Eevee when exposed to a Thunder Stone.', 7, 4, 1, 5, 3, 3), -(136, 'Flareon', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], 'Kanto', 'evolves from Eevee when exposed to a Fire Stone.', 7, 4, 2, 5, 3, 4), -(137, 'Porygon', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 7, 4, 3, 5, 3, 5), -(138, 'Omanyte', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 7, 4, 4, 5, 3, 6), -(139, 'Omastar', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 7, 4, 5, 5, 4, 1), -(140, 'Kabuto', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 7, 4, 6, 5, 4, 2), -(141, 'Kabutops', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 7, 5, 1, 5, 4, 3), -(142, 'Aerodactyl', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 7, 5, 2, 5, 4, 4), -(143, 'Snorlax', NULL, true, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 7, 5, 3, 5, 4, 5), -(144, 'Articuno', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 7, 5, 4, 5, 4, 6), -(144, 'Articuno', 'Galarian', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 7, 5, 5, null, null, null), -(145, 'Zapdos', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 7, 5, 6, 5, 5, 1), -(145, 'Zapdos', 'Galarian', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 8, 1, 1, null, null, null), -(146, 'Moltres', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 8, 1, 2, 5, 5, 2), -(146, 'Moltres', 'Galarian', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 8, 1, 3, null, null, null), -(147, 'Dratini', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 8, 1, 4, 5, 5, 3), -(148, 'Dragonair', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 8, 1, 5, 5, 5, 4), -(149, 'Dragonite', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 8, 1, 6, 5, 5, 5), -(150, 'Mewtwo', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 8, 2, 1, 5, 5, 6), -(151, 'Mew', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, 'R/B: https://www.youtube.com/watch?v=rvhuJsS4EhE&t=473s Yellow: https://www.reddit.com/r/pokemon/comments/7c5fpc', 8, 2, 2, 6, 1, 1), -(152, 'Chikorita', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 9, 1, 1, 6, 1, 2), -(153, 'Bayleef', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 9, 1, 2, 6, 1, 3), -(154, 'Meganium', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 9, 1, 3, 6, 1, 4), -(154, 'Meganium', 'Female', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 9, 1, 4, null, null, null), -(155, 'Cyndaquil', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 9, 1, 5, 6, 1, 5), -(156, 'Quilava', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 9, 1, 6, 6, 1, 6), -(157, 'Typhlosion', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 9, 2, 1, 6, 2, 1), -(157, 'Typhlosion', 'Hisuian', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], 'Hisui', 'Evolves from Quilava at level 36', 9, 2, 2, null, null, null), -(158, 'Totodile', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 9, 2, 3, 6, 2, 2), -(159, 'Croconaw', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 9, 2, 4, 6, 2, 3), -(160, 'Feraligatr', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 9, 2, 5, 6, 2, 4), -(161, 'Sentret', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, 'Route 29, 4am-6pm', 9, 2, 6, 6, 2, 5), -(162, 'Furret', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 9, 3, 1, 6, 2, 6), -(163, 'Hoothoot', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 9, 3, 2, 6, 3, 1), -(164, 'Noctowl', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 9, 3, 3, 6, 3, 2), -(165, 'Ledyba', NULL, false, 'Johto', ARRAY['Silver', 'Crystal', 'SS'], NULL, 'Route 30, 4am-10am', 9, 3, 4, 6, 3, 3), -(165, 'Ledyba', 'Female', false, 'Johto', ARRAY['Silver', 'Crystal', 'SS'], NULL, NULL, 9, 3, 5, null, null, null), -(166, 'Ledian', NULL, false, 'Johto', ARRAY['Silver', 'Crystal', 'SS'], NULL, NULL, 9, 3, 6, 6, 3, 4), -(166, 'Ledian', 'Female', false, 'Johto', ARRAY['Silver', 'Crystal', 'SS'], NULL, NULL, 9, 4, 1, null, null, null), -(167, 'Spinarak', NULL, false, 'Johto', ARRAY['Gold', 'Crystal', 'HG'], NULL, NULL, 9, 4, 2, 6, 3, 5), -(168, 'Ariados', NULL, false, 'Johto', ARRAY['Gold', 'Crystal', 'HG'], NULL, 'Route 37, 6pm-4am', 9, 4, 3, 6, 3, 6), -(169, 'Crobat', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], 'Johto', NULL, 9, 4, 4, 6, 4, 1), -(170, 'Chinchou', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 9, 4, 5, 6, 4, 2), -(171, 'Lanturn', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 9, 4, 6, 6, 4, 3), -(172, 'Pichu', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, 'Gift egg (two pikachu in daycare)', 9, 5, 1, 6, 4, 4), -(173, 'Cleffa', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, 'Gift egg', 9, 5, 2, 6, 4, 5), -(174, 'Igglybuff', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, 'Gift egg', 9, 5, 3, 6, 4, 6), -(175, 'Togepi', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 9, 5, 4, 6, 5, 1), -(176, 'Togetic', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 9, 5, 5, 6, 5, 2), -(177, 'Natu', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 9, 5, 6, 6, 5, 3), -(178, 'Xatu', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 10, 1, 1, 6, 5, 4), -(178, 'Xatu', 'Female', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 10, 1, 2, null, null, null), -(179, 'Mareep', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'HG', 'SS'], NULL, 'Route 32, Route 42, Route 43', 10, 1, 3, 6, 5, 5), -(180, 'Flaaffy', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'HG', 'SS'], NULL, 'Evolves from Mareep', 10, 1, 4, 6, 5, 6), -(181, 'Ampharos', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'HG', 'SS'], NULL, 'Evolves from Flaaffy', 10, 1, 5, 7, 1, 1), -(182, 'Bellossom', NULL, false, 'Kanto', ARRAY['Red', 'Yellow', 'LG: Pikachu'], 'Johto', NULL, 10, 1, 6, 7, 1, 2), -(183, 'Marill', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 10, 2, 1, 7, 1, 3), -(184, 'Azumarill', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 10, 2, 2, 7, 1, 4), -(185, 'Sudowoodo', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 10, 2, 3, 7, 1, 5), -(185, 'Sudowoodo', 'Female', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 10, 2, 4, null, null, null), -(186, 'Politoed', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], 'Johto', 'It evolves from Poliwhirl when traded while holding a King''s Rock', 10, 2, 5, 7, 1, 6), -(186, 'Politoed', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], 'Johto', 'It evolves from Poliwhirl when traded while holding a King''s Rock', 10, 2, 6, null, null, null), -(187, 'Hoppip', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, 'Route 29 4am-6pm', 10, 3, 1, 7, 2, 1), -(188, 'Skiploom', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 10, 3, 2, 7, 2, 2), -(189, 'Jumpluff', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 10, 3, 3, 7, 2, 3), -(190, 'Aipom', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 10, 3, 4, 7, 2, 4), -(190, 'Aipom', 'Female', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 10, 3, 5, null, null, null), -(191, 'Sunkern', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 10, 3, 6, 7, 2, 5), -(192, 'Sunflora', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 10, 4, 1, 7, 2, 6), -(193, 'Yanma', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, 'Route 35 (4am-10am?)', 10, 4, 2, 7, 3, 1), -(194, 'Wooper', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 10, 4, 3, 7, 3, 2), -(194, 'Wooper', 'Female', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 10, 4, 4, null, null, null), -(194, 'Wooper', 'Paldean', false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 10, 4, 5, null, null, null), -(195, 'Quagsire', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 10, 4, 6, 7, 3, 3), -(195, 'Quagsire', 'Female', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 10, 5, 1, null, null, null), -(196, 'Espeon', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], 'Johto', 'evolves from Eevee when leveled up with high friendship (220 before Generation VIII or 160 since) during the day, except in areas with a Moss Rock or Ice Rock, or if the evolutionary conditions for it to evolve into Sylveon have also been met.', 10, 5, 2, 7, 3, 4), -(197, 'Umbreon', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], 'Johto', 'evolves from Eevee when leveled up with high friendship (220 before Generation VIII or 160 since) during the night, except in areas with a Moss Rock or Ice Rock, or if the evolutionary conditions for it to evolve into Sylveon have also been met.', 10, 5, 3, 7, 3, 5), -(198, 'Murkrow', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, 'Route 7, 6pm-4am', 10, 5, 4, 7, 3, 6), -(198, 'Murkrow', 'Female', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, 'Route 7, 6pm-4am', 10, 5, 5, null, null, null), -(199, 'Slowking', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], 'Johto', 'It evolves from Slowpoke when traded while holding a King''s Rock', 10, 5, 6, 7, 4, 1), -(199, 'Slowking', 'Galarian', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 11, 1, 1, null, null, null), -(200, 'Misdreavus', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, 'Mt. Silver, 2f, 6pm-4am', 11, 1, 2, 7, 4, 2), -(201, 'Unown', 'A', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 11, 1, 3, 7, 4, 3), -(201, 'Unown', 'B', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 11, 1, 4, null, null, null), -(201, 'Unown', 'C', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 11, 1, 5, null, null, null), -(201, 'Unown', 'D', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 11, 1, 6, null, null, null), -(201, 'Unown', 'E', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 11, 2, 1, null, null, null), -(201, 'Unown', 'F', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 11, 2, 2, null, null, null), -(201, 'Unown', 'G', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 11, 2, 3, null, null, null), -(201, 'Unown', 'H', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 11, 2, 4, null, null, null), -(201, 'Unown', 'I', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 11, 2, 5, null, null, null), -(201, 'Unown', 'J', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 11, 2, 6, null, null, null), -(201, 'Unown', 'K', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 11, 3, 1, null, null, null), -(201, 'Unown', 'L', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 11, 3, 2, null, null, null), -(201, 'Unown', 'M', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 11, 3, 3, null, null, null), -(201, 'Unown', 'N', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 11, 3, 4, null, null, null), -(201, 'Unown', 'O', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 11, 3, 5, null, null, null), -(201, 'Unown', 'P', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 11, 3, 6, null, null, null), -(201, 'Unown', 'Q', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 11, 4, 1, null, null, null), -(201, 'Unown', 'R', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 11, 4, 2, null, null, null), -(201, 'Unown', 'S', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 11, 4, 3, null, null, null), -(201, 'Unown', 'T', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 11, 4, 4, null, null, null), -(201, 'Unown', 'U', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 11, 4, 5, null, null, null), -(201, 'Unown', 'V', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 11, 4, 6, null, null, null), -(201, 'Unown', 'W', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 11, 5, 1, null, null, null), -(201, 'Unown', 'X', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 11, 5, 2, null, null, null), -(201, 'Unown', 'Y', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 11, 5, 3, null, null, null), -(201, 'Unown', 'Z', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 11, 5, 4, null, null, null), -(201, 'Unown', '!', false, 'Johto', ARRAY['HG', 'SS'], NULL, NULL, 11, 5, 5, null, null, null), -(201, 'Unown', '?', false, 'Johto', ARRAY['HG', 'SS'], NULL, NULL, 11, 5, 6, null, null, null), -(202, 'Wobbuffet', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, 'Dark Cave, Blackthorn City Entrance, 6pm-4am', 12, 1, 1, 7, 4, 4), -(202, 'Wobbuffet', 'Female', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, 'Dark Cave, Blackthorn City Entrance, 6pm-4am', 12, 1, 2, null, null, null), -(203, 'Girafarig', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'HG', 'SS'], NULL, 'Route 43', 12, 1, 3, 7, 4, 5), -(203, 'Girafarig', 'Female', false, 'Johto', ARRAY['Gold', 'Silver', 'HG', 'SS'], NULL, 'Route 43', 12, 1, 4, null, null, null), -(204, 'Pineco', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 12, 1, 5, 7, 4, 6), -(205, 'Forretress', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 12, 1, 6, 7, 5, 1), -(206, 'Dunsparce', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, 'Dark Cave, Violet City Entrance - catch as many as you can for Dudunsparce 2 and 3 segment', 12, 2, 1, 7, 5, 2), -(207, 'Gligar', NULL, false, 'Johto', ARRAY['Gold', 'Crystal', 'HG'], NULL, 'Route 45', 12, 2, 2, 7, 5, 3), -(207, 'Gligar', 'Female', false, 'Johto', ARRAY['Gold', 'Crystal', 'HG'], NULL, 'Route 45', 12, 2, 3, null, null, null), -(208, 'Steelix', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], 'Johto', 'It evolves from Onix when traded while holding a Metal Coat.', 12, 2, 4, 7, 5, 4), -(208, 'Steelix', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], 'Johto', 'It evolves from Onix when traded while holding a Metal Coat.', 12, 2, 5, null, null, null), -(209, 'Snubbull', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 12, 2, 6, 7, 5, 5), -(210, 'Granbull', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 12, 3, 1, 7, 5, 6), -(211, 'Qwilfish', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, 'Route 32, Super Rod', 12, 3, 2, 8, 1, 1), -(211, 'Qwilfish', 'Hisuian', false, 'Hisui', ARRAY['PLA'], NULL, 'Obsidian Fieldlands: near Ramanas Island (Hisuian Form) - Cobalt Coastlands: near Bathers'' Lagoon, near Hideaway Bay, near Tombolo Walk, near Sand''s Reach, Tranquility Cove, Islespy Shore and nearby (additional Alpha icon.png), Lunker''s Lair, near Seagrass Haven, near Firespit Island, massive mass outbreaks (Hisuian Form)', 12, 3, 3, null, null, null), -(212, 'Scizor', NULL, false, 'Kanto', ARRAY['Red', 'Yellow', 'LG: Pikachu'], 'Johto', 'It evolves from Scyther when traded while holding a Metal Coat.', 12, 3, 4, 8, 1, 2), -(212, 'Scizor', 'Female', false, 'Kanto', ARRAY['Red', 'Yellow', 'LG: Pikachu'], 'Johto', 'It evolves from Scyther when traded while holding a Metal Coat.', 12, 3, 5, null, null, null), -(213, 'Shuckle', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 12, 3, 6, 8, 1, 3), -(214, 'Heracross', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 12, 4, 1, 8, 1, 4), -(214, 'Heracross', 'Female', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 12, 4, 2, null, null, null), -(215, 'Sneasel', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, 'Ice Path, b3f, 6pm-4am', 12, 4, 3, 8, 1, 5), -(215, 'Sneasel', 'Female', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, 'Ice Path, b3f, 6pm-4am', 12, 4, 4, null, null, null), -(215, 'Sneasel', 'Hisuian', false, 'Hisui', ARRAY['PLA'], NULL, 'Coronet Highlands: near Celestica Trail, near Primeval Grotto, massive mass outbreaks (Hisuian Form) - Alabaster Icelands: near Avalugg''s Legacy (additional Alpha icon.png), Glacier Terrace, near Pearl Settlement (Hisuian Form)', 12, 4, 5, null, null, null), -(215, 'Sneasel', 'Female-Hisuian', false, 'Hisui', ARRAY['PLA'], NULL, 'Coronet Highlands: near Celestica Trail, near Primeval Grotto, massive mass outbreaks (Hisuian Form) - Alabaster Icelands: near Avalugg''s Legacy (additional Alpha icon.png), Glacier Terrace, near Pearl Settlement (Hisuian Form)', 12, 4, 6, null, null, null), -(216, 'Teddiursa', NULL, false, 'Johto', ARRAY['Gold', 'Crystal', 'SS'], NULL, 'Dark Cave, Blackthorn City Entrance, 4am-10am', 12, 5, 1, 8, 1, 6), -(217, 'Ursaring', NULL, false, 'Johto', ARRAY['Gold', 'Crystal', 'SS'], NULL, NULL, 12, 5, 2, 8, 2, 1), -(217, 'Ursaring', 'Female', false, 'Johto', ARRAY['Gold', 'Crystal', 'SS'], NULL, NULL, 12, 5, 3, null, null, null), -(218, 'Slugma', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, 'Route 17, 10am-6pm', 12, 5, 4, 8, 2, 2), -(219, 'Magcargo', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 12, 5, 5, 8, 2, 3), -(220, 'Swinub', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 12, 5, 6, 8, 2, 4), -(221, 'Piloswine', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 13, 1, 1, 8, 2, 5), -(221, 'Piloswine', 'Female', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 13, 1, 2, null, null, null), -(222, 'Corsola', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, 'Route 34, Super Rod, 4am-6pm', 13, 1, 3, 8, 2, 6), -(222, 'Corsola', 'Galarian', false, 'Galar', ARRAY['Shield'], NULL, NULL, 13, 1, 4, null, null, null), -(223, 'Remoraid', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'HG', 'SS'], NULL, 'Route 44', 13, 1, 5, 8, 3, 1), -(224, 'Octillery', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'HG', 'SS'], NULL, 'Evolves from remoraid', 13, 1, 6, 8, 3, 2), -(224, 'Octillery', 'Female', false, 'Johto', ARRAY['Gold', 'Silver', 'HG', 'SS'], NULL, 'Evolves from remoraid', 13, 2, 1, null, null, null), -(225, 'Delibird', NULL, false, 'Johto', ARRAY['Silver', 'Crystal', 'SS'], NULL, 'Ice Path, 6pm-4am', 13, 2, 2, 8, 3, 3), -(226, 'Mantine', NULL, false, 'Johto', ARRAY['Gold', 'Crystal', 'HG'], NULL, NULL, 13, 2, 3, 8, 3, 4), -(227, 'Skarmory', NULL, false, 'Johto', ARRAY['Silver', 'Crystal', 'SS'], NULL, 'Route 45, 4am-6pm', 13, 2, 4, 8, 3, 5), -(228, 'Houndour', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, 'Route 7, 6pm-4am', 13, 2, 5, 8, 3, 6), -(229, 'Houndoom', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 13, 2, 6, 8, 4, 1), -(229, 'Houndoom', 'Female', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 13, 3, 1, null, null, null), -(230, 'Kingdra', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], 'Johto', 'It evolves from Seadra when traded while holding a Dragon Scale. ', 13, 3, 2, 8, 4, 2), -(231, 'Phanpy', NULL, false, 'Johto', ARRAY['Silver', 'Crystal', 'HG'], NULL, 'Route 45, 4am-10am', 13, 3, 3, 8, 4, 3), -(232, 'Donphan', NULL, false, 'Johto', ARRAY['Silver', 'Crystal', 'HG'], NULL, NULL, 13, 3, 4, 8, 4, 4), -(232, 'Donphan', 'Female', false, 'Johto', ARRAY['Silver', 'Crystal', 'HG'], NULL, NULL, 13, 3, 5, null, null, null), -(233, 'Porygon2', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 13, 3, 6, 8, 4, 5), -(234, 'Stantler', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, 'Route 37, 6pm-4am', 13, 4, 1, 8, 4, 6), -(235, 'Smeargle', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, 'Ruins Of Alph, Outside, 10am-6pm', 13, 4, 2, 8, 5, 1), -(236, 'Tyrogue', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, 'Breed with Ditto', 13, 4, 3, 8, 5, 2), -(237, 'Hitmontop', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, 'Evolve tyrogue at level 20 with equal attack and defence (box 2)', 13, 4, 4, 8, 5, 3), -(238, 'Smoochum', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, 'Have to remove ''dizzy punch'' move as transfer wrongly thinks it''s an illegal move', 13, 4, 5, 8, 5, 4), -(239, 'Elekid', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, 'Gift egg', 13, 4, 6, 8, 5, 5), -(240, 'Magby', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, 'Gift egg', 13, 5, 1, 8, 5, 6), -(241, 'Miltank', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, 'Route 38, 4am-6pm', 13, 5, 2, 9, 1, 1), -(242, 'Blissey', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], 'Johto', 'It evolves from Chansey when leveled up with high friendship.', 13, 5, 3, 9, 1, 2), -(243, 'Raikou', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 13, 5, 4, 9, 1, 3), -(244, 'Entei', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 13, 5, 5, 9, 1, 4), -(245, 'Suicune', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, NULL, 13, 5, 6, 9, 1, 5), -(246, 'Larvitar', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, 'Mt Silver, Top, 4am-6pm', 14, 1, 1, 9, 1, 6), -(247, 'Pupitar', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, 'Evolves from larvitar', 14, 1, 2, 9, 2, 1), -(248, 'Tyranitar', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, 'Evolves from pupitar', 14, 1, 3, 9, 2, 2), -(249, 'Lugia', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, 'https://strategywiki.org/wiki/Pok%C3%A9mon_Gold_and_Silver/Whirl_Islands', 14, 1, 4, 9, 2, 3), -(250, 'Ho-Oh', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], NULL, 'https://strategywiki.org/wiki/Pok%C3%A9mon_Gold_and_Silver/Tin_Tower', 14, 1, 5, 9, 2, 4), -(251, 'Celebi', NULL, false, 'Johto', ARRAY['Crystal'], NULL, NULL, 14, 1, 6, 9, 2, 5), -(252, 'Treecko', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 15, 1, 1, 9, 2, 6), -(253, 'Grovyle', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 15, 1, 2, 9, 3, 1), -(254, 'Sceptile', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 15, 1, 3, 9, 3, 2), -(255, 'Torchic', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 15, 1, 4, 9, 3, 3), -(255, 'Torchic', 'Female', false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 15, 1, 5, null, null, null), -(256, 'Combusken', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 15, 1, 6, 9, 3, 4), -(256, 'Combusken', 'Female', false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 15, 2, 1, null, null, null), -(257, 'Blaziken', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 15, 2, 2, 9, 3, 5), -(257, 'Blaziken', 'Female', false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 15, 2, 3, null, null, null), -(258, 'Mudkip', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 15, 2, 4, 9, 3, 6), -(259, 'Marshtomp', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 15, 2, 5, 9, 4, 1), -(260, 'Swampert', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 15, 2, 6, 9, 4, 2), -(261, 'Poochyena', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 15, 3, 1, 9, 4, 3), -(262, 'Mightyena', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 15, 3, 2, 9, 4, 4), -(263, 'Zigzagoon', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, 'X/ R2', 15, 3, 3, 9, 4, 5), -(263, 'Zigzagoon', 'Galarian', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 15, 3, 4, null, null, null), -(264, 'Linoone', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 15, 3, 5, 9, 4, 6), -(264, 'Linoone', 'Galarian', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, 'Evolves at level 20', 15, 3, 6, null, null, null), -(265, 'Wurmple', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 15, 4, 1, 9, 5, 1), -(266, 'Silcoon', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 15, 4, 2, 9, 5, 2), -(267, 'Beautifly', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 15, 4, 3, 9, 5, 3), -(267, 'Beautifly', 'Female', false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 15, 4, 4, null, null, null), -(268, 'Cascoon', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 15, 4, 5, 9, 5, 4), -(269, 'Dustox', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 15, 4, 6, 9, 5, 5), -(269, 'Dustox', 'Female', false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 15, 5, 1, null, null, null), -(270, 'Lotad', NULL, false, 'Hoenn', ARRAY['Sapphire', 'Emerald', 'AS'], NULL, NULL, 15, 5, 2, 9, 5, 6), -(271, 'Lombre', NULL, false, 'Hoenn', ARRAY['Sapphire', 'Emerald', 'AS'], NULL, NULL, 15, 5, 3, 10, 1, 1), -(272, 'Ludicolo', NULL, false, 'Hoenn', ARRAY['Sapphire', 'Emerald', 'AS'], NULL, NULL, 15, 5, 4, 10, 1, 2), -(272, 'Ludicolo', 'Female', false, 'Hoenn', ARRAY['Sapphire', 'Emerald', 'AS'], NULL, NULL, 15, 5, 5, null, null, null), -(273, 'Seedot', NULL, false, 'Hoenn', ARRAY['Ruby', 'Emerald', 'OR'], NULL, NULL, 15, 5, 6, 10, 1, 3), -(274, 'Nuzleaf', NULL, false, 'Hoenn', ARRAY['Ruby', 'Emerald', 'OR'], NULL, NULL, 16, 1, 1, 10, 1, 4), -(274, 'Nuzleaf', 'Female', false, 'Hoenn', ARRAY['Ruby', 'Emerald', 'OR'], NULL, NULL, 16, 1, 2, null, null, null), -(275, 'Shiftry', NULL, false, 'Hoenn', ARRAY['Ruby', 'Emerald', 'OR'], NULL, NULL, 16, 1, 3, 10, 1, 5), -(275, 'Shiftry', 'Female', false, 'Hoenn', ARRAY['Ruby', 'Emerald', 'OR'], NULL, NULL, 16, 1, 4, null, null, null), -(276, 'Taillow', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 16, 1, 5, 10, 1, 6), -(277, 'Swellow', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 16, 1, 6, 10, 2, 1), -(278, 'Wingull', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 16, 2, 1, 10, 2, 2), -(279, 'Pelipper', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 16, 2, 2, 10, 2, 3), -(280, 'Ralts', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 16, 2, 3, 10, 2, 4), -(281, 'Kirlia', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 16, 2, 4, 10, 2, 5), -(282, 'Gardevoir', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 16, 2, 5, 10, 2, 6), -(283, 'Surskit', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'OR', 'AS'], NULL, NULL, 16, 2, 6, 10, 3, 1), -(284, 'Masquerain', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'OR', 'AS'], NULL, NULL, 16, 3, 1, 10, 3, 2), -(285, 'Shroomish', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 16, 3, 2, 10, 3, 3), -(286, 'Breloom', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 16, 3, 3, 10, 3, 4), -(287, 'Slakoth', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 16, 3, 4, 10, 3, 5), -(288, 'Vigoroth', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 16, 3, 5, 10, 3, 6), -(289, 'Slaking', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 16, 3, 6, 10, 4, 1), -(290, 'Nincada', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 16, 4, 1, 10, 4, 2), -(291, 'Ninjask', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 16, 4, 2, 10, 4, 3), -(292, 'Shedinja', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 16, 4, 3, 10, 4, 4), -(293, 'Whismur', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 16, 4, 4, 10, 4, 5), -(294, 'Loudred', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 16, 4, 5, 10, 4, 6), -(295, 'Exploud', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 16, 4, 6, 10, 5, 1), -(296, 'Makuhita', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 16, 5, 1, 10, 5, 2), -(297, 'Hariyama', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 16, 5, 2, 10, 5, 3), -(298, 'Azurill', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 16, 5, 3, 10, 5, 4), -(299, 'Nosepass', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, 'Granite cave, rocks, rock smash (mach bike)', 16, 5, 4, 10, 5, 5), -(300, 'Skitty', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 16, 5, 5, 10, 5, 6), -(301, 'Delcatty', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 16, 5, 6, 11, 1, 1), -(302, 'Sableye', NULL, false, 'Hoenn', ARRAY['Sapphire', 'Emerald', 'AS'], NULL, NULL, 17, 1, 1, 11, 1, 2), -(303, 'Mawile', NULL, false, 'Hoenn', ARRAY['Ruby', 'Emerald', 'OR'], NULL, NULL, 17, 1, 2, 11, 1, 3), -(304, 'Aron', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, 'Granite cave or victory road', 17, 1, 3, 11, 1, 4), -(305, 'Lairon', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 17, 1, 4, 11, 1, 5), -(306, 'Aggron', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 17, 1, 5, 11, 1, 6), -(307, 'Meditite', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'OR', 'AS'], NULL, NULL, 17, 1, 6, 11, 2, 1), -(307, 'Meditite', 'Female', false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'OR', 'AS'], NULL, NULL, 17, 2, 1, null, null, null), -(308, 'Medicham', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'OR', 'AS'], NULL, NULL, 17, 2, 2, 11, 2, 2), -(308, 'Medicham', 'Female', false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'OR', 'AS'], NULL, NULL, 17, 2, 3, null, null, null), -(309, 'Electrike', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 17, 2, 4, 11, 2, 3), -(310, 'Manectric', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 17, 2, 5, 11, 2, 4), -(311, 'Plusle', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 17, 2, 6, 11, 2, 5), -(312, 'Minun', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 17, 3, 1, 11, 2, 6), -(313, 'Volbeat', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 17, 3, 2, 11, 3, 1), -(314, 'Illumise', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 17, 3, 3, 11, 3, 2), -(315, 'Roselia', ' ', false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'OR', 'AS'], NULL, NULL, 17, 3, 4, 11, 3, 3), -(315, 'Roselia', 'Female', false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'OR', 'AS'], NULL, NULL, 17, 3, 5, null, null, null), -(316, 'Gulpin', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 17, 3, 6, 11, 3, 4), -(316, 'Gulpin', 'Female', false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 17, 4, 1, null, null, null), -(317, 'Swalot', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 17, 4, 2, 11, 3, 5), -(317, 'Swalot', 'Female', false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 17, 4, 3, null, null, null), -(318, 'Carvanha', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 17, 4, 4, 11, 3, 6), -(319, 'Sharpedo', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 17, 4, 5, 11, 4, 1), -(320, 'Wailmer', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, 'Good rod or super rod in most water', 17, 4, 6, 11, 4, 2), -(321, 'Wailord', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, 'level 40', 17, 5, 1, 11, 4, 3), -(322, 'Numel', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 17, 5, 2, 11, 4, 4), -(322, 'Numel', 'Female', false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 17, 5, 3, null, null, null), -(323, 'Camerupt', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 17, 5, 4, 11, 4, 5), -(323, 'Camerupt', 'Female', false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 17, 5, 5, null, null, null), -(324, 'Torkoal', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 17, 5, 6, 11, 4, 6), -(325, 'Spoink', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 18, 1, 1, 11, 5, 1), -(326, 'Grumpig', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 18, 1, 2, 11, 5, 2), -(327, 'Spinda', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 18, 1, 3, 11, 5, 3), -(328, 'Trapinch', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 18, 1, 4, 11, 5, 4), -(329, 'Vibrava', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, 'evolves from trapinch', 18, 1, 5, 11, 5, 5), -(330, 'Flygon', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, 'evolves from vibrava', 18, 1, 6, 11, 5, 6), -(331, 'Cacnea', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 18, 2, 1, 12, 1, 1), -(332, 'Cacturne', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 18, 2, 2, 12, 1, 2), -(332, 'Cacturne', 'Female', false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 18, 2, 3, null, null, null), -(333, 'Swablu', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 18, 2, 4, 12, 1, 3), -(334, 'Altaria', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 18, 2, 5, 12, 1, 4), -(335, 'Zangoose', NULL, false, 'Hoenn', ARRAY['Ruby', 'OR'], NULL, NULL, 18, 2, 6, 12, 1, 5), -(336, 'Seviper', NULL, false, 'Hoenn', ARRAY['Sapphire', 'Emerald', 'AS'], NULL, NULL, 18, 3, 1, 12, 1, 6), -(337, 'Lunatone', NULL, false, 'Hoenn', ARRAY['Sapphire', 'AS'], NULL, NULL, 18, 3, 2, 12, 2, 1), -(338, 'Solrock', NULL, false, 'Hoenn', ARRAY['Ruby', 'Emerald', 'OR'], NULL, NULL, 18, 3, 3, 12, 2, 2), -(339, 'Barboach', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, 'Route 111, Route 114, Route 120, Meteor Falls, Scorched Slab and Victory Road by either fishing with the Good Rod or Super Rod.', 18, 3, 4, 12, 2, 3), -(340, 'Whiscash', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 18, 3, 5, 12, 2, 4), -(341, 'Corphish', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, 'Route 102, Route 117, Route 123, and Petalburg City with good rod', 18, 3, 6, 12, 2, 5), -(342, 'Crawdaunt', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 18, 4, 1, 12, 2, 6), -(343, 'Baltoy', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 18, 4, 2, 12, 3, 1), -(344, 'Claydol', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 18, 4, 3, 12, 3, 2), -(345, 'Lileep', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 18, 4, 4, 12, 3, 3), -(346, 'Cradily', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 18, 4, 5, 12, 3, 4), -(347, 'Anorith', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 18, 4, 6, 12, 3, 5), -(348, 'Armaldo', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 18, 5, 1, 12, 3, 6), -(349, 'Feebas', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 18, 5, 2, 12, 4, 1), -(350, 'Milotic', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 18, 5, 3, 12, 4, 2), -(350, 'Milotic', 'Female', false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, 'Need to catch a female Feebas for this one attach a Prism Scale, which in Generation VI is only available in X & Y, to Feebas and trade it, it will evolve into Milotic.', 18, 5, 4, null, null, null), -(351, 'Castform', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 18, 5, 5, 12, 4, 3), -(352, 'Kecleon', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 18, 5, 6, 12, 4, 4), -(353, 'Shuppet', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 19, 1, 1, 12, 4, 5), -(354, 'Banette', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 19, 1, 2, 12, 4, 6), -(355, 'Duskull', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 19, 1, 3, 12, 5, 1), -(356, 'Dusclops', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, 'Evolves from duskull', 19, 1, 4, 12, 5, 2), -(357, 'Tropius', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 19, 1, 5, 12, 5, 3), -(358, 'Chimecho', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 19, 1, 6, 12, 5, 4), -(359, 'Absol', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, 'Route 120, Tall Grass', 19, 2, 1, 12, 5, 5), -(360, 'Wynaut', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 19, 2, 2, 12, 5, 6), -(361, 'Snorunt', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, 'Shoal Cave, Cave - Low Tide (3am-9am, 3pm-9pm)', 19, 2, 3, 13, 1, 1), -(362, 'Glalie', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, 'evolves from snorunt', 19, 2, 4, 13, 1, 2), -(363, 'Spheal', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, 'Shoal Cave Cave', 19, 2, 5, 13, 1, 3), -(364, 'Sealeo', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, 'evolves from spheal', 19, 2, 6, 13, 1, 4), -(365, 'Walrein', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, 'evolves from sealeo', 19, 3, 1, 13, 1, 5), -(366, 'Clamperl', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, 'Route 107 Seaweed Diving Route 124 Seaweed Diving Route 126 Seaweed Diving Route 128 Seaweed Diving Route 129 Seaweed Diving Route 130 Seaweed Diving ', 19, 3, 2, 13, 1, 6), -(367, 'Huntail', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, 'Trade clamperl w/ Deep Sea Tooth', 19, 3, 3, 13, 2, 1), -(368, 'Gorebyss', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, 'Trade clamperl w/ Deep Sea Scale', 19, 3, 4, 13, 2, 2), -(369, 'Relicanth', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, 'Route 107 Seaweed Diving Route 124 Seaweed Diving Route 126 Seaweed Diving Route 128 Seaweed Diving Route 129 Seaweed Diving Route 130 Seaweed Diving', 19, 3, 5, 13, 2, 3), -(369, 'Relicanth', 'Female', false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, 'Route 107 Seaweed Diving Route 124 Seaweed Diving Route 126 Seaweed Diving Route 128 Seaweed Diving Route 129 Seaweed Diving Route 130 Seaweed Diving', 19, 3, 6, null, null, null), -(370, 'Luvdisc', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, 'Route 128, Ever Grande City, Victory Road (Good Rod or Super Rod)', 19, 4, 1, 13, 2, 4), -(371, 'Bagon', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, 'Meteor Falls, Basement - Small Room', 19, 4, 2, 13, 2, 5), -(372, 'Shelgon', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, 'evolves from bagon', 19, 4, 3, 13, 2, 6), -(373, 'Salamence', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, 'evolves from shelgon', 19, 4, 4, 13, 3, 1), -(374, 'Beldum', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, 'Receive as a gift from Steven''s house in Mossdeep City after becoming the Pokemon League Champion.', 19, 4, 5, 13, 3, 2), -(375, 'Metang', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, 'evolves from beldum', 19, 4, 6, 13, 3, 3), -(376, 'Metagross', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, 'evolves from metang', 19, 5, 1, 13, 3, 4), -(377, 'Regirock', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 19, 5, 2, 13, 3, 5), -(378, 'Regice', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 19, 5, 3, 13, 3, 6), -(379, 'Registeel', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 19, 5, 4, 13, 4, 1), -(380, 'Latias', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 19, 5, 5, 13, 4, 2), -(381, 'Latios', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 19, 5, 6, 13, 4, 3), -(382, 'Kyogre', NULL, false, 'Hoenn', ARRAY['Sapphire', 'Emerald', 'AS'], NULL, NULL, 20, 1, 1, 13, 4, 4), -(383, 'Groudon', NULL, false, 'Hoenn', ARRAY['Ruby', 'Emerald', 'OR'], NULL, NULL, 20, 1, 2, 13, 4, 5), -(384, 'Rayquaza', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 20, 1, 3, 13, 4, 6), -(385, 'Jirachi', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, 'Gen the event via Powersaves, alt BDSP w/ SwSh Save Data', 20, 1, 4, 13, 5, 1), -(386, 'Deoxys', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 20, 1, 5, 13, 5, 2), -(386, 'Deoxys', 'Attack Form', false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 20, 1, 6, null, null, null), -(386, 'Deoxys', 'Defense Form', false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 20, 2, 1, null, null, null), -(386, 'Deoxys', 'Speed Form', false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], NULL, NULL, 20, 2, 2, null, null, null), -(387, 'Turtwig', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 21, 1, 1, 13, 5, 3), -(388, 'Grotle', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 21, 1, 2, 13, 5, 4), -(389, 'Torterra', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 21, 1, 3, 13, 5, 5), -(390, 'Chimchar', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 21, 1, 4, 13, 5, 6), -(391, 'Monferno', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 21, 1, 5, 14, 1, 1), -(392, 'Infernape', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 21, 1, 6, 14, 1, 2), -(393, 'Piplup', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 21, 2, 1, 14, 1, 3), -(394, 'Prinplup', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 21, 2, 2, 14, 1, 4), -(395, 'Empoleon', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 21, 2, 3, 14, 1, 5), -(396, 'Starly', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 21, 2, 4, 14, 1, 6), -(396, 'Starly', 'Female', false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 21, 2, 5, null, null, null), -(397, 'Staravia', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 21, 2, 6, 14, 2, 1), -(397, 'Staravia', 'Female', false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 21, 3, 1, null, null, null), -(398, 'Staraptor', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 21, 3, 2, 14, 2, 2), -(398, 'Staraptor', 'Female', false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 21, 3, 3, null, null, null), -(399, 'Bidoof', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 21, 3, 4, 14, 2, 3), -(399, 'Bidoof', 'Female', false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 21, 3, 5, null, null, null), -(400, 'Bibarel', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 21, 3, 6, 14, 2, 4), -(400, 'Bibarel', 'Female', false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 21, 4, 1, null, null, null), -(401, 'Kricketot', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 21, 4, 2, 14, 2, 5), -(401, 'Kricketot', 'Female', false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 21, 4, 3, null, null, null), -(402, 'Kricketune', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 21, 4, 4, 14, 2, 6), -(402, 'Kricketune', 'Female', false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 21, 4, 5, null, null, null), -(403, 'Shinx', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 21, 4, 6, 14, 3, 1), -(403, 'Shinx', 'Female', false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 21, 5, 1, null, null, null), -(404, 'Luxio', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 21, 5, 2, 14, 3, 2), -(404, 'Luxio', 'Female', false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 21, 5, 3, null, null, null), -(405, 'Luxray', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 21, 5, 4, 14, 3, 3), -(405, 'Luxray', 'Female', false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 21, 5, 5, null, null, null), -(406, 'Budew', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 21, 5, 6, 14, 3, 4), -(407, 'Roserade', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'OR', 'AS'], 'Sinnoh', 'It evolves from Roselia when exposed to a Shiny Stone.', 22, 1, 1, 14, 3, 5), -(407, 'Roserade', 'Female', false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'OR', 'AS'], 'Sinnoh', 'It evolves from Roselia when exposed to a Shiny Stone.', 22, 1, 2, null, null, null), -(408, 'Cranidos', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Platinum', 'BD'], NULL, 'It is resurrected from a Skull Fossil ', 22, 1, 3, 14, 3, 6), -(409, 'Rampardos', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Platinum', 'BD'], NULL, 'Evolves from Cranidos starting at level 30.', 22, 1, 4, 14, 4, 1), -(410, 'Shieldon', NULL, false, 'Sinnoh', ARRAY['Pearl', 'Platinum', 'SP'], NULL, NULL, 22, 1, 5, 14, 4, 2), -(411, 'Bastiodon', NULL, false, 'Sinnoh', ARRAY['Pearl', 'Platinum', 'SP'], NULL, NULL, 22, 1, 6, 14, 4, 3), -(412, 'Burmy', 'Leaf Cloak', false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 22, 2, 1, 14, 4, 4), -(412, 'Burmy', 'Sand Cloak', false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 22, 2, 2, null, null, null), -(412, 'Burmy', 'Trash Cloak', false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 22, 2, 3, null, null, null), -(413, 'Wormadam', 'Leaf Cloak', false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 22, 2, 4, 14, 4, 5), -(413, 'Wormadam', 'Sand Cloak', false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 22, 2, 5, null, null, null), -(413, 'Wormadam', 'Trash Cloak', false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 22, 2, 6, null, null, null), -(414, 'Mothim', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 22, 3, 1, 14, 4, 6), -(415, 'Combee', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 22, 3, 2, 14, 5, 1), -(415, 'Combee', 'Female', false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 22, 3, 3, null, null, null), -(416, 'Vespiquen', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 22, 3, 4, 14, 5, 2), -(417, 'Pachirisu', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 22, 3, 5, 14, 5, 3), -(417, 'Pachirisu', 'Female', false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 22, 3, 6, null, null, null), -(418, 'Buizel', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 22, 4, 1, 14, 5, 4), -(418, 'Buizel', 'Female', false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 22, 4, 2, null, null, null), -(419, 'Floatzel', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 22, 4, 3, 14, 5, 5), -(419, 'Floatzel', 'Female', false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 22, 4, 4, null, null, null), -(420, 'Cherubi', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 22, 4, 5, 14, 5, 6), -(421, 'Cherrim', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 22, 4, 6, 15, 1, 1), -(422, 'Shellos', 'East Sea', false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 22, 5, 1, 15, 1, 2), -(422, 'Shellos', 'West Sea', false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 22, 5, 2, null, null, null), -(423, 'Gastrodon', 'East Sea', false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 22, 5, 3, 15, 1, 3), -(423, 'Gastrodon', 'West Sea', false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 22, 5, 4, null, null, null), -(424, 'Ambipom', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], 'Sinnoh', 'It evolves from Aipom when leveled up while knowing Double Hit.', 22, 5, 5, 15, 1, 4), -(424, 'Ambipom', 'Female', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], 'Sinnoh', 'It evolves from Aipom when leveled up while knowing Double Hit.', 22, 5, 6, null, null, null), -(425, 'Drifloon', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 23, 1, 1, 15, 1, 5), -(426, 'Drifblim', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 23, 1, 2, 15, 1, 6), -(427, 'Buneary', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 23, 1, 3, 15, 2, 1), -(428, 'Lopunny', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 23, 1, 4, 15, 2, 2), -(429, 'Mismagius', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], 'Sinnoh', 'It evolves from Misdreavus when exposed to a Dusk Stone.', 23, 1, 5, 15, 2, 3), -(430, 'Honchkrow', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], 'Sinnoh', 'It evolves from Murkrow when exposed to a Dusk Stone.', 23, 1, 6, 15, 2, 4), -(431, 'Glameow', NULL, false, 'Sinnoh', ARRAY['Pearl', 'SP'], NULL, NULL, 23, 2, 1, 15, 2, 5), -(432, 'Purugly', NULL, false, 'Sinnoh', ARRAY['Pearl', 'SP'], NULL, NULL, 23, 2, 2, 15, 2, 6), -(433, 'Chingling', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 23, 2, 3, 15, 3, 1), -(434, 'Stunky', NULL, false, 'Sinnoh', ARRAY['Diamond', 'BD'], NULL, 'Routes 206, 214, and 221 Grand Underground - Grassland Cave, Spacious Cave, Riverbank Cave, Sunlit Cavern, Still-Water Cavern (After obtaining TM96 (Strength))', 23, 2, 4, 15, 3, 2), -(435, 'Skuntank', NULL, false, 'Sinnoh', ARRAY['Diamond', 'BD'], NULL, 'Evolves from Stunky starting at level 34.', 23, 2, 5, 15, 3, 3), -(436, 'Bronzor', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 23, 2, 6, 15, 3, 4), -(437, 'Bronzong', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 23, 3, 1, 15, 3, 5), -(438, 'Bonsly', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 23, 3, 2, 15, 3, 6), -(439, 'Mime Jr.', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 23, 3, 3, 15, 4, 1), -(440, 'Happiny', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 23, 3, 4, 15, 4, 2), -(441, 'Chatot', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 23, 3, 5, 15, 4, 3), -(442, 'Spiritomb', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 23, 3, 6, 15, 4, 4), -(443, 'Gible', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 23, 4, 1, 15, 4, 5), -(443, 'Gible', 'Female', false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 23, 4, 2, null, null, null), -(444, 'Gabite', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 23, 4, 3, 15, 4, 6), -(444, 'Gabite', 'Female', false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 23, 4, 4, null, null, null), -(445, 'Garchomp', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 23, 4, 5, 15, 5, 1), -(445, 'Garchomp', 'Female', false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 23, 4, 6, null, null, null), -(446, 'Munchlax', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 23, 5, 1, 15, 5, 2), -(447, 'Riolu', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 23, 5, 2, 15, 5, 3), -(448, 'Lucario', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 23, 5, 3, 15, 5, 4), -(449, 'Hippopotas', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 23, 5, 4, 15, 5, 5), -(449, 'Hippopotas', 'Female', false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 23, 5, 5, null, null, null), -(450, 'Hippowdon', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 23, 5, 6, 15, 5, 6), -(450, 'Hippowdon', 'Female', false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 24, 1, 1, null, null, null), -(451, 'Skorupi', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 24, 1, 2, 16, 1, 1), -(452, 'Drapion', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 24, 1, 3, 16, 1, 2), -(453, 'Croagunk', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 24, 1, 4, 16, 1, 3), -(453, 'Croagunk', 'Female', false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 24, 1, 5, null, null, null), -(454, 'Toxicroak', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 24, 1, 6, 16, 1, 4), -(454, 'Toxicroak', 'Female', false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 24, 2, 1, null, null, null), -(455, 'Carnivine', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 24, 2, 2, 16, 1, 5), -(456, 'Finneon', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 24, 2, 3, 16, 1, 6), -(456, 'Finneon', 'Female', false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 24, 2, 4, null, null, null), -(457, 'Lumineon', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 24, 2, 5, 16, 2, 1), -(457, 'Lumineon', 'Female', false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 24, 2, 6, null, null, null), -(458, 'Mantyke', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 24, 3, 1, 16, 2, 2), -(459, 'Snover', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 24, 3, 2, 16, 2, 3), -(459, 'Snover', 'Female', false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 24, 3, 3, null, null, null), -(460, 'Abomasnow', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 24, 3, 4, 16, 2, 4), -(460, 'Abomasnow', 'Female', false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 24, 3, 5, null, null, null), -(461, 'Weavile', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], 'Sinnoh', 'It evolves from Sneasel when leveled up while holding a Razor Claw during the night.', 24, 3, 6, 16, 2, 5), -(461, 'Weavile', 'Female', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], 'Sinnoh', 'It evolves from Sneasel when leveled up while holding a Razor Claw during the night.', 24, 4, 1, null, null, null), -(462, 'Magnezone', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], 'Sinnoh', 'It evolves from Magneton when leveled up in a special magnetic field or when exposed to a Thunder Stone.', 24, 4, 2, 16, 2, 6), -(463, 'Lickilicky', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], 'Sinnoh', 'It evolves from Lickitung when leveled up while knowing Rollout.', 24, 4, 3, 16, 3, 1), -(464, 'Rhyperior', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], 'Sinnoh', 'It evolves from Rhydon when traded while holding a Protector.', 24, 4, 4, 16, 3, 2), -(464, 'Rhyperior', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], 'Sinnoh', 'It evolves from Rhydon when traded while holding a Protector.', 24, 4, 5, null, null, null), -(465, 'Tangrowth', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], 'Sinnoh', 'It evolves from Tangela when leveled up while knowing Ancient Power.', 24, 4, 6, 16, 3, 3), -(465, 'Tangrowth', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], 'Sinnoh', 'It evolves from Tangela when leveled up while knowing Ancient Power.', 24, 5, 1, null, null, null), -(466, 'Electivire', NULL, false, 'Kanto', ARRAY['Red', 'LG: Pikachu', 'LG: Eevee'], 'Sinnoh', 'It evolves from Electabuzz when traded while holding an Electirizer.', 24, 5, 2, 16, 3, 4), -(467, 'Magmortar', NULL, false, 'Kanto', ARRAY['Blue', 'LG: Pikachu', 'LG: Eevee'], 'Sinnoh', 'It evolves from Magmar when traded while holding a Magmarizer. ', 24, 5, 3, 16, 3, 5), -(468, 'Togekiss', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], 'Sinnoh', 'It evolves from Togetic when exposed to a Shiny Stone.', 24, 5, 4, 16, 3, 6), -(469, 'Yanmega', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], 'Sinnoh', 'It evolves from Yanma when leveled up while knowing Ancient Power.', 24, 5, 5, 16, 4, 1), -(470, 'Leafeon', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], 'Sinnoh', 'evolves from Eevee when exposed to a Moss Rock or, from Generation VIII onwards, when exposed to a Leaf Stone. Eevee will always evolve into Leafeon when leveled up near a Moss Rock, even if the evolutionary conditions for it to evolve into Espeon, Umbreon, or Sylveon have also been met. The Moss Rock is not present in Pokémon HeartGold and SoulSilver, Pokémon Sword and Shield, or Pokémon Scarlet and Violet.', 24, 5, 6, 16, 4, 2), -(471, 'Glaceon', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], 'Sinnoh', 'evolves from Eevee when exposed to an Ice Rock or, from Generation VIII onwards, when exposed to an Ice Stone. Eevee will always evolve into Glaceon when leveled up near an Ice Rock, even if the evolutionary conditions for it to evolve into Espeon, Umbreon, or Sylveon have also been met. The Ice Rock is not present in Pokémon HeartGold and SoulSilver, Pokémon Sword and Shield, or Pokémon Scarlet and Violet, and the Ice Stone is not obtainable in Pokémon Brilliant Diamond and Shining Pearl.', 25, 1, 1, 16, 4, 3), -(472, 'Gliscor', NULL, false, 'Johto', ARRAY['Gold', 'Crystal', 'HG'], 'Sinnoh', 'It evolves from Gligar when leveled up while holding a Razor Fang during the night.', 25, 1, 2, 16, 4, 4), -(473, 'Mamoswine', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], 'Sinnoh', 'It evolves from Piloswine when leveled up while knowing Ancient Power.', 25, 1, 3, 16, 4, 5), -(473, 'Mamoswine', 'Female', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], 'Sinnoh', 'It evolves from Piloswine when leveled up while knowing Ancient Power.', 25, 1, 4, null, null, null), -(474, 'Porygon-Z', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], NULL, NULL, 25, 1, 5, 16, 4, 6), -(475, 'Gallade', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], 'Sinnoh', 'It evolves from a male Kirlia when exposed to a Dawn Stone.', 25, 1, 6, 16, 5, 1), -(476, 'Probopass', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], 'Sinnoh', 'It evolves from Nosepass when leveled up in a special magnetic field or when exposed to a Thunder Stone.', 25, 2, 1, 16, 5, 2), -(477, 'Dusknoir', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], 'Sinnoh', 'It evolves from Dusclops when traded while holding a Reaper Cloth.', 25, 2, 2, 16, 5, 3), -(478, 'Froslass', NULL, false, 'Hoenn', ARRAY['Ruby', 'Sapphire', 'Emerald', 'OR', 'AS'], 'Sinnoh', 'It evolves from a female Snorunt when exposed to a Dawn Stone.', 25, 2, 3, 16, 5, 4), -(479, 'Rotom', 'Lightbulb', false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 25, 2, 4, 16, 5, 5), -(479, 'Rotom', 'Oven', false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 25, 2, 5, null, null, null), -(479, 'Rotom', 'Washer', false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 25, 2, 6, null, null, null), -(479, 'Rotom', 'Fridge', false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 25, 3, 1, null, null, null), -(479, 'Rotom', 'Fan', false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 25, 3, 2, null, null, null), -(479, 'Rotom', 'Mower', false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 25, 3, 3, null, null, null), -(480, 'Uxie', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 25, 3, 4, 16, 5, 6), -(481, 'Mesprit', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 25, 3, 5, 17, 1, 1), -(482, 'Azelf', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 25, 3, 6, 17, 1, 2), -(483, 'Dialga', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Platinum', 'BD'], NULL, 'Spear Pillar (Only one)', 25, 4, 1, 17, 1, 3), -(484, 'Palkia', NULL, false, 'Sinnoh', ARRAY['Pearl', 'Platinum', 'SP'], NULL, NULL, 25, 4, 2, 17, 1, 4), -(485, 'Heatran', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, NULL, 25, 4, 3, 17, 1, 5), -(486, 'Regigigas', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, 'Snowpoint Temple (requires Regirock, Regice, and Registeel in the player''s party) (Only one)', 25, 4, 4, 17, 1, 6), -(487, 'Giratina', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, 'Turnback Cave (Only one) (Altered Forme)', 25, 4, 5, 17, 2, 1), -(488, 'Cresselia', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, 'Roaming Sinnoh (Only one)', 25, 4, 6, 17, 2, 2), -(489, 'Phione', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'PLA'], NULL, NULL, 25, 5, 1, 17, 2, 3), -(490, 'Manaphy', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'PLA'], NULL, NULL, 25, 5, 2, 17, 2, 4), -(491, 'Darkrai', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'PLA'], NULL, NULL, 25, 5, 3, 17, 2, 5), -(492, 'Shaymin', 'Normal Form', false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'PLA'], NULL, NULL, 25, 5, 4, 17, 2, 6), -(492, 'Shaymin', 'Sky Form', false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'PLA'], NULL, 'Needs to have its form changed in PLA to be able to keep it in Home, which requires having a completed Sword or Shield save file', 25, 5, 5, null, null, null), -(493, 'Arceus', NULL, false, 'Sinnoh', ARRAY['Diamond', 'Pearl', 'Platinum', 'BD', 'SP'], NULL, 'Hall of Origin (Only one*)Version 1.3.0+', 25, 5, 6, 17, 3, 1), -(494, 'Victini', NULL, false, 'Unova', ARRAY['Black', 'White'], NULL, 'DNS Exploit', 26, 1, 1, 17, 3, 2), -(495, 'Snivy', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, NULL, 26, 1, 2, 17, 3, 3), -(496, 'Servine', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, NULL, 26, 1, 3, 17, 3, 4), -(497, 'Serperior', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, NULL, 26, 1, 4, 17, 3, 5), -(498, 'Tepig', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, NULL, 26, 1, 5, 17, 3, 6), -(499, 'Pignite', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Tepig at level 17', 26, 1, 6, 17, 4, 1), -(500, 'Emboar', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Pignite at level 36', 26, 2, 1, 17, 4, 2), -(501, 'Oshawott', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, NULL, 26, 2, 2, 17, 4, 3), -(502, 'Dewott', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, NULL, 26, 2, 3, 17, 4, 4), -(503, 'Samurott', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, '36', 26, 2, 4, 17, 4, 5), -(503, 'Samurott', 'Hisuian', false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], 'Hisui', '36', 26, 2, 5, null, null, null), -(504, 'Patrat', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, NULL, 26, 2, 6, 17, 4, 6), -(505, 'Watchog', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Patrat at level 20', 26, 3, 1, 17, 5, 1), -(506, 'Lillipup', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, NULL, 26, 3, 2, 17, 5, 2), -(507, 'Herdier', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Herdier at level 16', 26, 3, 3, 17, 5, 3), -(508, 'Stoutland', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Stoutland at level 32', 26, 3, 4, 17, 5, 4), -(509, 'Purrloin', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, ' Routes 2 and 3, Dreamyard', 26, 3, 5, 17, 5, 5), -(510, 'Liepard', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Purrloin at level 20', 26, 3, 6, 17, 5, 6), -(511, 'Pansage', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, NULL, 26, 4, 1, 18, 1, 1), -(512, 'Simisage', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Pansage with a leaf stone', 26, 4, 2, 18, 1, 2), -(513, 'Pansear', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Pinwheel Forest (inner) and Lostlorn Forest (rustling grass)', 26, 4, 3, 18, 1, 3), -(514, 'Simisear', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Pansear with a fire stone', 26, 4, 4, 18, 1, 4), -(515, 'Panpour', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Pinwheel Forest (inner) and Lostlorn Forest (rustling grass)', 26, 4, 5, 18, 1, 5), -(516, 'Simipour', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Panpour with a water stone', 26, 4, 6, 18, 1, 6), -(517, 'Munna', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Dreamyard', 26, 5, 1, 18, 2, 1), -(518, 'Musharna', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Munna with a moon stone', 26, 5, 2, 18, 2, 2), -(519, 'Pidove', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Route 3, Pinwheel Forest (inner)', 26, 5, 3, 18, 2, 3), -(520, 'Tranquill', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Pidove at level 21', 26, 5, 4, 18, 2, 4), -(521, 'Unfezant', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Tranquill at level 32', 26, 5, 5, 18, 2, 5), -(521, 'Unfezant', 'Female', false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Tranquill at level 32', 26, 5, 6, null, null, null), -(522, 'Blitzle', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Route 3', 27, 1, 1, 18, 2, 6), -(523, 'Zebstrika', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Blitzle at level 27', 27, 1, 2, 18, 3, 1), -(524, 'Roggenrola', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Wellspring Cave', 27, 1, 3, 18, 3, 2), -(525, 'Boldore', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Roggenrola at level 25', 27, 1, 4, 18, 3, 3), -(526, 'Gigalith', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Boldore when traded', 27, 1, 5, 18, 3, 4), -(527, 'Woobat', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Wellspring Cave, Mistralton Cave, Twist Mountain, Challenger''s Cave, Victory Road', 27, 1, 6, 18, 3, 5), -(528, 'Swoobat', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Woobat with high friendship', 27, 2, 1, 18, 3, 6), -(529, 'Drilbur', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Wellspring Cave, Chargestone Cave, Mistralton Cave, Twist Mountain (Dust cloud)', 27, 2, 2, 18, 4, 1), -(530, 'Excadrill', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Drilbur at level 31', 27, 2, 3, 18, 4, 2), -(531, 'Audino', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Routes 1, 2, 3, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 16, and 18, P2 Laboratory, Dreamyard, Pinwheel Forest, Lostlorn Forest, Dragonspiral Tower, Village Bridge, Giant Chasm, Abundant Shrine, Cold Storage (rustling grass)', 27, 2, 4, 18, 4, 3), -(532, 'Timburr', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Pinwheel Forest (outside), Cold Storage', 27, 2, 5, 18, 4, 4), -(533, 'Gurdurr', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Timburr at level 25', 27, 2, 6, 18, 4, 5), -(534, 'Conkeldurr', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Gurdurr when traded', 27, 3, 1, 18, 4, 6), -(535, 'Tympole', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Pinwheel Forest (outside)', 27, 3, 2, 18, 5, 1), -(536, 'Palpitoad', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Tympole at level 25', 27, 3, 3, 18, 5, 2), -(537, 'Seismitoad', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Papitoad at level 36', 27, 3, 4, 18, 5, 3), -(538, 'Throh', NULL, false, 'Unova', ARRAY['White', 'Black2', 'White2'], NULL, 'Routes 10, 15, and 18, Pinwheel Forest (outside) (rustling grass)', 27, 3, 5, 18, 5, 4), -(539, 'Sawk', NULL, false, 'Unova', ARRAY['Black', 'Black2', 'White2'], NULL, 'Routes 10, 15, and 18, Pinwheel Forest (outside) (tall grass)', 27, 3, 6, 18, 5, 5), -(540, 'Sewaddle', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Pinwheel Forest (inner)', 27, 4, 1, 18, 5, 6), -(541, 'Swadloon', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Sewaddle at level 20', 27, 4, 2, 19, 1, 1), -(542, 'Leavanny', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Swadloon with high friendship', 27, 4, 3, 19, 1, 2), -(543, 'Venipede', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Pinwheel Forest (inner), Lostlorn Forest', 27, 4, 4, 19, 1, 3), -(544, 'Whirlipede', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Venipede at level 22', 27, 4, 5, 19, 1, 4), -(545, 'Scolipede', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Whirlipede at level 30', 27, 4, 6, 19, 1, 5), -(546, 'Cottonee', NULL, false, 'Unova', ARRAY['Black', 'Black2'], NULL, 'Pinwheel Forest (inner), Lostlorn Forest, Abundant Shrine', 27, 5, 1, 19, 1, 6), -(547, 'Whimsicott', NULL, false, 'Unova', ARRAY['Black', 'Black2'], NULL, 'Evolves from cottonee with a sun stone', 27, 5, 2, 19, 2, 1), -(548, 'Petilil', NULL, false, 'Unova', ARRAY['White', 'White2'], NULL, 'Pinwheel Forest (inner), Lostlorn Forest, Abundant Shrine', 27, 5, 3, 19, 2, 2), -(549, 'Lilligant', NULL, false, 'Unova', ARRAY['White', 'White2'], NULL, 'Evolves from Petilil with a sun stone', 27, 5, 4, 19, 2, 3), -(549, 'Lilligant', 'Hisuian', false, 'Unova', ARRAY['White', 'White2'], 'Hisui', 'In Hisui, Petilil evolves into Hisuian Lilligant when exposed to a Sun Stone.', 27, 5, 5, null, null, null), -(550, 'Basculin', 'Red-striped', false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Routes 1, 3, 6, 11, 14, Striaton City, Wellspring Cave, Pinwheel Forest, Dragonspiral Tower, Challenger''s Cave, Victory Road, Village Bridge, Giant Chasm, Abundant Shrine, Lostlorn Forest (Surfing or fishing) (Red-Striped Form) (Rippling water) (Blue-Striped Form)', 27, 5, 6, 19, 2, 4), -(550, 'Basculin', 'Blue-striped', false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Routes 1, 3, 6, 11, 14, Striaton City, Wellspring Cave, Pinwheel Forest, Dragonspiral Tower, Challenger''s Cave, Victory Road, Village Bridge, Giant Chasm, Abundant Shrine, Lostlorn Forest (Surfing or fishing) (Red-Striped Form) (Rippling water) (Blue-Striped Form)', 28, 1, 1, null, null, null), -(550, 'Basculin', 'White-striped', false, 'Hisui', ARRAY['PLA'], NULL, 'Cobalt Coastlands: Tranquility Cove, near Islespy Shore, near Firespit Island, massive mass outbreaks (White-Striped Form) - Coronet Highlands: Fabled Spring (White-Striped Form) - Alabaster Icelands: near Avalugg''s Legacy, Heart''s Crag, Lake Acuity, near Pearl Settlement (White-Striped Form)', 28, 1, 2, null, null, null), -(551, 'Sandile', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Route 4, Desert Resort, Relic Castle', 28, 1, 3, 19, 2, 5), -(552, 'Krokorok', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Sandile at level 29', 28, 1, 4, 19, 2, 6), -(553, 'Krookodile', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Krokorok at level 40', 28, 1, 5, 19, 3, 1), -(554, 'Darumaka', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Route 4, Desert Resort', 28, 1, 6, 19, 3, 2), -(554, 'Darumaka', 'Galarian', false, 'Galar', ARRAY['Sword'], NULL, 'Routes 8 and 10 (Galarian Form) Dusty Bowl, Giant''s Cap, Hammerlocke Hills, Lake of Outrage, Stony Wilderness (Max Raid Battle) (Galarian Form)', 28, 2, 1, null, null, null), -(555, 'Darmanitan', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Darumaka at level 35', 28, 2, 2, 19, 3, 3), -(555, 'Darmanitan', 'Galarian', false, 'Galar', ARRAY['Sword'], NULL, 'Evolves from Darumake when exposed to an Ice Stone.', 28, 2, 3, null, null, null), -(556, 'Maractus', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Desert Resort', 28, 2, 4, 19, 3, 4), -(557, 'Dwebble', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Route 18 and Desert Resort', 28, 2, 5, 19, 3, 5), -(558, 'Crustle', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Dwebble at level 34', 28, 2, 6, 19, 3, 6), -(559, 'Scraggy', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Routes 4 and 18, Desert Resort, P2 Laboratory Route 1 (dark grass)', 28, 3, 1, 19, 4, 1), -(560, 'Scrafty', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Scraggy at level 39', 28, 3, 2, 19, 4, 2), -(561, 'Sigilyph', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Desert Resort', 28, 3, 3, 19, 4, 3), -(562, 'Yamask', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Relic Castle', 28, 3, 4, 19, 4, 4), -(562, 'Yamask', 'Galarian', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 28, 3, 5, null, null, null), -(563, 'Cofagrigus', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Yamask at level 34', 28, 3, 6, 19, 4, 5), -(564, 'Tirtouga', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Resurrected from a Cover Fossil', 28, 4, 1, 19, 4, 6), -(565, 'Carracosta', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Tirtouga at level 37', 28, 4, 2, 19, 5, 1), -(566, 'Archen', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Resurrected from a Plume Fossil', 28, 4, 3, 19, 5, 2), -(567, 'Archeops', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Archen at level 37', 28, 4, 4, 19, 5, 3), -(568, 'Trubbish', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, ' Routes 5 and 16', 28, 4, 5, 19, 5, 4), -(569, 'Garbodor', NULL, true, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Trubbish at level 36', 28, 4, 6, 19, 5, 5), -(570, 'Zorua', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Castelia City (requires fateful encounter Celebi) Breed Zoroark (requires Shiny fateful encounter Entei, Raikou, or Suicune)', 28, 5, 1, 19, 5, 6), -(570, 'Zorua', 'Hisuian', false, 'Hisui', ARRAY['PLA'], NULL, 'Alabaster Icelands: near Avalugg''s Legacy (mass outbreaks), near Glacier Terrace, Icepeak Cavern, massive mass outbreaks (Hisuian Form)', 28, 5, 2, null, null, null), -(571, 'Zoroark', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Zorua at level 30', 28, 5, 3, 20, 1, 1), -(571, 'Zoroark', 'Hisuian', false, 'Hisui', ARRAY['PLA'], NULL, 'Evolves from Zorua at level 30', 28, 5, 4, null, null, null), -(572, 'Minccino', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, NULL, 28, 5, 5, 20, 1, 2), -(573, 'Cinccino', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Minccino with a shiny stone', 28, 5, 6, 20, 1, 3), -(574, 'Gothita', NULL, false, 'Unova', ARRAY['Black', 'Black2'], NULL, 'Routes 5 and 16', 29, 1, 1, 20, 1, 4), -(575, 'Gothorita', NULL, false, 'Unova', ARRAY['Black', 'Black2'], NULL, 'Evolves from Gothita at level 32', 29, 1, 2, 20, 1, 5), -(576, 'Gothitelle', NULL, false, 'Unova', ARRAY['Black', 'Black2'], NULL, 'Evolves from Gothorita at level 41', 29, 1, 3, 20, 1, 6), -(577, 'Solosis', NULL, false, 'Unova', ARRAY['White', 'White2'], NULL, 'Route 5 and Route 16', 29, 1, 4, 20, 2, 1), -(578, 'Duosion', NULL, false, 'Unova', ARRAY['White', 'White2'], NULL, 'Evolves from Solosis at level 32', 29, 1, 5, 20, 2, 2), -(579, 'Reuniclus', NULL, false, 'Unova', ARRAY['White', 'White2'], NULL, 'Evolves from Reuniclus at level 41', 29, 1, 6, 20, 2, 3), -(580, 'Ducklett', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Driftveil Drawbridge (Shadow)', 29, 2, 1, 20, 2, 4), -(581, 'Swanna', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Ducklett at level 35', 29, 2, 2, 20, 2, 5), -(582, 'Vanillite', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Cold Storage Route 6, Dragonspiral Tower (Winter)', 29, 2, 3, 20, 2, 6), -(583, 'Vanillish', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Vanillite at level 35', 29, 2, 4, 20, 3, 1), -(584, 'Vanilluxe', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Vanillish at level 47', 29, 2, 5, 20, 3, 2), -(585, 'Deerling', 'Spring', false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, NULL, 29, 2, 6, 20, 3, 3), -(585, 'Deerling', 'Summer', false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, NULL, 29, 3, 1, null, null, null), -(585, 'Deerling', 'Autumn', false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, NULL, 29, 3, 2, null, null, null), -(585, 'Deerling', 'Winter', false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, NULL, 29, 3, 3, null, null, null), -(586, 'Sawsbuck', 'Spring', false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Deerling at level 34', 29, 3, 4, 20, 3, 4), -(586, 'Sawsbuck', 'Summer', false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, NULL, 29, 3, 5, null, null, null), -(586, 'Sawsbuck', 'Autumn', false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, NULL, 29, 3, 6, null, null, null), -(586, 'Sawsbuck', 'Winter', false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, NULL, 29, 4, 1, null, null, null), -(587, 'Emolga', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Routes 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, and 16, Dragonspiral Tower, Village Bridge, Giant Chasm, Abundant Shrine, Lostlorn Forest (rustling grass)', 29, 4, 2, 20, 3, 5), -(588, 'Karrablast', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Routes 6 and 11', 29, 4, 3, 20, 3, 6), -(589, 'Escavalier', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Karrablast when traded for a Shelmet, a Pokémon that evolves into Accelgor simultaneously. Neither evolves if at least one holds an Everstone during the trade.', 29, 4, 4, 20, 4, 1), -(590, 'Foongus', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Routes 6, 7, and 10 (both in tall grass and as fake items)', 29, 4, 5, 20, 4, 2), -(591, 'Amoonguss', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Foongus at level 39', 29, 4, 6, 20, 4, 3), -(592, 'Frillish', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Routes 4, 17, and 18, Driftveil City, P2 Laboratory (Surfing)', 29, 5, 1, 20, 4, 4), -(592, 'Frillish', 'Female', false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Routes 4, 17, and 18, Driftveil City, P2 Laboratory (Surfing)', 29, 5, 2, null, null, null), -(593, 'Jellicent', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Frillish at level 40', 29, 5, 3, 20, 4, 5), -(593, 'Jellicent', 'Female', false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Frillish at level 40', 29, 5, 4, null, null, null), -(594, 'Alomomola', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Routes 4, 17, 18, Driftveil City, P2 Laboratory (Surfing in rippling water)', 29, 5, 5, 20, 4, 6), -(595, 'Joltik', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Chargestone Cave', 29, 5, 6, 20, 5, 1), -(596, 'Galvantula', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Joltik at level 36', 30, 1, 1, 20, 5, 2), -(597, 'Ferroseed', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Chargestone Cave', 30, 1, 2, 20, 5, 3), -(598, 'Ferrothorn', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Ferroseed at level 40', 30, 1, 3, 20, 5, 4), -(599, 'Klink', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Chargestone Cave, P2 Laboratory', 30, 1, 4, 20, 5, 5), -(600, 'Klang', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Klink at level 38', 30, 1, 5, 20, 5, 6), -(601, 'Klinklang', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Klang at level 49', 30, 1, 6, 21, 1, 1), -(602, 'Tynamo', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Chargestone Cave', 30, 2, 1, 21, 1, 2), -(603, 'Eelektrik', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Tynamo at level 39', 30, 2, 2, 21, 1, 3), -(604, 'Eelektross', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Eelektrik with a thunder stone', 30, 2, 3, 21, 1, 4), -(605, 'Elgyem', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Celestial Tower', 30, 2, 4, 21, 1, 5), -(606, 'Beheeyem', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Elgyem at level 42', 30, 2, 5, 21, 1, 6), -(607, 'Litwick', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Celestial Tower', 30, 2, 6, 21, 2, 1), -(608, 'Lampent', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Litwick at level 41', 30, 3, 1, 21, 2, 2), -(609, 'Chandelure', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Lampent with a dusk stone', 30, 3, 2, 21, 2, 3), -(610, 'Axew', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Mistralton Cave', 30, 3, 3, 21, 2, 4), -(611, 'Fraxure', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Axew at level 38', 30, 3, 4, 21, 2, 5), -(612, 'Haxorus', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Fraxure at level 48', 30, 3, 5, 21, 2, 6), -(613, 'Cubchoo', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Twist Mountain Route 7, Dragonspiral Tower (Winter)', 30, 3, 6, 21, 3, 1), -(614, 'Beartic', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Cubchoo at level 37', 30, 4, 1, 21, 3, 2), -(615, 'Cryogonal', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Twist Mountain', 30, 4, 2, 21, 3, 3), -(616, 'Shelmet', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Route 8, Icirrus City, Moor of Icirrus (Spring/Summer/Autumn)', 30, 4, 3, 21, 3, 4), -(617, 'Accelgor', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Shelmet when traded for a Karrablast, a Pokémon that evolves into Escavalier simultaneously. Neither evolves if at least one holds an Everstone during the trade.', 30, 4, 4, 21, 3, 5), -(618, 'Stunfisk', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Route 8, Icirrus City, Moor of Icirrus (puddles Spring/Summer/Autumn; fishing and surfing)', 30, 4, 5, 21, 3, 6), -(618, 'Stunfisk', 'Galarian', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 30, 4, 6, null, null, null), -(619, 'Mienfoo', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Dragonspiral Tower, Victory Road, Route 14 (regular grass only)', 30, 5, 1, 21, 4, 1), -(620, 'Mienshao', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Mienfoo at level 50', 30, 5, 2, 21, 4, 2), -(621, 'Druddigon', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Dragonspiral Tower', 30, 5, 3, 21, 4, 3), -(622, 'Golett', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Dragonspiral Tower', 30, 5, 4, 21, 4, 4), -(623, 'Golurk', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Golett at level 43', 30, 5, 5, 21, 4, 5), -(624, 'Pawniard', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Routes 9 and 11', 30, 5, 6, 21, 4, 6), -(625, 'Bisharp', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Pawniard at level 52', 31, 1, 1, 21, 5, 1), -(626, 'Bouffalant', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Route 10', 31, 1, 2, 21, 5, 2), -(627, 'Rufflet', NULL, false, 'Unova', ARRAY['White', 'White2'], NULL, 'Routes 10 and 11, Victory Road, Village Bridge', 31, 1, 3, 21, 5, 3), -(628, 'Braviary', NULL, false, 'Unova', ARRAY['White', 'White2'], NULL, 'Evolves from Rufflet at level 54', 31, 1, 4, 21, 5, 4), -(628, 'Braviary', 'Hisuian', false, 'Unova', ARRAY['White', 'White2'], 'Hisui', 'Evolves from Rufflet at level 54', 31, 1, 5, null, null, null), -(629, 'Vullaby', NULL, false, 'Unova', ARRAY['Black', 'Black2'], NULL, 'Routes 10 and 11, Victory Road, Village Bridge', 31, 1, 6, 21, 5, 5), -(630, 'Mandibuzz', NULL, false, 'Unova', ARRAY['Black', 'Black2'], NULL, 'Evolves from Vullaby at level 54', 31, 2, 1, 21, 5, 6), -(631, 'Heatmor', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Victory Road', 31, 2, 2, 22, 1, 1), -(632, 'Durant', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Victory Road', 31, 2, 3, 22, 1, 2), -(633, 'Deino', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Victory Road', 31, 2, 4, 22, 1, 3), -(634, 'Zweilous', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Deino at level 50', 31, 2, 5, 22, 1, 4), -(635, 'Hydreigon', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Zweilous at level 64', 31, 2, 6, 22, 1, 5), -(636, 'Larvesta', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Hatch Egg received from a Pokémon Ranger inside a building on Route 18', 31, 3, 1, 22, 1, 6), -(637, 'Volcarona', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Evolves from Larvesta at level 59', 31, 3, 2, 22, 2, 1), -(638, 'Cobalion', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Mistralton Cave (Guidance Chamber) (Only one)', 31, 3, 3, 22, 2, 2), -(639, 'Terrakion', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Victory Road (Trial Chamber) (Only one)', 31, 3, 4, 22, 2, 3), -(640, 'Virizion', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Pinwheel Forest (Rumination Field) (Only one)', 31, 3, 5, 22, 2, 4), -(641, 'Tornadus', 'Incarnate Form', false, 'Unova', ARRAY['Black', 'Dream Radar'], NULL, 'https://bulbapedia.bulbagarden.net/wiki/Roaming_Pok%C3%A9mon#Generation_V_2', 31, 3, 6, 22, 2, 5), -(641, 'Tornadus', 'Therian Form', false, 'Unova', ARRAY['Dream Radar'], NULL, 'Only available via pokemon dream radar', 31, 4, 1, null, null, null), -(642, 'Thundurus', 'Incarnate Form', false, 'Unova', ARRAY['White', 'Dream Radar'], NULL, 'https://bulbapedia.bulbagarden.net/wiki/Roaming_Pok%C3%A9mon#Generation_V_2', 31, 4, 2, 22, 2, 6), -(642, 'Thundurus', 'Therian Form', false, 'Unova', ARRAY['Dream Radar'], NULL, 'Only available via pokemon dream radar', 31, 4, 3, null, null, null), -(643, 'Reshiram', NULL, false, 'Unova', ARRAY['Black', 'White2'], NULL, 'N''s Castle (Only one)', 31, 4, 4, 22, 3, 1), -(644, 'Zekrom', NULL, false, 'Unova', ARRAY['White', 'Black2'], NULL, 'N''s Castle (Only one)', 31, 4, 5, 22, 3, 2), -(645, 'Landorus', 'Incarnate Form', false, 'Unova', ARRAY['Black', 'White', 'Dream Radar'], NULL, 'Abundant Shrine (requires Tornadus and Thundurus in party) (Only one) (Incarnate Forme)', 31, 4, 6, 22, 3, 3), -(645, 'Landorus', 'Therian Form', false, 'Unova', ARRAY['Dream Radar'], NULL, 'Only available via pokemon dream radar', 31, 5, 1, null, null, null), -(646, 'Kyurem', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'Giant Chasm (Only one)', 31, 5, 2, 22, 3, 4), -(647, 'Keldeo', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'DNS Exploit (https://pkmnclassic.net/)', 31, 5, 3, 22, 3, 5), -(647, 'Keldeo', 'Resolute Form', false, 'Unova', ARRAY['Black2', 'White2'], NULL, 'DNS Exploit', 31, 5, 4, null, null, null), -(648, 'Meloetta', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], NULL, 'DNS Exploit', 31, 5, 5, 22, 3, 6), -(649, 'Genesect', NULL, false, 'Unova', ARRAY['Black2', 'White2'], NULL, 'DNS Exploit', 31, 5, 6, 22, 4, 1), -(650, 'Chespin', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 32, 1, 1, 22, 4, 2), -(651, 'Quilladin', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 32, 1, 2, 22, 4, 3), -(652, 'Chesnaught', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 32, 1, 3, 22, 4, 4), -(653, 'Fennekin', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 32, 1, 4, 22, 4, 5), -(654, 'Braixen', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 32, 1, 5, 22, 4, 6), -(655, 'Delphox', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 32, 1, 6, 22, 5, 1), -(656, 'Froakie', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 32, 2, 1, 22, 5, 2), -(657, 'Frogadier', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 32, 2, 2, 22, 5, 3), -(658, 'Greninja', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 32, 2, 3, 22, 5, 4), -(658, 'Greninja', 'Battle Bond Ability', false, 'Alola', ARRAY['Moon Demo'], NULL, NULL, 32, 2, 4, null, null, null), -(659, 'Bunnelby', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, 'Route 2 - Grass Route 3 - Grass Route 5 - Grass Route 5 - Purple Flowers Route 22 - Grass', 32, 2, 5, 22, 5, 5), -(660, 'Diggersby', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, 'Route 22 - Yellow Flowers Friend Safari ', 32, 2, 6, 22, 5, 6), -(661, 'Fletchling', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, 'Route 2 - Grass Route 3 - Grass Santalune Forest - Grass ', 32, 3, 1, 23, 1, 1), -(662, 'Fletchinder', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 32, 3, 2, 23, 1, 2), -(663, 'Talonflame', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 32, 3, 3, 23, 1, 3), -(664, 'Scatterbug', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, 'Route 2 - Grass Santalune Forest - Grass', 32, 3, 4, 23, 1, 4), -(665, 'Spewpa', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 32, 3, 5, 23, 1, 5), -(666, 'Vivillon', 'Icy Snow (Canada-Northwest Territories)', false, 'Kalos', ARRAY['X', 'Y'], NULL, 'Link to full list of Vivillon regions for XY/USUM (Friend Safari)', 32, 3, 6, null, null, null), -(666, 'Vivillon', 'Polar (Canada-Alberta)', false, 'Kalos', ARRAY['X', 'Y'], NULL, 'Note: Listed locations are not exclusive and had preference for locations compatible with US 3Ds systems. Check full list for other world 3DS sytems.', 32, 4, 1, null, null, null), -(666, 'Vivillon', 'Tundra (Japan-Aomori)', false, 'Kalos', ARRAY['X', 'Y'], NULL, 'If priority is having same OT, use GO postcards in S/V to obtain unobtaiable forms', 32, 4, 2, null, null, null), -(666, 'Vivillon', 'Continental (Argentina-Chubut)', false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 32, 4, 3, null, null, null), -(666, 'Vivillon', 'Garden (UK-England) [Not US compatible]', false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 32, 4, 4, null, null, null), -(666, 'Vivillon', 'Elegant (Japan) [Not US compatible]', false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 32, 4, 5, null, null, null), -(666, 'Vivillon', 'Meadow (France-Alsace) [Not US compatible]', false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 32, 4, 6, null, null, null), -(666, 'Vivillon', 'Modern (Canada-Manitoba)', false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 32, 5, 1, null, null, null), -(666, 'Vivillon', 'Marine (Chile-Antofagasta)', false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 32, 5, 2, null, null, null), -(666, 'Vivillon', 'Archipelago (Mexico-Yucatan)', false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 32, 5, 3, null, null, null), -(666, 'Vivillon', 'High Plains (Canada-British Columbia)', false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 32, 5, 4, null, null, null), -(666, 'Vivillon', 'Sandstorm (Saudi Arabia-Al Bahah)', false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 32, 5, 5, null, null, null), -(666, 'Vivillon', 'River (Australia-Capital Territory) [Not US compatible]', false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 32, 5, 6, null, null, null), -(666, 'Vivillon', 'Monsoon (Japan-Okinawa)', false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 33, 1, 1, null, null, null), -(666, 'Vivillon', 'Savanna (Argentina-Buenos Aires)', false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 33, 1, 2, null, null, null), -(666, 'Vivillon', 'Sun (Belize-Belize)', false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 33, 1, 3, null, null, null), -(666, 'Vivillon', 'Ocean (US-Hawai''i)', false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 33, 1, 4, null, null, null), -(666, 'Vivillon', 'Jungle (Brazil-Acre)', false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 33, 1, 5, null, null, null), -(666, 'Vivillon', 'Fancy (Event)', false, 'Kalos', ARRAY['X', 'Y', 'Scarlet', 'Violet'], NULL, 'Event (X/Y)', 33, 1, 6, 23, 1, 6), -(666, 'Vivillon', 'Pokeball (Event)', false, 'Kalos', ARRAY['X', 'Y'], NULL, 'Event', 33, 2, 1, null, null, null), -(667, 'Litleo', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, 'Route 22 - Grass Route 22 - Yellow Flowers', 33, 2, 2, 23, 2, 1), -(668, 'Pyroar', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 33, 2, 3, 23, 2, 2), -(668, 'Pyroar', 'Female', false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 33, 2, 4, null, null, null), -(669, 'Flabébé', 'Red', false, 'Kalos', ARRAY['X', 'Y'], NULL, 'Route 4 - Red Flowers Route 4 - Red Flowers Route 4 - Red Flowers Route 4 - Yellow Flowers Route 4 - Yellow Flowers Route 4 - Yellow Flowers Route 7 - Grass Route 7 - Grass Route 7 - Purple Flowers Route 7 - Purple Flowers Route 7 - Purple Flowers Route 7 - Yellow Flowers Route 7 - Yellow Flowers Route 7 - Yellow Flowers', 33, 2, 5, 23, 2, 3), -(669, 'Flabébé', 'Yellow', false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 33, 2, 6, null, null, null), -(669, 'Flabébé', 'Orange', false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 33, 3, 1, null, null, null), -(669, 'Flabébé', 'Blue', false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 33, 3, 2, null, null, null), -(669, 'Flabébé', 'White', false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 33, 3, 3, null, null, null), -(670, 'Floette', 'Red', false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 33, 3, 4, 23, 2, 4), -(670, 'Floette', 'Yellow', false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 33, 3, 5, null, null, null), -(670, 'Floette', 'Orange', false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 33, 3, 6, null, null, null), -(670, 'Floette', 'Blue', false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 33, 4, 1, null, null, null), -(670, 'Floette', 'White', false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 33, 4, 2, null, null, null), -(671, 'Florges', 'Red', false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 33, 4, 3, 23, 2, 5), -(671, 'Florges', 'Yellow', false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 33, 4, 4, null, null, null), -(671, 'Florges', 'Orange', false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 33, 4, 5, null, null, null), -(671, 'Florges', 'Blue', false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 33, 4, 6, null, null, null), -(671, 'Florges', 'White', false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 33, 5, 1, null, null, null), -(672, 'Skiddo', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, 'Route 5 - Grass Route 5 - Purple Flowers', 33, 5, 2, 23, 2, 6), -(673, 'Gogoat', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 33, 5, 3, 23, 3, 1), -(674, 'Pancham', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, 'Route 5 - Grass Route 5 - Purple Flowers Friend Safari ', 33, 5, 4, 23, 3, 2), -(675, 'Pangoro', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 33, 5, 5, 23, 3, 3), -(676, 'Furfrou', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, 'Route 5 - Grass Route 5 - Purple Flowers ', 33, 5, 6, 23, 3, 4), -(676, 'Furfrou', 'Heart', false, 'Unknown', ARRAY['Go'], NULL, NULL, 34, 1, 1, null, null, null), -(676, 'Furfrou', 'Star', false, 'Unknown', ARRAY['Go'], NULL, NULL, 34, 1, 2, null, null, null), -(676, 'Furfrou', 'Diamond', false, 'Unknown', ARRAY['Go'], NULL, NULL, 34, 1, 3, null, null, null), -(676, 'Furfrou', 'Debutante', false, 'Unknown', ARRAY['Go'], NULL, NULL, 34, 1, 4, null, null, null), -(676, 'Furfrou', 'Matron', false, 'Unknown', ARRAY['Go'], NULL, NULL, 34, 1, 5, null, null, null), -(676, 'Furfrou', 'Dandy', false, 'Unknown', ARRAY['Go'], NULL, NULL, 34, 1, 6, null, null, null), -(676, 'Furfrou', 'La Reine', false, 'Unknown', ARRAY['Go'], NULL, NULL, 34, 2, 1, null, null, null), -(676, 'Furfrou', 'Kabuki', false, 'Unknown', ARRAY['Go'], NULL, NULL, 34, 2, 2, null, null, null), -(676, 'Furfrou', 'Pharaoh', false, 'Unknown', ARRAY['Go'], NULL, NULL, 34, 2, 3, null, null, null), -(677, 'Espurr', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, 'Route 6 - Tall Grass Friend Safari ', 34, 2, 4, 23, 3, 5), -(678, 'Meowstic', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, 'Evolve from male Espurr, Route 6 - Tall Grass', 34, 2, 5, 23, 3, 6), -(678, 'Meowstic', 'Female', false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 34, 2, 6, null, null, null), -(679, 'Honedge', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, 'Route 6 - Tall Grass ', 34, 3, 1, 23, 4, 1), -(680, 'Doublade', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 34, 3, 2, 23, 4, 2), -(681, 'Aegislash', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 34, 3, 3, 23, 4, 3), -(682, 'Spritzee', NULL, false, 'Kalos', ARRAY['Y'], NULL, 'Route 7 - Grass Route 7 - Purple Flowers Route 7 - Yellow Flowers Friend Safari ', 34, 3, 4, 23, 4, 4), -(683, 'Aromatisse', NULL, false, 'Kalos', ARRAY['Y'], NULL, 'Evolves from Spritzee', 34, 3, 5, 23, 4, 5), -(684, 'Swirlix', NULL, false, 'Kalos', ARRAY['X'], NULL, 'Route 7 - Grass Route 7 - Purple Flowers Route 7 - Yellow Flowers Friend Safari ', 34, 3, 6, 23, 4, 6), -(685, 'Slurpuff', NULL, false, 'Kalos', ARRAY['X'], NULL, NULL, 34, 4, 1, 23, 5, 1), -(686, 'Inkay', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, 'Route 8 - Grass Route 8 - Yellow Flowers Azure Bay - Grass Friend Safari ', 34, 4, 2, 23, 5, 2), -(687, 'Malamar', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 34, 4, 3, 23, 5, 3), -(688, 'Binacle', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, 'Route 8 - Rock Smash Route 12 - Rock Smash Ambrette Town - Rock Smash Azure Bay - Rock Smash ', 34, 4, 4, 23, 5, 4), -(689, 'Barbaracle', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 34, 4, 5, 23, 5, 5), -(690, 'Skrelp', NULL, false, 'Kalos', ARRAY['Y'], NULL, 'Route 8 - Good Rod Cyllage City - Good Rod Ambrette Town - Good Rod', 34, 4, 6, 23, 5, 6), -(691, 'Dragalge', NULL, false, 'Kalos', ARRAY['Y'], NULL, 'Evolves from Skrelp', 34, 5, 1, 24, 1, 1), -(692, 'Clauncher', NULL, false, 'Kalos', ARRAY['X'], NULL, 'Route 8 - Good Rod Cyllage City - Good Rod Ambrette Town - Good Rod', 34, 5, 2, 24, 1, 2), -(693, 'Clawitzer', NULL, false, 'Kalos', ARRAY['X'], NULL, NULL, 34, 5, 3, 24, 1, 3), -(694, 'Helioptile', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, 'Route 9 - Grass Friend Safari ', 34, 5, 4, 24, 1, 4), -(695, 'Heliolisk', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 34, 5, 5, 24, 1, 5), -(696, 'Tyrunt', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, 'Glimmering cave right before 2nd gym. Ambrette Town Fossil Lab (Jaw fossil)', 34, 5, 6, 24, 1, 6), -(697, 'Tyrantrum', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 35, 1, 1, 24, 2, 1), -(698, 'Amaura', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, 'Glimmering cave right before 2nd gym. Ambrette Town Fossil Lab (Sail fossil)', 35, 1, 2, 24, 2, 2), -(699, 'Aurorus', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 35, 1, 3, 24, 2, 3), -(700, 'Sylveon', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee'], 'Kalos', 'evolves from Eevee when leveled up while knowing a Fairy-type move and having high friendship. Prior to Generation VIII, it evolves from Eevee when leveled up while knowing a Fairy-type move and having at least two levels of affection. Eevee will evolve into Sylveon even if the evolutionary conditions for it to evolve into Espeon or Umbreon have also been met. Eevee will never evolve into Sylveon while near a Moss Rock or Ice Rock.', 35, 1, 4, 24, 2, 4), -(701, 'Hawlucha', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, 'Route 10 - Grass Route 10 - Yellow Flowers Friend Safari ', 35, 1, 5, 24, 2, 5), -(702, 'Dedenne', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, 'Route 11 - Grass Friend Safari ', 35, 1, 6, 24, 2, 6), -(703, 'Carbink', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, 'Reflection Cave - 1F - Grass Reflection Cave - 1F - Horde Reflection Cave - B1F - Grass Reflection Cave - B1F - Horde Reflection Cave - B2F - Grass Reflection Cave - B2F - Horde Reflection Cave - B3F - Grass Reflection Cave - B3F - Horde', 35, 2, 1, 24, 3, 1), -(704, 'Goomy', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, 'Route 14 - Grass Route 14 - Water Route 14 - Surf', 35, 2, 2, 24, 3, 2), -(705, 'Sliggoo', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, 'Route 19 - Purple Flowers Route 19 - Water Route 19 - Surf Route 19 - Yellow Flowers Friend Safari ', 35, 2, 3, 24, 3, 3), -(705, 'Sliggoo', 'Hisuian', false, 'Kalos', ARRAY['X', 'Y'], 'Hisui', 'Evolves from Goomy at level 40', 35, 2, 4, null, null, null), -(706, 'Goodra', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 35, 2, 5, 24, 3, 4), -(706, 'Goodra', 'Hisuian', false, 'Kalos', ARRAY['X', 'Y'], 'Hisui', 'Evolves from Sliggoo at level 50 during rain or fog in the overworld', 35, 2, 6, null, null, null), -(707, 'Klefki', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, 'Route 15 - Grass Route 15 - Horde Route 15 - Red Flowers Route 16 - Horde Route 16 - Tall Grass Route 16 - Yellow Flowers Lost Hotel - Grass Friend Safari ', 35, 3, 1, 24, 3, 5), -(708, 'Phantump', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, 'Route 16 - Tall Grass Route 16 - Yellow Flowers Friend Safari ', 35, 3, 2, 24, 3, 6), -(709, 'Trevenant', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, 'Route 20 - Grass Route 20 - Horde Route 20 - Red Flowers', 35, 3, 3, 24, 4, 1), -(710, 'Pumpkaboo', 'Small', false, 'Kalos', ARRAY['X', 'Y'], NULL, 'Route 16 - Tall Grass Route 16 - Tall Grass Route 16 - Tall Grass Route 16 - Tall Grass Friend Safari ', 35, 3, 4, 24, 4, 2), -(710, 'Pumpkaboo', 'Medium', false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 35, 3, 5, null, null, null), -(710, 'Pumpkaboo', 'Large', false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 35, 3, 6, null, null, null), -(710, 'Pumpkaboo', 'Super', false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 35, 4, 1, null, null, null), -(711, 'Gourgeist', 'Small', false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 35, 4, 2, 24, 4, 3), -(711, 'Gourgeist', 'Medium', false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 35, 4, 3, null, null, null), -(711, 'Gourgeist', 'Large', false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 35, 4, 4, null, null, null), -(711, 'Gourgeist', 'Super', false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 35, 4, 5, null, null, null), -(712, 'Bergmite', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, 'Frost Cavern - 1F - Grass Frost Cavern - 2F - Grass Frost Cavern - 3F - Grass Friend Safari ', 35, 4, 6, 24, 4, 4), -(713, 'Avalugg', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 35, 5, 1, 24, 4, 5), -(713, 'Avalugg', 'Hisuian', false, 'Kalos', ARRAY['X', 'Y'], 'Hisui', NULL, 35, 5, 2, null, null, null), -(714, 'Noibat', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, 'Terminus Cave - 1F - Special Terminus Cave - B1F - Special Terminus Cave - B2F - Special Terminus Cave - B3F - Special Terminus Cave - 2F Left - Special Terminus Cave - 2F Right - Special Friend Safari ', 35, 5, 3, 24, 4, 6), -(715, 'Noivern', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, NULL, 35, 5, 4, 24, 5, 1), -(716, 'Xerneas', NULL, false, 'Kalos', ARRAY['X'], NULL, 'Team Flare Secret HQ - Basement - Interact', 35, 5, 5, 24, 5, 2), -(717, 'Yveltal', NULL, false, 'Kalos', ARRAY['Y'], NULL, 'Team Flare Secret HQ - Basement - Interact ', 35, 5, 6, 24, 5, 3), -(718, 'Zygarde', '10%', false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, NULL, 36, 1, 1, 24, 5, 4), -(718, 'Zygarde', '10% Power Construct', false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, NULL, 36, 1, 2, null, null, null), -(718, 'Zygarde', '50%', false, 'Kalos', ARRAY['X', 'Y'], NULL, 'Terminus Cave - B3F - Interact ', 36, 1, 3, 24, 5, 5), -(718, 'Zygarde', '50% Power Construct', false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, NULL, 36, 1, 4, null, null, null), -(719, 'Diancie', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, 'Event (powersaves)', 36, 1, 5, 24, 5, 5), -(720, 'Hoopa', 'Confined', false, 'Kalos', ARRAY['X', 'Y'], NULL, 'Event (powersaves)', 36, 1, 6, 24, 5, 6), -(720, 'Hoopa', 'Unbound', false, 'Kalos', ARRAY['X', 'Y'], NULL, 'Event (powersaves), convert form in USUM, then transfer to bank', 37, 1, 1, null, null, null), -(721, 'Volcanion', NULL, false, 'Kalos', ARRAY['X', 'Y'], NULL, 'Event (powersaves)', 37, 1, 2, 25, 1, 1), -(722, 'Rowlet', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, NULL, 37, 1, 3, 25, 1, 2), -(723, 'Dartrix', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, NULL, 37, 1, 4, 25, 1, 3), -(724, 'Decidueye', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, NULL, 37, 1, 5, 25, 1, 4), -(724, 'Decidueye', 'Hisuian', false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], 'Hisui', 'Evolves from Dartrix at level 36', 37, 1, 6, null, null, null), -(725, 'Litten', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, NULL, 37, 2, 1, 25, 1, 5), -(726, 'Torracat', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, NULL, 37, 2, 2, 25, 1, 6), -(727, 'Incineroar', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, NULL, 37, 2, 3, 25, 2, 1), -(728, 'Popplio', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, NULL, 37, 2, 4, 25, 2, 2), -(729, 'Brionne', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, NULL, 37, 2, 5, 25, 2, 3), -(730, 'Primarina', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, NULL, 37, 2, 6, 25, 2, 4), -(731, 'Pikipek', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, NULL, 37, 3, 1, 25, 2, 5), -(732, 'Trumbeak', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Route 5, Route 8, Lush Jungle, Route 11, Poni Grove, Poni Plains Evolves at level 28.', 37, 3, 2, 25, 2, 6), -(733, 'Toucannon', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Route 11, Poni Grove, Poni Plains SOS only. Has the unique move Beak Blast.', 37, 3, 3, 25, 3, 1), -(734, 'Yungoos', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, NULL, 37, 3, 4, 25, 3, 2), -(735, 'Gumshoos', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Route 8, Memorial Hill, Akala Outskirts, Route 10, Tapu Village, Route 14, Route 15, Route 16, Route 17, Mount Lanakila, Poni Plains', 37, 3, 5, 25, 3, 3), -(736, 'Grubbin', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, NULL, 37, 3, 6, 25, 3, 4), -(737, 'Charjabug', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, NULL, 37, 4, 1, 25, 3, 5), -(738, 'Vikavolt', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Level up charjabug at electric rock', 37, 4, 2, 25, 3, 6), -(739, 'Crabrawler', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, NULL, 37, 4, 3, 25, 4, 1), -(740, 'Crabominable', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Evolves from Crabrawler: Route 3, Kala’e Bay, Route 2, Berry Fields, Route 4, Route 5, Route 8, Route 10, Ula’ula Beach, Route 15, Route 16, Route 17, Poni Wilds, Poni Plains Evolves via level-up at the top of Mount Lanakila.', 37, 4, 4, 25, 4, 2), -(741, 'Oricorio', 'Baile (Red)', false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Melemele Meadow, Route 6, Ula’ula Meadow, Poni Meadow', 37, 4, 5, null, null, null), -(741, 'Oricorio', 'Pom-pom (yellow)', false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, NULL, 37, 4, 6, null, null, null), -(741, 'Oricorio', 'Pa''u (pink)', false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Melemele Meadow, Route 6, Ula’ula Meadow, Poni Meadow', 37, 5, 1, null, null, null), -(741, 'Oricorio', 'Sensu (purple)', false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Melemele Meadow, Route 6, Ula’ula Meadow, Poni Meadow', 37, 5, 2, null, null, null), -(742, 'Cutiefly', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, NULL, 37, 5, 3, 25, 4, 3), -(743, 'Ribombee', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Ula’ula Meadow, Poni Meadow or evolves from Cutiefly at level 25', 37, 5, 4, 25, 4, 4), -(744, 'Rockruff', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, NULL, 37, 5, 5, 25, 4, 5), -(744, 'Rockruff', 'Own Tempo', false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Event (powersaves)', 37, 5, 6, 25, 4, 6), -(745, 'Lycanroc', 'Midday', false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Vast Poni Canyon', 38, 1, 1, null, null, null), -(745, 'Lycanroc', 'Midnight', false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, NULL, 38, 1, 2, null, null, null), -(745, 'Lycanroc', 'Dusk', false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Vast Poni Canyon', 38, 1, 3, 25, 5, 1), -(746, 'Wishiwashi', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, NULL, 38, 1, 4, 25, 5, 2), -(747, 'Mareanie', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Route 1 (Hau’oli Outskirts), Route 1, Melemele Sea, Melemele Sea, Hau’oli City (Beachfront), Route 9 SOS only. Evolves at level 38.', 38, 1, 5, 25, 5, 3), -(748, 'Toxapex', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Evolves from Mareanie at level 38', 38, 1, 6, 25, 5, 4), -(749, 'Mudbray', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Route 4, Route 6, Paniola Ranch, Route 12, Blush Mountain Evolves at level 30.', 38, 2, 1, 25, 5, 5), -(750, 'Mudsdale', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Route 12, Blush Mountain, Poni Plains', 38, 2, 2, 25, 5, 6), -(751, 'Dewpider', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Brooklet Hill (day) Evolves at level 22.', 38, 2, 3, 26, 1, 1), -(752, 'Araquanid', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Malie Garden', 38, 2, 4, 26, 1, 2), -(753, 'Fomantis', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, NULL, 38, 2, 5, 26, 1, 3), -(754, 'Lurantis', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Evolves from Fomantis: Route 5, Lush Jungle Evolves at level 34 during the day.', 38, 2, 6, 26, 1, 4), -(757, 'Morelull', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Brooklet Hill (night - Sun 18:00-06:00, Moon 06:00-18:00) Lush Jungle Evolves at level 24.', 38, 3, 1, 26, 1, 5), -(758, 'Shiinotic', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Route 11 (night - Sun 18:00-06:00, Moon 06:00-18:00) ', 38, 3, 2, 26, 1, 6), -(759, 'Salandit', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Route 8, Wela Volcano Park, Lush Jungle Evolves at level 33 only if female. 12.5% of Salandit are female.', 38, 3, 3, 26, 2, 1), -(760, 'Salazzle', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, NULL, 38, 3, 4, 26, 2, 2), -(761, 'Stufful', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Route 8, Memorial Hill, Akala Outskirts Evolves at level 27. ', 38, 3, 5, 26, 2, 3), -(762, 'Bewear', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Poni Gauntlet', 38, 3, 6, 26, 2, 4), -(763, 'Bounsweet', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, NULL, 38, 4, 1, 26, 2, 5), -(764, 'Steenee', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Lush Jungle Evolves via level-up knowing Stomp.', 38, 4, 2, 26, 2, 6), -(765, 'Tsareena', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Evolves from Tsareena', 38, 4, 3, 26, 3, 1), -(766, 'Comfey', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Lush Jungle', 38, 4, 4, 26, 3, 2), -(767, 'Oranguru', NULL, false, 'Alola', ARRAY['Moon', 'UM'], NULL, 'Lush Jungle', 38, 4, 5, 26, 3, 3), -(768, 'Passimian', NULL, false, 'Alola', ARRAY['Sun', 'US'], NULL, 'Lush Jungle', 38, 4, 6, 26, 3, 4), -(769, 'Wimpod', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Route 8, Dividing Peak Tunnel, Ancient Poni Path, Poni Breaker Coast Evolves at level 30. ', 38, 5, 1, 26, 3, 5), -(770, 'Golisopod', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Evolves from Wimpod', 38, 5, 2, 26, 3, 6), -(771, 'Sandygast', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Hano Grand Resort, Hano Beach Evolves at level 42. ', 38, 5, 3, 26, 4, 1), -(772, 'Palossand', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Evolves from Sandygast', 38, 5, 4, 26, 4, 2), -(773, 'Pyukumuku', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, NULL, 38, 5, 5, 26, 4, 3), -(774, 'Type: Null', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Aether House or Ancient Poni Path (Gift; post-game) Evolves by level-up with high happiness.', 38, 5, 6, 26, 4, 4), -(774, 'Silvally', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Evolves from Type: Null', 39, 1, 1, 26, 4, 5), -(774, 'Minior', 'Red', false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Mount Hokulani', 39, 1, 2, 26, 4, 6), -(774, 'Minior', 'Orange', false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Mount Hokulani', 39, 1, 3, null, null, null), -(774, 'Minior', 'Yellow', false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Mount Hokulani', 39, 1, 4, null, null, null), -(774, 'Minior', 'Green', false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Mount Hokulani', 39, 1, 5, null, null, null), -(774, 'Minior', 'Blue', false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Mount Hokulani', 39, 1, 6, null, null, null), -(775, 'Minior', 'Indigo', false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Mount Hokulani', 39, 2, 1, null, null, null), -(776, 'Minior', 'Violet', false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, NULL, 39, 2, 2, null, null, null), -(777, 'Komala', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Route 11', 39, 2, 3, 26, 5, 1), -(778, 'Turtonator', NULL, false, 'Alola', ARRAY['Sun', 'US'], NULL, 'Blush Mountain', 39, 2, 4, 26, 5, 2), -(779, 'Togedemaru', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Blush Mountain', 39, 2, 5, 26, 5, 3), -(780, 'Mimikyu', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Thrifty Megamart (Abandoned Site)', 39, 2, 6, 26, 5, 4), -(781, 'Bruxish', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Route 13, Tapu Village, Route 14, Route 15, Route 16', 39, 3, 1, 26, 5, 5), -(782, 'Drampa', NULL, false, 'Alola', ARRAY['Moon', 'UM'], NULL, 'Mount Lanakila', 39, 3, 2, 26, 5, 6), -(783, 'Dhelmise', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Seafolk Village', 39, 3, 3, 27, 1, 1), -(784, 'Jangmo-o', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Vast Poni Canyon Evolves at level 35.', 39, 3, 4, 27, 1, 2), -(785, 'Hakamo-o', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Evolves from Jangmo-o at level 35', 39, 3, 5, 27, 1, 3), -(786, 'Kommo-o', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Evolves from Hakamo-o at level 45', 39, 3, 6, 27, 1, 4), -(787, 'Tapu Koko', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, NULL, 39, 4, 1, 27, 1, 5), -(788, 'Tapu Lele', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Ruins of Life Post-game.', 39, 4, 2, 27, 1, 6), -(789, 'Tapu Bulu', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Ruins of Abundance Post-game.', 39, 4, 3, 27, 2, 1), -(790, 'Tapu Fini', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Ruins of Hope Post-game.', 39, 4, 4, 27, 2, 2), -(791, 'Cosmog', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Lake of the Sunne/Moone Post-game only. Evolves at level 43.', 39, 4, 5, 27, 2, 3), -(792, 'Cosmoem', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Evolves from Cosmog at level 43', 39, 4, 6, 27, 2, 4), -(793, 'Solgaleo', NULL, false, 'Alola', ARRAY['Sun', 'US'], NULL, 'Mahalo Trail, Evolves from Cosmoem at level 53', 39, 5, 1, 27, 2, 5), -(794, 'Lunala', NULL, false, 'Alola', ARRAY['Moon', 'UM'], NULL, NULL, 39, 5, 2, 27, 2, 6), -(795, 'Nihilego', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, NULL, 39, 5, 3, 27, 3, 1), -(796, 'Buzzwole', NULL, false, 'Alola', ARRAY['Sun', 'US'], NULL, 'Ultra Jungle Multiple. Ultra Sun only. From white Ultra Wormholes.', 39, 5, 4, 27, 3, 2), -(797, 'Pheromosa', NULL, false, 'Alola', ARRAY['Moon', 'UM'], NULL, NULL, 39, 5, 5, 27, 3, 3), -(798, 'Xurkitree', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, NULL, 39, 5, 6, 27, 3, 4), -(799, 'Celesteela', NULL, false, 'Alola', ARRAY['Moon', 'UM'], NULL, NULL, 40, 1, 1, 27, 3, 5), -(800, 'Kartana', NULL, false, 'Alola', ARRAY['Sun', 'US'], NULL, 'Ultra Forest Multiple. Ultra Sun only. From white Ultra Wormholes.', 40, 1, 2, 27, 3, 6), -(801, 'Guzzlord', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, NULL, 40, 1, 3, 27, 4, 1), -(801, 'Necrozma', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, 'Mount Lanakila End of the story. Only can be caught after third battle with it.', 40, 1, 4, 27, 4, 2), -(802, 'Magearna', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, NULL, 40, 1, 5, 27, 4, 3), -(803, 'Magearna', 'Original Color', false, 'Unknown', ARRAY['Home'], NULL, 'Get a complete national dex in Pokemon Home', 40, 1, 6, null, null, null), -(804, 'Marshadow', NULL, false, 'Alola', ARRAY['Sun', 'Moon', 'US', 'UM'], NULL, NULL, 40, 2, 1, 27, 4, 4), -(805, 'Poipole', NULL, false, 'Alola', ARRAY['US', 'UM'], NULL, NULL, 40, 2, 2, 27, 4, 5), -(806, 'Naganadel', NULL, false, 'Alola', ARRAY['US', 'UM'], NULL, NULL, 40, 2, 3, 27, 4, 6), -(807, 'Stakataka', NULL, false, 'Alola', ARRAY['UM'], NULL, 'Poni Grove Ultra Moon only. Two only. Post-game.', 40, 2, 4, 27, 5, 1), -(808, 'Blacephalon', NULL, false, 'Alola', ARRAY['US'], NULL, 'Poni Grove Ultra Sun only. Two only. Post-game.', 40, 2, 5, 27, 5, 2), -(809, 'Zeraora', NULL, false, 'Alola', ARRAY['US'], NULL, 'Event', 40, 2, 6, 27, 5, 3), -(809, 'Meltan', NULL, false, 'Unknown', ARRAY['Go'], NULL, 'Transfer to LG:PE from GO to remove GO mark in HOME', 40, 3, 1, 27, 5, 4), -(810, 'Melmetal', NULL, true, 'Unknown', ARRAY['Home'], NULL, NULL, 41, 1, 1, 27, 5, 5), -(811, 'Grookey', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 41, 1, 2, 27, 5, 6), -(812, 'Thwackey', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 41, 1, 3, 28, 1, 1), -(813, 'Rillaboom', NULL, true, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 41, 1, 4, 28, 1, 2), -(814, 'Scorbunny', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 41, 1, 5, 28, 1, 3), -(815, 'Raboot', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 41, 1, 6, 28, 1, 4), -(816, 'Cinderace', NULL, true, 'Galar', ARRAY['Sword', 'Shield'], NULL, 'Evolves at level 35', 41, 2, 1, 28, 1, 5), -(817, 'Sobble', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 41, 2, 2, 28, 1, 6), -(818, 'Drizzile', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 41, 2, 3, 28, 2, 1), -(819, 'Inteleon', NULL, true, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 41, 2, 4, 28, 2, 2), -(820, 'Skwovet', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 41, 2, 5, 28, 2, 3), -(821, 'Greedent', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, 'Evolves at level 24', 41, 2, 6, 28, 2, 4), -(822, 'Rookidee', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 41, 3, 1, 28, 2, 5), -(823, 'Corvisquire', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 41, 3, 2, 28, 2, 6), -(824, 'Corviknight', NULL, true, 'Galar', ARRAY['Sword', 'Shield'], NULL, 'Evolves at level 38', 41, 3, 3, 28, 3, 1), -(825, 'Blipbug', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 41, 3, 4, 28, 3, 2), -(826, 'Dottler', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 41, 3, 5, 28, 3, 3), -(827, 'Orbeetle', NULL, true, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 41, 3, 6, 28, 3, 4), -(828, 'Nickit', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 41, 4, 1, 28, 3, 5), -(829, 'Thievul', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 41, 4, 2, 28, 3, 6), -(830, 'Gossifleur', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 41, 4, 3, 28, 4, 1), -(831, 'Eldegoss', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 41, 4, 4, 28, 4, 2), -(832, 'Wooloo', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 41, 4, 5, 28, 4, 3), -(833, 'Dubwool', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, 'Evolves at level 24', 41, 4, 6, 28, 4, 4), -(834, 'Chewtle', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 41, 5, 1, 28, 4, 5), -(835, 'Drednaw', NULL, true, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 41, 5, 2, 28, 4, 6), -(836, 'Yamper', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 41, 5, 3, 28, 5, 1), -(837, 'Boltund', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 41, 5, 4, 28, 5, 2), -(838, 'Rolycoly', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 41, 5, 5, 28, 5, 3), -(839, 'Carkol', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 41, 5, 6, 28, 5, 4), -(840, 'Coalossal', NULL, true, 'Galar', ARRAY['Sword', 'Shield'], NULL, 'Evolves at level 34', 42, 1, 1, 28, 5, 5), -(841, 'Applin', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 42, 1, 2, 28, 5, 6), -(842, 'Flapple', NULL, true, 'Galar', ARRAY['Sword'], NULL, 'Evolves from Applin, caught at Route 5, Dusty Bowl, Giant''s Mirror, Stony Wilderness Axew''s Eye, Bridge Field, Dappled Grove, Giant''s Mirror, Rolling Fields, Stony Wilderness (Max Raid Battle) Axew''s Eye, Bridge Field, Dappled Grove, Giant''s Mirror, Stony Wilderness (Max Raid Battle) Dappled Grove (Max Raid Battle) (Gigantamax Factor)', 42, 1, 3, 29, 1, 1), -(843, 'Appletun', NULL, true, 'Galar', ARRAY['Shield'], NULL, NULL, 42, 1, 4, 29, 1, 2), -(844, 'Silicobra', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 42, 1, 5, 29, 1, 3), -(845, 'Sandaconda', NULL, true, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 42, 1, 6, 29, 1, 4), -(846, 'Cramorant', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 42, 2, 1, 29, 1, 5), -(847, 'Arrokuda', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 42, 2, 2, 29, 1, 6), -(848, 'Barraskewda', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 42, 2, 3, 29, 2, 1), -(849, 'Toxel', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 42, 2, 4, 29, 2, 2), -(849, 'Toxtricity', 'Amped', true, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 42, 2, 5, 29, 2, 3), -(850, 'Toxtricity', 'Low-key', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 42, 2, 6, null, null, null), -(851, 'Sizzlipede', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 42, 3, 1, 29, 2, 4), -(852, 'Centiskorch', NULL, true, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 42, 3, 2, 29, 2, 5), -(853, 'Clobbopus', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 42, 3, 3, 29, 2, 6), -(854, 'Grapploct', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 42, 3, 4, 29, 3, 1), -(854, 'Sinistea', 'Phony', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 42, 3, 5, 29, 3, 2), -(855, 'Sinistea', 'Antique', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 42, 3, 6, null, null, null), -(855, 'Polteageist', 'Phony', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 42, 4, 1, 29, 3, 3), -(856, 'Polteageist', 'Antique', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 42, 4, 2, null, null, null), -(857, 'Hatenna', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 42, 4, 3, 29, 3, 4), -(858, 'Hattrem', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 42, 4, 4, 29, 3, 5), -(859, 'Hatterene', NULL, true, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 42, 4, 5, 29, 3, 6), -(860, 'Impidimp', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 42, 4, 6, 29, 4, 1), -(861, 'Morgrem', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, '32', 42, 5, 1, 29, 4, 2), -(862, 'Grimmsnarl', NULL, true, 'Galar', ARRAY['Sword', 'Shield'], NULL, '42', 42, 5, 2, 29, 4, 3), -(863, 'Obstagoon', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, 'Evolves from Galarian Linoone at level 35 at night', 42, 5, 3, 29, 4, 4), -(864, 'Perrserker', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, 'Evolves from Galarian Meowth at level 28', 42, 5, 4, 29, 4, 5), -(865, 'Cursola', NULL, false, 'Galar', ARRAY['Shield'], NULL, NULL, 42, 5, 5, 29, 4, 6), -(866, 'Sirfetch’d', NULL, false, 'Galar', ARRAY['Sword'], NULL, 'Evolves from Galarian Farfetch''d after landing three critical hits in a single battle.', 42, 5, 6, 29, 5, 1), -(867, 'Mr. Rime', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 43, 1, 1, 29, 5, 2), -(868, 'Runerigus', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 43, 1, 2, 29, 5, 3), -(869, 'Milcery', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, 'Route 4, Bridge Field, Giant''s Mirror Bridge Field, Lake of Outrage (Max Raid Battle)', 43, 1, 3, 29, 5, 4), -(869, 'Alcremie', 'Vanilla Strawberry', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, 'One must be Gigantamaxed', 43, 1, 4, 29, 5, 5), -(869, 'Alcremie', 'Vanilla Berry', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, 'Can obtain Star and Ribbon Sweets via Cram-o-matic', 43, 1, 5, null, null, null), -(869, 'Alcremie', 'Vanilla Love', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 43, 1, 6, null, null, null), -(869, 'Alcremie', 'Vanilla Flower', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 43, 2, 1, null, null, null), -(869, 'Alcremie', 'Vanilla Clover', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 43, 2, 2, null, null, null), -(869, 'Alcremie', 'Vanilla Star', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 43, 2, 3, null, null, null), -(869, 'Alcremie', 'Vanilla Ribbon', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 43, 2, 4, null, null, null), -(869, 'Alcremie', 'Ruby Cream Strawberry', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 43, 2, 5, null, null, null), -(869, 'Alcremie', 'Ruby Cream Berry', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 43, 2, 6, null, null, null), -(869, 'Alcremie', 'Ruby Cream Love', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 43, 3, 1, null, null, null), -(869, 'Alcremie', 'Ruby Cream Flower', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 43, 3, 2, null, null, null), -(869, 'Alcremie', 'Ruby Cream Clover', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 43, 3, 3, null, null, null), -(869, 'Alcremie', 'Ruby Cream Star', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 43, 3, 4, null, null, null), -(869, 'Alcremie', 'Ruby Cream Ribbon', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 43, 3, 5, null, null, null), -(869, 'Alcremie', 'Matcha Strawberyy', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 43, 3, 6, null, null, null), -(869, 'Alcremie', 'Mactha Berry', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 43, 4, 1, null, null, null), -(869, 'Alcremie', 'Matcha Love', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 43, 4, 2, null, null, null), -(869, 'Alcremie', 'Matcha Flower', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 43, 4, 3, null, null, null), -(869, 'Alcremie', 'Matcha Clover', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 43, 4, 4, null, null, null), -(869, 'Alcremie', 'Matcha Star', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 43, 4, 5, null, null, null), -(869, 'Alcremie', 'Matcha Ribbon', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 43, 4, 6, null, null, null), -(869, 'Alcremie', 'Mint Strawberry', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 43, 5, 1, null, null, null), -(869, 'Alcremie', 'Mint Berry', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 43, 5, 2, null, null, null), -(869, 'Alcremie', 'Mint Love', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 43, 5, 3, null, null, null), -(869, 'Alcremie', 'Mint Flower', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 43, 5, 4, null, null, null), -(869, 'Alcremie', 'Mint Clover', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 43, 5, 5, null, null, null), -(869, 'Alcremie', 'Mint Star', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 43, 5, 6, null, null, null), -(869, 'Alcremie', 'Mint Ribbon', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 44, 1, 1, null, null, null), -(869, 'Alcremie', 'Lemon Strawberry', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 44, 1, 2, null, null, null), -(869, 'Alcremie', 'Lemon Berry', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 44, 1, 3, null, null, null), -(869, 'Alcremie', 'Lemon Love', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 44, 1, 4, null, null, null), -(869, 'Alcremie', 'Lemon Flower', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 44, 1, 5, null, null, null), -(869, 'Alcremie', 'Lemon Clover', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 44, 1, 6, null, null, null), -(869, 'Alcremie', 'Lemon Star', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 44, 2, 1, null, null, null), -(869, 'Alcremie', 'Lemon Ribbon', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 44, 2, 2, null, null, null), -(869, 'Alcremie', 'Salted Strawberry', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 44, 2, 3, null, null, null), -(869, 'Alcremie', 'Salted Berry', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 44, 2, 4, null, null, null), -(869, 'Alcremie', 'Salted Love', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 44, 2, 5, null, null, null), -(869, 'Alcremie', 'Salted Flower', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 44, 2, 6, null, null, null), -(869, 'Alcremie', 'Salted Clover', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 44, 3, 1, null, null, null), -(869, 'Alcremie', 'Salted Star', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 44, 3, 2, null, null, null), -(869, 'Alcremie', 'Salted Ribbon', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 44, 3, 3, null, null, null), -(869, 'Alcremie', 'Ruby Swirl Strawberry', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 44, 3, 4, null, null, null), -(869, 'Alcremie', 'Ruby Swirl Berry', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 44, 3, 5, null, null, null), -(869, 'Alcremie', 'Ruby Swirl Love', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 44, 3, 6, null, null, null), -(869, 'Alcremie', 'Ruby Swirl Flower', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 44, 4, 1, null, null, null), -(869, 'Alcremie', 'Ruby Swirl Clover', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 44, 4, 2, null, null, null), -(869, 'Alcremie', 'Ruby Swirl Star', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 44, 4, 3, null, null, null), -(869, 'Alcremie', 'Ruby Swirl Ribbon', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 44, 4, 4, null, null, null), -(869, 'Alcremie', 'Caramel Strawberry', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 44, 4, 5, null, null, null), -(869, 'Alcremie', 'Caramel Berry', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 44, 4, 6, null, null, null), -(869, 'Alcremie', 'Caramel Love', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 44, 5, 1, null, null, null), -(869, 'Alcremie', 'Caramel Flower', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 44, 5, 2, null, null, null), -(869, 'Alcremie', 'Caramel Clover', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 44, 5, 3, null, null, null), -(869, 'Alcremie', 'Caramel Star', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 44, 5, 4, null, null, null), -(869, 'Alcremie', 'Caramel Ribbon', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 44, 5, 5, null, null, null), -(869, 'Alcremie', 'Rainbow Strawberry', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 44, 5, 6, null, null, null), -(869, 'Alcremie', 'Rainbow Berry', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 45, 1, 1, null, null, null), -(869, 'Alcremie', 'Rainbow Love', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 45, 1, 2, null, null, null), -(869, 'Alcremie', 'Rainbow Flower', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 45, 1, 3, null, null, null), -(869, 'Alcremie', 'Rainbow Clover', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 45, 1, 4, null, null, null), -(869, 'Alcremie', 'Rainbow Star', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 45, 1, 5, null, null, null), -(869, 'Alcremie', 'Rainbow Ribbon', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 45, 1, 6, null, null, null), -(870, 'Falinks', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 45, 2, 1, 29, 5, 6), -(871, 'Pincurchin', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 45, 2, 2, 30, 1, 1), -(872, 'Snom', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 45, 2, 3, 30, 1, 2), -(873, 'Frosmoth', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 45, 2, 4, 30, 1, 3), -(874, 'Stonjourner', NULL, false, 'Galar', ARRAY['Sword'], NULL, 'Route 10, Lake of Outrage Giant''s Seat, Rolling Fields, Stony Wilderness (Max Raid Battle)', 45, 2, 5, 30, 1, 4), -(875, 'Eiscue', NULL, false, 'Galar', ARRAY['Shield'], NULL, NULL, 45, 2, 6, 30, 1, 5), -(876, 'Indeedee', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, 'Version exclusive in wild, but eggs can be either gender', 45, 3, 1, 30, 1, 6), -(876, 'Indeedee', 'Female', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 45, 3, 2, null, null, null), -(877, 'Morpeko', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 45, 3, 3, 30, 2, 1), -(878, 'Cufant', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 45, 3, 4, 30, 2, 2), -(879, 'Copperajah', NULL, true, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 45, 3, 5, 30, 2, 3), -(880, 'Dracozolt', 'Bird and Drake', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 45, 3, 6, 30, 2, 4), -(881, 'Arctozolt', 'Bird and Dino', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 45, 4, 1, 30, 2, 5), -(882, 'Dracovish', 'Fish and Drake', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 45, 4, 2, 30, 2, 6), -(883, 'Arctovish', 'Fish and Dino', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 45, 4, 3, 30, 3, 1), -(884, 'Duraludon', NULL, true, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 45, 4, 4, 30, 3, 2), -(885, 'Dreepy', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 45, 4, 5, 30, 3, 3), -(886, 'Drakloak', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 45, 4, 6, 30, 3, 4), -(887, 'Dragapult', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 45, 5, 1, 30, 3, 5), -(888, 'Zacian', NULL, false, 'Galar', ARRAY['Sword'], NULL, 'Tower Summit (Only one)', 45, 5, 2, 30, 3, 6), -(889, 'Zamazenta', NULL, false, 'Galar', ARRAY['Shield'], NULL, NULL, 45, 5, 3, 30, 4, 1), -(890, 'Eternatus', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 45, 5, 4, 30, 4, 2), -(891, 'Kubfu', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 45, 5, 5, 30, 4, 3), -(892, 'Urshifu', 'Single', true, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 45, 5, 6, 30, 4, 4), -(892, 'Urshifu', 'Rapid', true, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 46, 1, 1, null, null, null), -(893, 'Zarude', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, 'Event (unobtainable at time of writing) - maybe possible in pkhex?', 46, 1, 2, 30, 4, 5), -(893, 'Zarude', 'Dada', false, 'Galar', ARRAY['Sword', 'Shield'], NULL, 'Event (unobtainable at time of writing) - maybe possible in pkhex?', 46, 1, 3, null, null, null), -(894, 'Regieleki', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 46, 1, 4, 30, 4, 6), -(895, 'Regidrago', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 46, 1, 5, 30, 5, 1), -(896, 'Glastrier', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 46, 1, 6, 30, 5, 2), -(897, 'Spectrier', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 46, 2, 1, 30, 5, 3), -(898, 'Calyrex', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], NULL, NULL, 46, 2, 2, 30, 5, 4), -(899, 'Wyrdeer', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], 'Hisui', 'Evolves from Stantler after using Psyshield Bash in the agile style at least 20 times.', 46, 2, 3, 30, 5, 5), -(900, 'Kleavor', NULL, false, 'Kanto', ARRAY['Red', 'Yellow', 'LG: Pikachu'], 'Hisui', 'Evolves from Scyther when exposed to a Black Augurite.', 46, 2, 4, 30, 5, 6), -(901, 'Ursaluna', NULL, false, 'Johto', ARRAY['Gold', 'Crystal', 'HG', 'SS'], 'Hisui', 'It evolves from Ursaring when exposed to a Peat Block during a full moon.', 46, 2, 5, 31, 1, 1), -(901, 'Ursaluna', 'Bloodmoon', false, 'Paldea', ARRAY['Violet'], NULL, 'Expansion Pass: Timeless Woods (only one) (Bloodmoon)', 46, 2, 6, null, null, null), -(902, 'Basculegion', NULL, false, 'Hisui', ARRAY['PLA'], NULL, 'Evolves from white-striped Basculin when leveled up after losing at least 294 HP from recoil damage without fainting.', 46, 3, 1, 31, 1, 2), -(902, 'Basculegion', 'Female', false, 'Hisui', ARRAY['PLA'], NULL, 'Evolves from white-striped Basculin when leveled up after losing at least 294 HP from recoil damage without fainting.', 46, 3, 2, null, null, null), -(903, 'Sneasler', NULL, false, 'Hisui', ARRAY['PLA'], NULL, 'Evolves from Sneasel when leveled up while holding a Razor Claw during the day', 46, 3, 3, 31, 1, 3), -(904, 'Overqwil', NULL, false, 'Hisui', ARRAY['PLA'], NULL, 'Evolves from hisuian Qwilfish when leveled up while knowing Barb Barrage.', 46, 3, 4, 31, 1, 4), -(905, 'Enamorus', 'Therian Form', false, 'Hisui', ARRAY['PLA'], NULL, 'While it is not known to evolve into or from any Pokémon, Enamorus has a second form activated by using the Reveal Glass. Its original form, Incarnate Forme, will then become Therian Forme.', 46, 3, 5, null, null, null), -(905, 'Enamorus', 'Incarnate Form', false, 'Hisui', ARRAY['PLA'], NULL, 'Crimson Mirelands: Scarlet Bog (Only one) (Incarnate Forme)', 47, 1, 1, 31, 1, 5), -(906, 'Sprigatito', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 47, 1, 2, 31, 1, 6), -(907, 'Floragato', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 47, 1, 3, 31, 2, 1), -(908, 'Meowscarada', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 47, 1, 4, 31, 2, 2), -(909, 'Fuecoco', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 47, 1, 5, 31, 2, 3), -(910, 'Crocalor', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 47, 1, 6, 31, 2, 4), -(911, 'Skeledirge', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 47, 2, 1, 31, 2, 5), -(912, 'Quaxly', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 47, 2, 2, 31, 2, 6), -(913, 'Quaxwell', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 47, 2, 3, 31, 3, 1), -(914, 'Quaquaval', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 47, 2, 4, 31, 3, 2), -(915, 'Lechonk', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 47, 2, 5, 31, 3, 3), -(916, 'Oinkologne', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 47, 2, 6, 31, 3, 4), -(916, 'Oinkologne', 'Female', false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 47, 3, 1, null, null, null), -(917, 'Tarountula', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 47, 3, 2, 31, 3, 5), -(918, 'Spidops', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 47, 3, 3, 31, 3, 6), -(919, 'Nymble', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 47, 3, 4, 31, 4, 1), -(920, 'Lokix', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 47, 3, 5, 31, 4, 2), -(921, 'Pawmi', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 47, 3, 6, 31, 4, 3), -(922, 'Pawmo', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 47, 4, 1, 31, 4, 4), -(923, 'Pawmot', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 47, 4, 2, 31, 4, 5), -(924, 'Tandemaus', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 47, 4, 3, 31, 4, 6), -(925, 'Maushold', 'Family of 3', false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 47, 4, 4, 31, 5, 1), -(925, 'Maushold', 'Family of 4', false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 47, 4, 5, null, null, null), -(926, 'Fidough', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 47, 4, 6, 31, 5, 2), -(927, 'Dachsbun', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 47, 5, 1, 31, 5, 3), -(928, 'Smoliv', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 47, 5, 2, 31, 5, 4), -(929, 'Dolliv', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 47, 5, 3, 31, 5, 5), -(930, 'Arboliva', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 47, 5, 4, 31, 5, 6), -(931, 'Squawkabilly', 'Green', false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 47, 5, 5, null, null, null), -(931, 'Squawkabilly', 'Blue', false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 47, 5, 6, null, null, null), -(931, 'Squawkabilly', 'Yellow', false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 48, 1, 1, null, null, null), -(931, 'Squawkabilly', 'White', false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 48, 1, 2, null, null, null), -(932, 'Nacli', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 48, 1, 3, 32, 1, 1), -(933, 'Naclstack', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 48, 1, 4, 32, 1, 2), -(934, 'Garganacl', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 48, 1, 5, 32, 1, 3), -(935, 'Charcadet', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 48, 1, 6, 32, 1, 4), -(936, 'Armarouge', NULL, false, 'Paldea', ARRAY['Scarlet'], NULL, NULL, 48, 2, 1, 32, 1, 5), -(937, 'Ceruledge', NULL, false, 'Paldea', ARRAY['Violet'], NULL, NULL, 48, 2, 2, 32, 1, 6), -(938, 'Tadbulb', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 48, 2, 3, 32, 2, 1), -(939, 'Bellibolt', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 48, 2, 4, 32, 2, 2), -(940, 'Wattrel', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 48, 2, 5, 32, 2, 3), -(941, 'Kilowattrel', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 48, 2, 6, 32, 2, 4), -(942, 'Maschiff', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 48, 3, 1, 32, 2, 5), -(943, 'Mabosstiff', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 48, 3, 2, 32, 2, 6), -(944, 'Shroodle', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 48, 3, 3, 32, 3, 1), -(945, 'Grafaiai', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 48, 3, 4, 32, 3, 2), -(946, 'Bramblin', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 48, 3, 5, 32, 3, 3), -(947, 'Brambleghast', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 48, 3, 6, 32, 3, 4), -(948, 'Toedscool', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 48, 4, 1, 32, 3, 5), -(949, 'Toedscruel', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 48, 4, 2, 32, 3, 6), -(950, 'Klawf', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 48, 4, 3, 32, 4, 1), -(951, 'Capsakid', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 48, 4, 4, 32, 4, 2), -(952, 'Scovillain', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 48, 4, 5, 32, 4, 3), -(953, 'Rellor', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 48, 4, 6, 32, 4, 4), -(954, 'Rabsca', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 48, 5, 1, 32, 4, 5), -(955, 'Flittle', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 48, 5, 2, 32, 4, 6), -(956, 'Espathra', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 48, 5, 3, 32, 5, 1), -(957, 'Tinkatink', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 48, 5, 4, 32, 5, 2), -(958, 'Tinkatuff', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 48, 5, 5, 32, 5, 3), -(959, 'Tinkaton', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 48, 5, 6, 32, 5, 4), -(960, 'Wiglett', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 49, 1, 1, 32, 5, 5), -(961, 'Wugtrio', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 49, 1, 2, 32, 5, 6), -(962, 'Bombirdier', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 49, 1, 3, 33, 1, 1), -(963, 'Finizen', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 49, 1, 4, 33, 1, 2), -(964, 'Palafin', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 49, 1, 5, 33, 1, 3), -(965, 'Varoom', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 49, 1, 6, 33, 1, 4), -(966, 'Revavroom', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 49, 2, 1, 33, 1, 5), -(967, 'Cyclizar', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 49, 2, 2, 33, 1, 6), -(968, 'Orthworm', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 49, 2, 3, 33, 2, 1), -(969, 'Glimmet', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 49, 2, 4, 33, 2, 2), -(970, 'Glimmora', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 49, 2, 5, 33, 2, 3), -(971, 'Greavard', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 49, 2, 6, 33, 2, 4), -(972, 'Houndstone', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 49, 3, 1, 33, 2, 5), -(973, 'Flamigo', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 49, 3, 2, 33, 2, 6), -(974, 'Cetoddle', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 49, 3, 3, 33, 3, 1), -(975, 'Cetitan', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 49, 3, 4, 33, 3, 2), -(976, 'Veluza', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 49, 3, 5, 33, 3, 3), -(977, 'Dondozo', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 49, 3, 6, 33, 3, 4), -(978, 'Tatsugiri', 'Curly', false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 49, 4, 1, 33, 3, 5), -(978, 'Tatsugiri', 'Droopy', false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 49, 4, 2, null, null, null), -(978, 'Tatsugiri', 'Stretchy', false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 49, 4, 3, null, null, null), -(979, 'Annihilape', NULL, false, 'Kanto', ARRAY['Red', 'Yellow', 'LG: Pikachu'], 'Paldea', NULL, 49, 4, 4, 33, 3, 6), -(980, 'Clodsire', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 49, 4, 5, 33, 4, 1), -(981, 'Farigiraf', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'HG', 'SS'], 'Paldea', 'It evolves from Girafarig when leveled up while knowing Twin Beam.', 49, 4, 6, 33, 4, 2), -(982, 'Dudunsparce', '2-Segment', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], 'Paldea', 'It evolves from Dunsparce when leveled up while knowing Hyper Drill. Dudunsparce has two separate forms: Two-Segment Form and Three-Segment Form. When Dunsparce evolves, it has a 1/100 chance of evolving into Three-Segment Form Dudunsparce.', 49, 5, 1, 33, 4, 3), -(982, 'Dudunsparce', '3-Segment', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HG', 'SS'], 'Paldea', 'It evolves from Dunsparce when leveled up while knowing Hyper Drill. Dudunsparce has two separate forms: Two-Segment Form and Three-Segment Form. When Dunsparce evolves, it has a 1/100 chance of evolving into Three-Segment Form Dudunsparce.', 49, 5, 2, null, null, null), -(983, 'Kingambit', NULL, false, 'Unova', ARRAY['Black', 'White', 'Black2', 'White2'], 'Paldea', 'Evolves from Bisharp upon leveling up after defeating three Bisharp that hold a Leader''s Crest. (Scarlet/Violet only)', 49, 5, 3, 33, 4, 4), -(984, 'Great Tusk', NULL, false, 'Paldea', ARRAY['Scarlet'], NULL, NULL, 49, 5, 4, 33, 4, 5), -(985, 'Scream Tail', NULL, false, 'Paldea', ARRAY['Scarlet'], NULL, NULL, 49, 5, 5, 33, 4, 6), -(986, 'Brute Bonnet', NULL, false, 'Paldea', ARRAY['Scarlet'], NULL, NULL, 49, 5, 6, 33, 5, 1), -(987, 'Flutter Mane', NULL, false, 'Paldea', ARRAY['Scarlet'], NULL, NULL, 50, 1, 1, 33, 5, 2), -(988, 'Slither Wing', NULL, false, 'Paldea', ARRAY['Scarlet'], NULL, NULL, 50, 1, 2, 33, 5, 3), -(989, 'Sandy Shocks', NULL, false, 'Paldea', ARRAY['Scarlet'], NULL, NULL, 50, 1, 3, 33, 5, 4), -(990, 'Iron Treads', NULL, false, 'Paldea', ARRAY['Violet'], NULL, NULL, 50, 1, 4, 33, 5, 5), -(991, 'Iron Bundle', NULL, false, 'Paldea', ARRAY['Violet'], NULL, NULL, 50, 1, 5, 33, 5, 6), -(992, 'Iron Hands', NULL, false, 'Paldea', ARRAY['Violet'], NULL, NULL, 50, 1, 6, 34, 1, 1), -(993, 'Iron Jugulis', NULL, false, 'Paldea', ARRAY['Violet'], NULL, NULL, 50, 2, 1, 34, 1, 2), -(994, 'Iron Moth', NULL, false, 'Paldea', ARRAY['Violet'], NULL, NULL, 50, 2, 2, 34, 1, 3), -(995, 'Iron Thorns', NULL, false, 'Paldea', ARRAY['Violet'], NULL, NULL, 50, 2, 3, 34, 1, 4), -(996, 'Frigibax', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 50, 2, 4, 34, 1, 5), -(997, 'Arctibax', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 50, 2, 5, 34, 1, 6), -(998, 'Baxcalibur', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 50, 2, 6, 34, 2, 1), -(999, 'Gimmighoul', 'Box Form', false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 50, 3, 1, 34, 2, 2), -(1000, 'Gimmighoul', 'Roaming Form', false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 50, 3, 2, null, null, null), -(1000, 'Gholdengo', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 50, 3, 3, 34, 2, 3), -(1001, 'Wo-Chien', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 50, 3, 4, 34, 2, 4), -(1002, 'Chien-Pao', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 50, 3, 5, 34, 2, 5), -(1003, 'Ting-Lu', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 50, 3, 6, 34, 2, 6), -(1004, 'Chi-Yu', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 50, 4, 1, 34, 3, 1), -(1005, 'Roaring Moon', NULL, false, 'Paldea', ARRAY['Scarlet'], NULL, NULL, 50, 4, 2, 34, 3, 2), -(1006, 'Iron Valiant', NULL, false, 'Paldea', ARRAY['Violet'], NULL, NULL, 50, 4, 3, 34, 3, 3), -(1007, 'Koraidon', NULL, false, 'Paldea', ARRAY['Scarlet'], NULL, NULL, 50, 4, 4, 34, 3, 4), -(1008, 'Miraidon', NULL, false, 'Paldea', ARRAY['Violet'], NULL, NULL, 50, 4, 5, 34, 3, 5), -(1009, 'Walking Wake', NULL, false, 'Paldea', ARRAY['Scarlet'], NULL, NULL, 50, 4, 6, 34, 3, 6), -(1010, 'Iron Leaves', NULL, false, 'Paldea', ARRAY['Violet'], NULL, NULL, 50, 5, 1, 34, 4, 1), -(1011, 'Dipplin', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 50, 5, 2, 34, 4, 2), -(1012, 'Poltchageist', 'Phony', false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 50, 5, 3, 34, 4, 3), -(1012, 'Poltchageist', 'Antique', false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 50, 5, 4, null, null, null), -(1013, 'Sinistcha', 'Phony', false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 50, 5, 5, 34, 4, 4), -(1013, 'Sinistcha', 'Antique', false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 50, 5, 6, null, null, null), -(1014, 'Okidogi', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 51, 1, 1, 34, 4, 5), -(1015, 'Munkidori', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 51, 1, 2, 34, 4, 6), -(1016, 'Fezandipiti', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 51, 1, 3, 34, 5, 1), -(1017, 'Ogrepon', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 51, 1, 4, 34, 5, 2), -(1018, 'Archaludon', NULL, false, 'Galar', ARRAY['Sword', 'Shield'], 'Paldea', 'Expansion Pass: It evolves from Duraludon when exposed to a hunk of Metal Alloy.', 51, 1, 5, 34, 5, 3), -(1019, 'Hydrapple', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 51, 1, 6, 34, 5, 4), -(1020, 'Gouging Fire', NULL, false, 'Paldea', ARRAY['Scarlet'], NULL, NULL, 51, 2, 1, 34, 5, 5), -(1021, 'Raging Bolt', NULL, false, 'Paldea', ARRAY['Scarlet'], NULL, NULL, 51, 2, 2, 34, 5, 6), -(1022, 'Iron Boulder', NULL, false, 'Paldea', ARRAY['Violet'], NULL, NULL, 51, 2, 3, 35, 1, 1), -(1023, 'Iron Crown', NULL, false, 'Paldea', ARRAY['Violet'], NULL, NULL, 51, 2, 4, 35, 1, 2), -(1024, 'Terapagos', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 51, 2, 5, 35, 1, 3), -(1025, 'Pecharunt', NULL, false, 'Paldea', ARRAY['Scarlet', 'Violet'], NULL, NULL, 51, 2, 6, 35, 1, 4); - --- Update metadata -UPDATE metadata -SET value = '{"count": 1390}', "updatedAt" = NOW() -WHERE key = 'total_pokemon'; - --- Insert region-game mappings if not already present -INSERT INTO region_game_mappings (region, game) VALUES -('Kanto', 'Red'), -('Kanto', 'Blue'), -('Kanto', 'Yellow'), -('Kanto', 'LG: Pikachu'), -('Kanto', 'LG: Eevee'), -('Johto', 'Gold'), -('Johto', 'Silver'), -('Johto', 'Crystal'), -('Hoenn', 'Ruby'), -('Hoenn', 'Sapphire'), -('Hoenn', 'Emerald'), -('Sinnoh', 'Diamond'), -('Sinnoh', 'Pearl'), -('Sinnoh', 'Platinum'), -('Unova', 'Black'), -('Unova', 'White'), -('Unova', 'Black 2'), -('Unova', 'White 2'), -('Kalos', 'X'), -('Kalos', 'Y'), -('Alola', 'Sun'), -('Alola', 'Moon'), -('Alola', 'Ultra Sun'), -('Alola', 'Ultra Moon'), -('Galar', 'Sword'), -('Galar', 'Shield'), -('Paldea', 'Scarlet'), -('Paldea', 'Violet') -ON CONFLICT (region, game) DO NOTHING; - --- Insert metadata -INSERT INTO metadata (key, value) VALUES -('migration_version', '1.0'), -('data_source', 'tsv-parser'), -('last_updated', NOW()::TEXT), -('total_pokemon', '{"count": 1390}') -ON CONFLICT (key) DO UPDATE SET - value = EXCLUDED.value, - "updatedAt" = NOW(); - --- Add success message -SELECT 'Successfully loaded 1390 Pokemon entries' as message; diff --git a/supabase/migrations/20250127000001_add_pokedexes_table.sql b/supabase/migrations/20250127000001_add_pokedexes_table.sql new file mode 100644 index 0000000..2d862f5 --- /dev/null +++ b/supabase/migrations/20250127000001_add_pokedexes_table.sql @@ -0,0 +1,51 @@ +-- Create pokedexes table +CREATE TABLE pokedexes ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + "userId" UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE, + name TEXT NOT NULL, + description TEXT, + + -- Type flags (combinable) + "isLivingDex" BOOLEAN DEFAULT FALSE, + "isShinyDex" BOOLEAN DEFAULT FALSE, + "isOriginDex" BOOLEAN DEFAULT FALSE, + "isFormDex" BOOLEAN DEFAULT FALSE, + + -- Scope (NULL = all games, or specific game) + "gameScope" TEXT, + + "createdAt" TIMESTAMPTZ DEFAULT NOW(), + "updatedAt" TIMESTAMPTZ DEFAULT NOW(), + + -- User can't have duplicate pokédex names + UNIQUE("userId", name) +); + +-- Create index for performance +CREATE INDEX idx_pokedexes_user_id ON pokedexes("userId"); + +-- Trigger to automatically update updated_at timestamp +CREATE TRIGGER update_pokedexes_updated_at + BEFORE UPDATE ON pokedexes + FOR EACH ROW EXECUTE FUNCTION update_updated_at_column(); + +-- Enable RLS +ALTER TABLE pokedexes ENABLE ROW LEVEL SECURITY; + +-- RLS POLICIES - CRITICAL: Users can ONLY access their own pokédexes + +-- Users can ONLY view their own pokédexes +CREATE POLICY "Users can view own pokedexes" ON pokedexes + FOR SELECT USING (auth.uid() = "userId"); + +-- Users can ONLY create pokédexes for themselves +CREATE POLICY "Users can create own pokedexes" ON pokedexes + FOR INSERT WITH CHECK (auth.uid() = "userId"); + +-- Users can ONLY update their own pokédexes +CREATE POLICY "Users can update own pokedexes" ON pokedexes + FOR UPDATE USING (auth.uid() = "userId"); + +-- Users can ONLY delete their own pokédexes +CREATE POLICY "Users can delete own pokedexes" ON pokedexes + FOR DELETE USING (auth.uid() = "userId"); diff --git a/supabase/migrations/20250127000002_add_pokedex_id_to_catch_records.sql b/supabase/migrations/20250127000002_add_pokedex_id_to_catch_records.sql new file mode 100644 index 0000000..5d30c0e --- /dev/null +++ b/supabase/migrations/20250127000002_add_pokedex_id_to_catch_records.sql @@ -0,0 +1,74 @@ +-- Truncate existing catch records (no real users, as confirmed) +TRUNCATE TABLE catch_records; + +-- Add pokedexId column +ALTER TABLE catch_records + ADD COLUMN "pokedexId" UUID REFERENCES pokedexes(id) ON DELETE CASCADE; + +-- Make pokedexId NOT NULL +ALTER TABLE catch_records + ALTER COLUMN "pokedexId" SET NOT NULL; + +-- Drop old unique constraint (userId, pokedexEntryId) +ALTER TABLE catch_records + DROP CONSTRAINT IF EXISTS catch_records_userId_pokedexEntryId_key; + +-- Add new unique constraint (userId, pokedexEntryId, pokedexId) +ALTER TABLE catch_records + ADD CONSTRAINT catch_records_user_pokemon_pokedex_unique + UNIQUE("userId", "pokedexEntryId", "pokedexId"); + +-- Add index for performance +CREATE INDEX idx_catch_records_pokedex_id ON catch_records("pokedexId"); + +-- RLS POLICIES - CRITICAL: Users can ONLY access catch records for their own pokédexes + +-- Drop existing RLS policies if they exist +DROP POLICY IF EXISTS "Users can view own catch records" ON catch_records; +DROP POLICY IF EXISTS "Users can insert own catch records" ON catch_records; +DROP POLICY IF EXISTS "Users can update own catch records" ON catch_records; +DROP POLICY IF EXISTS "Users can delete own catch records" ON catch_records; + +-- Users can ONLY view catch records for their own pokédexes +CREATE POLICY "Users can view own catch records" ON catch_records + FOR SELECT USING ( + auth.uid() = "userId" AND + EXISTS ( + SELECT 1 FROM pokedexes + WHERE pokedexes.id = catch_records."pokedexId" + AND pokedexes."userId" = auth.uid() + ) + ); + +-- Users can ONLY insert catch records for their own pokédexes +CREATE POLICY "Users can insert own catch records" ON catch_records + FOR INSERT WITH CHECK ( + auth.uid() = "userId" AND + EXISTS ( + SELECT 1 FROM pokedexes + WHERE pokedexes.id = catch_records."pokedexId" + AND pokedexes."userId" = auth.uid() + ) + ); + +-- Users can ONLY update catch records for their own pokédexes +CREATE POLICY "Users can update own catch records" ON catch_records + FOR UPDATE USING ( + auth.uid() = "userId" AND + EXISTS ( + SELECT 1 FROM pokedexes + WHERE pokedexes.id = catch_records."pokedexId" + AND pokedexes."userId" = auth.uid() + ) + ); + +-- Users can ONLY delete catch records for their own pokédexes +CREATE POLICY "Users can delete own catch records" ON catch_records + FOR DELETE USING ( + auth.uid() = "userId" AND + EXISTS ( + SELECT 1 FROM pokedexes + WHERE pokedexes.id = catch_records."pokedexId" + AND pokedexes."userId" = auth.uid() + ) + ); diff --git a/supabase/migrations/20260104000002_create_regional_dex_numbers.sql b/supabase/migrations/20260104000002_create_regional_dex_numbers.sql new file mode 100644 index 0000000..55316f7 --- /dev/null +++ b/supabase/migrations/20260104000002_create_regional_dex_numbers.sql @@ -0,0 +1,21 @@ +-- Create regional_dex_numbers table for generic regional dex number storage +-- This table replaces region-specific columns (kanto_dex_number, johto_dex_number, etc.) +-- and allows adding new regions without schema changes + +CREATE TABLE IF NOT EXISTS regional_dex_numbers ( + id SERIAL PRIMARY KEY, + pokedex_entry_id INT NOT NULL REFERENCES pokedex_entries(id) ON DELETE CASCADE, + region TEXT NOT NULL, + dex_number INT NOT NULL, + UNIQUE(pokedex_entry_id, region) +); + +-- Create indexes for better query performance +CREATE INDEX IF NOT EXISTS idx_regional_dex_numbers_region ON regional_dex_numbers(region, dex_number); +CREATE INDEX IF NOT EXISTS idx_regional_dex_numbers_entry ON regional_dex_numbers(pokedex_entry_id); + +-- RLS policies (read-only reference data, same pattern as pokedex_entries) +ALTER TABLE regional_dex_numbers ENABLE ROW LEVEL SECURITY; + +CREATE POLICY "Allow public read access" ON regional_dex_numbers + FOR SELECT USING (true); diff --git a/supabase/migrations/20260105151500_create_games_table.sql b/supabase/migrations/20260105151500_create_games_table.sql new file mode 100644 index 0000000..56619e1 --- /dev/null +++ b/supabase/migrations/20260105151500_create_games_table.sql @@ -0,0 +1,40 @@ +-- Create games table to store game metadata +CREATE TABLE IF NOT EXISTS games ( + id TEXT PRIMARY KEY, + "displayName" TEXT NOT NULL, + region TEXT NOT NULL, + generation INTEGER NOT NULL, + "releaseYear" INTEGER NOT NULL, + "createdAt" TIMESTAMP WITH TIME ZONE DEFAULT NOW(), + "updatedAt" TIMESTAMP WITH TIME ZONE DEFAULT NOW() +); + +-- Enable RLS +ALTER TABLE games ENABLE ROW LEVEL SECURITY; + +-- Allow anyone to read games (public reference data) +CREATE POLICY "Games are publicly readable" + ON games + FOR SELECT + TO public + USING (true); + +-- Insert games data from games.csv +INSERT INTO games (id, "displayName", region, generation, "releaseYear") VALUES + ('red', 'Red', 'Kanto', 1, 1996), + ('blue', 'Blue', 'Kanto', 1, 1996), + ('yellow', 'Yellow', 'Kanto', 1, 1998), + ('lg--pikachu', 'LG: Pikachu', 'Kanto', 7, 2018), + ('lg--eevee', 'LG: Eevee', 'Kanto', 7, 2018), + ('gold', 'Gold', 'Johto', 2, 1999), + ('silver', 'Silver', 'Johto', 2, 1999), + ('crystal', 'Crystal', 'Johto', 2, 2000), + ('heartgold', 'HeartGold', 'Johto', 4, 2009), + ('soulsilver', 'SoulSilver', 'Johto', 4, 2009), + ('legends-arceus', 'Legends: Arceus', 'Hisui', 8, 2022) +ON CONFLICT (id) DO UPDATE SET + "displayName" = EXCLUDED."displayName", + region = EXCLUDED.region, + generation = EXCLUDED.generation, + "releaseYear" = EXCLUDED."releaseYear", + "updatedAt" = NOW(); diff --git a/supabase/migrations/20260105155340_seed_kanto.sql b/supabase/migrations/20260105155340_seed_kanto.sql new file mode 100644 index 0000000..88960ee --- /dev/null +++ b/supabase/migrations/20260105155340_seed_kanto.sql @@ -0,0 +1,360 @@ +-- Seed Kanto region Pokémon (Gen 1) +-- Auto-generated from CSV files + +-- Insert Kanto region-game mappings +INSERT INTO region_game_mappings (region, game) VALUES + ('Kanto', 'Red'), + ('Kanto', 'Blue'), + ('Kanto', 'Yellow'), + ('Kanto', 'LG: Pikachu'), + ('Kanto', 'LG: Eevee') +ON CONFLICT (region, game) DO NOTHING; + +-- Insert Kanto Pokémon entries +INSERT INTO pokedex_entries ( + "pokedexNumber", + pokemon, + form, + "canGigantamax", + "regionToCatchIn", + "gamesToCatchIn" +) VALUES +(1, 'Bulbasaur', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(2, 'Ivysaur', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(3, 'Venusaur', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(3, 'Venusaur', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(4, 'Charmander', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(5, 'Charmeleon', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(6, 'Charizard', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(7, 'Squirtle', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(8, 'Wartortle', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(9, 'Blastoise', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(10, 'Caterpie', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(11, 'Metapod', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(12, 'Butterfree', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(12, 'Butterfree', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(13, 'Weedle', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(14, 'Kakuna', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(15, 'Beedrill', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(16, 'Pidgey', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(17, 'Pidgeotto', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(18, 'Pidgeot', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(19, 'Rattata', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(19, 'Rattata', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(20, 'Raticate', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(20, 'Raticate', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(21, 'Spearow', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(22, 'Fearow', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(23, 'Ekans', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(24, 'Arbok', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(25, 'Pikachu', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(25, 'Pikachu', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(26, 'Raichu', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(26, 'Raichu', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(27, 'Sandshrew', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(28, 'Sandslash', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(29, 'Nidoran♀', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(30, 'Nidorina', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(31, 'Nidoqueen', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(32, 'Nidoran♂', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(33, 'Nidorino', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(34, 'Nidoking', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(35, 'Clefairy', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(36, 'Clefable', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(37, 'Vulpix', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(38, 'Ninetales', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(39, 'Jigglypuff', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(40, 'Wigglytuff', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(41, 'Zubat', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(41, 'Zubat', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(42, 'Golbat', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(42, 'Golbat', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(43, 'Oddish', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(44, 'Gloom', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(44, 'Gloom', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(45, 'Vileplume', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(45, 'Vileplume', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(46, 'Paras', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(47, 'Parasect', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(48, 'Venonat', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(49, 'Venomoth', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(50, 'Diglett', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(51, 'Dugtrio', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(52, 'Meowth', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(53, 'Persian', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(54, 'Psyduck', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(55, 'Golduck', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(56, 'Mankey', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(57, 'Primeape', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(58, 'Growlithe', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(59, 'Arcanine', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(60, 'Poliwag', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(61, 'Poliwhirl', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(62, 'Poliwrath', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(63, 'Abra', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(64, 'Kadabra', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(64, 'Kadabra', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(65, 'Alakazam', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(65, 'Alakazam', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(66, 'Machop', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(67, 'Machoke', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(68, 'Machamp', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(69, 'Bellsprout', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(70, 'Weepinbell', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(71, 'Victreebel', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(72, 'Tentacool', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(73, 'Tentacruel', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(74, 'Geodude', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(75, 'Graveler', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(76, 'Golem', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(77, 'Ponyta', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(78, 'Rapidash', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(79, 'Slowpoke', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(80, 'Slowbro', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(81, 'Magnemite', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(82, 'Magneton', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(83, 'Farfetch’d', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(84, 'Doduo', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(84, 'Doduo', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(85, 'Dodrio', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(85, 'Dodrio', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(86, 'Seel', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(87, 'Dewgong', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(88, 'Grimer', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(89, 'Muk', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(90, 'Shellder', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(91, 'Cloyster', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(92, 'Gastly', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(93, 'Haunter', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(94, 'Gengar', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(95, 'Onix', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(96, 'Drowzee', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(97, 'Hypno', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(97, 'Hypno', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(98, 'Krabby', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(99, 'Kingler', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(100, 'Voltorb', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(101, 'Electrode', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(102, 'Exeggcute', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(103, 'Exeggutor', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(104, 'Cubone', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(105, 'Marowak', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(106, 'Hitmonlee', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(107, 'Hitmonchan', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(108, 'Lickitung', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(109, 'Koffing', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(110, 'Weezing', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(111, 'Rhyhorn', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(111, 'Rhyhorn', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(112, 'Rhydon', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(112, 'Rhydon', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(113, 'Chansey', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(114, 'Tangela', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(115, 'Kangaskhan', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(116, 'Horsea', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(117, 'Seadra', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(118, 'Goldeen', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(118, 'Goldeen', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(119, 'Seaking', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(119, 'Seaking', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(120, 'Staryu', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(121, 'Starmie', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(122, 'Mr. Mime', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(123, 'Scyther', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(123, 'Scyther', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(124, 'Jynx', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(125, 'Electabuzz', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(126, 'Magmar', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(127, 'Pinsir', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(128, 'Tauros', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(129, 'Magikarp', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(129, 'Magikarp', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(130, 'Gyarados', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(130, 'Gyarados', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(131, 'Lapras', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(132, 'Ditto', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(133, 'Eevee', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(133, 'Eevee', 'Female', false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(134, 'Vaporeon', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(135, 'Jolteon', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(136, 'Flareon', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(137, 'Porygon', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(138, 'Omanyte', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(139, 'Omastar', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(140, 'Kabuto', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(141, 'Kabutops', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(142, 'Aerodactyl', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(143, 'Snorlax', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(144, 'Articuno', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(145, 'Zapdos', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(146, 'Moltres', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(147, 'Dratini', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(148, 'Dragonair', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(149, 'Dragonite', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(150, 'Mewtwo', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']), +(151, 'Mew', NULL, false, 'Kanto', ARRAY['Red', 'Blue', 'Yellow', 'LG: Pikachu', 'LG: Eevee']) +ON CONFLICT ON CONSTRAINT unique_pokemon_form DO NOTHING; + +-- Insert Kanto regional dex numbers +INSERT INTO regional_dex_numbers ( + pokedex_entry_id, + region, + dex_number +) VALUES + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 1 AND form IS NULL), 'Kanto', 1), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 2 AND form IS NULL), 'Kanto', 2), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 3 AND form IS NULL), 'Kanto', 3), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 4 AND form IS NULL), 'Kanto', 4), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 5 AND form IS NULL), 'Kanto', 5), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 6 AND form IS NULL), 'Kanto', 6), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 7 AND form IS NULL), 'Kanto', 7), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 8 AND form IS NULL), 'Kanto', 8), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 9 AND form IS NULL), 'Kanto', 9), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 10 AND form IS NULL), 'Kanto', 10), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 11 AND form IS NULL), 'Kanto', 11), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 12 AND form IS NULL), 'Kanto', 12), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 13 AND form IS NULL), 'Kanto', 13), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 14 AND form IS NULL), 'Kanto', 14), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 15 AND form IS NULL), 'Kanto', 15), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 16 AND form IS NULL), 'Kanto', 16), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 17 AND form IS NULL), 'Kanto', 17), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 18 AND form IS NULL), 'Kanto', 18), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 19 AND form IS NULL), 'Kanto', 19), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 20 AND form IS NULL), 'Kanto', 20), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 21 AND form IS NULL), 'Kanto', 21), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 22 AND form IS NULL), 'Kanto', 22), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 23 AND form IS NULL), 'Kanto', 23), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 24 AND form IS NULL), 'Kanto', 24), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 25 AND form IS NULL), 'Kanto', 25), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 26 AND form IS NULL), 'Kanto', 26), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 27 AND form IS NULL), 'Kanto', 27), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 28 AND form IS NULL), 'Kanto', 28), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 29 AND form IS NULL), 'Kanto', 29), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 30 AND form IS NULL), 'Kanto', 30), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 31 AND form IS NULL), 'Kanto', 31), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 32 AND form IS NULL), 'Kanto', 32), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 33 AND form IS NULL), 'Kanto', 33), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 34 AND form IS NULL), 'Kanto', 34), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 35 AND form IS NULL), 'Kanto', 35), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 36 AND form IS NULL), 'Kanto', 36), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 37 AND form IS NULL), 'Kanto', 37), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 38 AND form IS NULL), 'Kanto', 38), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 39 AND form IS NULL), 'Kanto', 39), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 40 AND form IS NULL), 'Kanto', 40), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 41 AND form IS NULL), 'Kanto', 41), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 42 AND form IS NULL), 'Kanto', 42), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 43 AND form IS NULL), 'Kanto', 43), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 44 AND form IS NULL), 'Kanto', 44), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 45 AND form IS NULL), 'Kanto', 45), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 46 AND form IS NULL), 'Kanto', 46), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 47 AND form IS NULL), 'Kanto', 47), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 48 AND form IS NULL), 'Kanto', 48), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 49 AND form IS NULL), 'Kanto', 49), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 50 AND form IS NULL), 'Kanto', 50), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 51 AND form IS NULL), 'Kanto', 51), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 52 AND form IS NULL), 'Kanto', 52), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 53 AND form IS NULL), 'Kanto', 53), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 54 AND form IS NULL), 'Kanto', 54), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 55 AND form IS NULL), 'Kanto', 55), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 56 AND form IS NULL), 'Kanto', 56), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 57 AND form IS NULL), 'Kanto', 57), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 58 AND form IS NULL), 'Kanto', 58), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 59 AND form IS NULL), 'Kanto', 59), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 60 AND form IS NULL), 'Kanto', 60), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 61 AND form IS NULL), 'Kanto', 61), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 62 AND form IS NULL), 'Kanto', 62), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 63 AND form IS NULL), 'Kanto', 63), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 64 AND form IS NULL), 'Kanto', 64), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 65 AND form IS NULL), 'Kanto', 65), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 66 AND form IS NULL), 'Kanto', 66), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 67 AND form IS NULL), 'Kanto', 67), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 68 AND form IS NULL), 'Kanto', 68), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 69 AND form IS NULL), 'Kanto', 69), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 70 AND form IS NULL), 'Kanto', 70), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 71 AND form IS NULL), 'Kanto', 71), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 72 AND form IS NULL), 'Kanto', 72), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 73 AND form IS NULL), 'Kanto', 73), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 74 AND form IS NULL), 'Kanto', 74), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 75 AND form IS NULL), 'Kanto', 75), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 76 AND form IS NULL), 'Kanto', 76), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 77 AND form IS NULL), 'Kanto', 77), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 78 AND form IS NULL), 'Kanto', 78), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 79 AND form IS NULL), 'Kanto', 79), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 80 AND form IS NULL), 'Kanto', 80), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 81 AND form IS NULL), 'Kanto', 81), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 82 AND form IS NULL), 'Kanto', 82), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 83 AND form IS NULL), 'Kanto', 83), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 84 AND form IS NULL), 'Kanto', 84), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 85 AND form IS NULL), 'Kanto', 85), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 86 AND form IS NULL), 'Kanto', 86), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 87 AND form IS NULL), 'Kanto', 87), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 88 AND form IS NULL), 'Kanto', 88), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 89 AND form IS NULL), 'Kanto', 89), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 90 AND form IS NULL), 'Kanto', 90), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 91 AND form IS NULL), 'Kanto', 91), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 92 AND form IS NULL), 'Kanto', 92), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 93 AND form IS NULL), 'Kanto', 93), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 94 AND form IS NULL), 'Kanto', 94), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 95 AND form IS NULL), 'Kanto', 95), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 96 AND form IS NULL), 'Kanto', 96), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 97 AND form IS NULL), 'Kanto', 97), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 98 AND form IS NULL), 'Kanto', 98), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 99 AND form IS NULL), 'Kanto', 99), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 100 AND form IS NULL), 'Kanto', 100), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 101 AND form IS NULL), 'Kanto', 101), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 102 AND form IS NULL), 'Kanto', 102), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 103 AND form IS NULL), 'Kanto', 103), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 104 AND form IS NULL), 'Kanto', 104), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 105 AND form IS NULL), 'Kanto', 105), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 106 AND form IS NULL), 'Kanto', 106), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 107 AND form IS NULL), 'Kanto', 107), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 108 AND form IS NULL), 'Kanto', 108), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 109 AND form IS NULL), 'Kanto', 109), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 110 AND form IS NULL), 'Kanto', 110), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 111 AND form IS NULL), 'Kanto', 111), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 112 AND form IS NULL), 'Kanto', 112), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 113 AND form IS NULL), 'Kanto', 113), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 114 AND form IS NULL), 'Kanto', 114), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 115 AND form IS NULL), 'Kanto', 115), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 116 AND form IS NULL), 'Kanto', 116), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 117 AND form IS NULL), 'Kanto', 117), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 118 AND form IS NULL), 'Kanto', 118), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 119 AND form IS NULL), 'Kanto', 119), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 120 AND form IS NULL), 'Kanto', 120), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 121 AND form IS NULL), 'Kanto', 121), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 122 AND form IS NULL), 'Kanto', 122), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 123 AND form IS NULL), 'Kanto', 123), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 124 AND form IS NULL), 'Kanto', 124), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 125 AND form IS NULL), 'Kanto', 125), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 126 AND form IS NULL), 'Kanto', 126), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 127 AND form IS NULL), 'Kanto', 127), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 128 AND form IS NULL), 'Kanto', 128), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 129 AND form IS NULL), 'Kanto', 129), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 130 AND form IS NULL), 'Kanto', 130), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 131 AND form IS NULL), 'Kanto', 131), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 132 AND form IS NULL), 'Kanto', 132), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 133 AND form IS NULL), 'Kanto', 133), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 134 AND form IS NULL), 'Kanto', 134), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 135 AND form IS NULL), 'Kanto', 135), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 136 AND form IS NULL), 'Kanto', 136), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 137 AND form IS NULL), 'Kanto', 137), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 138 AND form IS NULL), 'Kanto', 138), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 139 AND form IS NULL), 'Kanto', 139), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 140 AND form IS NULL), 'Kanto', 140), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 141 AND form IS NULL), 'Kanto', 141), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 142 AND form IS NULL), 'Kanto', 142), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 143 AND form IS NULL), 'Kanto', 143), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 144 AND form IS NULL), 'Kanto', 144), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 145 AND form IS NULL), 'Kanto', 145), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 146 AND form IS NULL), 'Kanto', 146), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 147 AND form IS NULL), 'Kanto', 147), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 148 AND form IS NULL), 'Kanto', 148), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 149 AND form IS NULL), 'Kanto', 149), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 150 AND form IS NULL), 'Kanto', 150), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 151 AND form IS NULL), 'Kanto', 151); + +-- Add metadata +INSERT INTO metadata (key, value) VALUES + ('kanto_seeded', 'true'), + ('kanto_seed_date', NOW()::TEXT), + ('kanto_pokemon_count', '151'); diff --git a/supabase/migrations/20260105160807_seed_johto.sql b/supabase/migrations/20260105160807_seed_johto.sql new file mode 100644 index 0000000..4f32c87 --- /dev/null +++ b/supabase/migrations/20260105160807_seed_johto.sql @@ -0,0 +1,284 @@ +-- Seed Johto region Pokémon (Gen 2) +-- Auto-generated from CSV files + +-- Insert Johto region-game mappings +INSERT INTO region_game_mappings (region, game) VALUES + ('Johto', 'Gold'), + ('Johto', 'Silver'), + ('Johto', 'Crystal'), + ('Johto', 'HeartGold'), + ('Johto', 'SoulSilver') +ON CONFLICT (region, game) DO NOTHING; + +-- Insert Johto Pokémon entries +INSERT INTO pokedex_entries ( + "pokedexNumber", + pokemon, + form, + "canGigantamax", + "regionToCatchIn", + "gamesToCatchIn" +) VALUES +(152, 'Chikorita', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(153, 'Bayleef', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(154, 'Meganium', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(154, 'Meganium', 'Female', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(155, 'Cyndaquil', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(156, 'Quilava', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(157, 'Typhlosion', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(158, 'Totodile', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(159, 'Croconaw', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(160, 'Feraligatr', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(161, 'Sentret', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(162, 'Furret', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(163, 'Hoothoot', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(164, 'Noctowl', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(165, 'Ledyba', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(165, 'Ledyba', 'Female', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(166, 'Ledian', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(166, 'Ledian', 'Female', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(167, 'Spinarak', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(168, 'Ariados', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(169, 'Crobat', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(170, 'Chinchou', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(171, 'Lanturn', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(172, 'Pichu', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(173, 'Cleffa', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(174, 'Igglybuff', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(175, 'Togepi', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(176, 'Togetic', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(177, 'Natu', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(178, 'Xatu', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(178, 'Xatu', 'Female', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(179, 'Mareep', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(180, 'Flaaffy', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(181, 'Ampharos', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(182, 'Bellossom', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(183, 'Marill', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(184, 'Azumarill', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(185, 'Sudowoodo', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(185, 'Sudowoodo', 'Female', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(186, 'Politoed', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(186, 'Politoed', 'Female', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(187, 'Hoppip', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(188, 'Skiploom', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(189, 'Jumpluff', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(190, 'Aipom', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(190, 'Aipom', 'Female', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(191, 'Sunkern', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(192, 'Sunflora', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(193, 'Yanma', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(194, 'Wooper', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(194, 'Wooper', 'Female', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(195, 'Quagsire', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(195, 'Quagsire', 'Female', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(196, 'Espeon', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(197, 'Umbreon', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(198, 'Murkrow', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(198, 'Murkrow', 'Female', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(199, 'Slowking', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(200, 'Misdreavus', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(201, 'Unown', 'A', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(201, 'Unown', 'B', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(201, 'Unown', 'C', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(201, 'Unown', 'D', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(201, 'Unown', 'E', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(201, 'Unown', 'F', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(201, 'Unown', 'G', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(201, 'Unown', 'H', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(201, 'Unown', 'I', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(201, 'Unown', 'J', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(201, 'Unown', 'K', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(201, 'Unown', 'L', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(201, 'Unown', 'M', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(201, 'Unown', 'N', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(201, 'Unown', 'O', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(201, 'Unown', 'P', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(201, 'Unown', 'Q', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(201, 'Unown', 'R', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(201, 'Unown', 'S', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(201, 'Unown', 'T', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(201, 'Unown', 'U', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(201, 'Unown', 'V', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(201, 'Unown', 'W', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(201, 'Unown', 'X', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(201, 'Unown', 'Y', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(201, 'Unown', 'Z', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(201, 'Unown', '!', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(201, 'Unown', '?', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(202, 'Wobbuffet', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(202, 'Wobbuffet', 'Female', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(203, 'Girafarig', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(203, 'Girafarig', 'Female', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(204, 'Pineco', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(205, 'Forretress', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(206, 'Dunsparce', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(207, 'Gligar', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(207, 'Gligar', 'Female', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(208, 'Steelix', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(208, 'Steelix', 'Female', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(209, 'Snubbull', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(210, 'Granbull', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(211, 'Qwilfish', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(212, 'Scizor', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(212, 'Scizor', 'Female', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(213, 'Shuckle', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(214, 'Heracross', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(214, 'Heracross', 'Female', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(215, 'Sneasel', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(215, 'Sneasel', 'Female', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(216, 'Teddiursa', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(217, 'Ursaring', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(217, 'Ursaring', 'Female', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(218, 'Slugma', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(219, 'Magcargo', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(220, 'Swinub', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(221, 'Piloswine', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(221, 'Piloswine', 'Female', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(222, 'Corsola', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(223, 'Remoraid', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(224, 'Octillery', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(224, 'Octillery', 'Female', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(225, 'Delibird', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(226, 'Mantine', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(227, 'Skarmory', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(228, 'Houndour', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(229, 'Houndoom', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(229, 'Houndoom', 'Female', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(230, 'Kingdra', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(231, 'Phanpy', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(232, 'Donphan', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(232, 'Donphan', 'Female', false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(233, 'Porygon2', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(234, 'Stantler', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(235, 'Smeargle', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(236, 'Tyrogue', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(237, 'Hitmontop', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(238, 'Smoochum', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(239, 'Elekid', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(240, 'Magby', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(241, 'Miltank', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(242, 'Blissey', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(243, 'Raikou', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(244, 'Entei', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(245, 'Suicune', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(246, 'Larvitar', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(247, 'Pupitar', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(248, 'Tyranitar', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(249, 'Lugia', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(250, 'Ho-Oh', NULL, false, 'Johto', ARRAY['Gold', 'Silver', 'Crystal', 'HeartGold', 'SoulSilver']), +(251, 'Celebi', NULL, false, 'Johto', ARRAY['Crystal', 'HeartGold', 'SoulSilver']) +ON CONFLICT ON CONSTRAINT unique_pokemon_form DO NOTHING; + +-- Insert Johto regional dex numbers +INSERT INTO regional_dex_numbers ( + pokedex_entry_id, + region, + dex_number +) VALUES + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 152 AND form IS NULL), 'Johto', 1), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 153 AND form IS NULL), 'Johto', 2), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 154 AND form IS NULL), 'Johto', 3), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 155 AND form IS NULL), 'Johto', 4), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 156 AND form IS NULL), 'Johto', 5), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 157 AND form IS NULL), 'Johto', 6), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 158 AND form IS NULL), 'Johto', 7), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 159 AND form IS NULL), 'Johto', 8), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 160 AND form IS NULL), 'Johto', 9), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 161 AND form IS NULL), 'Johto', 10), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 162 AND form IS NULL), 'Johto', 11), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 163 AND form IS NULL), 'Johto', 12), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 164 AND form IS NULL), 'Johto', 13), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 165 AND form IS NULL), 'Johto', 14), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 166 AND form IS NULL), 'Johto', 15), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 167 AND form IS NULL), 'Johto', 16), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 168 AND form IS NULL), 'Johto', 17), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 169 AND form IS NULL), 'Johto', 18), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 170 AND form IS NULL), 'Johto', 19), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 171 AND form IS NULL), 'Johto', 20), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 172 AND form IS NULL), 'Johto', 21), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 173 AND form IS NULL), 'Johto', 22), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 174 AND form IS NULL), 'Johto', 23), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 175 AND form IS NULL), 'Johto', 24), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 176 AND form IS NULL), 'Johto', 25), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 177 AND form IS NULL), 'Johto', 26), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 178 AND form IS NULL), 'Johto', 27), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 179 AND form IS NULL), 'Johto', 28), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 180 AND form IS NULL), 'Johto', 29), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 181 AND form IS NULL), 'Johto', 30), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 182 AND form IS NULL), 'Johto', 31), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 183 AND form IS NULL), 'Johto', 32), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 184 AND form IS NULL), 'Johto', 33), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 185 AND form IS NULL), 'Johto', 34), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 186 AND form IS NULL), 'Johto', 35), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 187 AND form IS NULL), 'Johto', 36), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 188 AND form IS NULL), 'Johto', 37), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 189 AND form IS NULL), 'Johto', 38), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 190 AND form IS NULL), 'Johto', 39), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 191 AND form IS NULL), 'Johto', 40), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 192 AND form IS NULL), 'Johto', 41), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 193 AND form IS NULL), 'Johto', 42), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 194 AND form IS NULL), 'Johto', 43), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 195 AND form IS NULL), 'Johto', 44), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 196 AND form IS NULL), 'Johto', 45), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 197 AND form IS NULL), 'Johto', 46), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 198 AND form IS NULL), 'Johto', 47), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 199 AND form IS NULL), 'Johto', 48), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 200 AND form IS NULL), 'Johto', 49), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 201 AND form = 'A'), 'Johto', 50), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 202 AND form IS NULL), 'Johto', 51), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 203 AND form IS NULL), 'Johto', 52), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 204 AND form IS NULL), 'Johto', 53), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 205 AND form IS NULL), 'Johto', 54), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 206 AND form IS NULL), 'Johto', 55), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 207 AND form IS NULL), 'Johto', 56), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 208 AND form IS NULL), 'Johto', 57), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 209 AND form IS NULL), 'Johto', 58), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 210 AND form IS NULL), 'Johto', 59), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 211 AND form IS NULL), 'Johto', 60), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 212 AND form IS NULL), 'Johto', 61), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 213 AND form IS NULL), 'Johto', 62), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 214 AND form IS NULL), 'Johto', 63), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 215 AND form IS NULL), 'Johto', 64), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 216 AND form IS NULL), 'Johto', 65), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 217 AND form IS NULL), 'Johto', 66), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 218 AND form IS NULL), 'Johto', 67), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 219 AND form IS NULL), 'Johto', 68), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 220 AND form IS NULL), 'Johto', 69), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 221 AND form IS NULL), 'Johto', 70), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 222 AND form IS NULL), 'Johto', 71), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 223 AND form IS NULL), 'Johto', 72), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 224 AND form IS NULL), 'Johto', 73), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 225 AND form IS NULL), 'Johto', 74), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 226 AND form IS NULL), 'Johto', 75), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 227 AND form IS NULL), 'Johto', 76), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 228 AND form IS NULL), 'Johto', 77), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 229 AND form IS NULL), 'Johto', 78), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 230 AND form IS NULL), 'Johto', 79), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 231 AND form IS NULL), 'Johto', 80), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 232 AND form IS NULL), 'Johto', 81), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 233 AND form IS NULL), 'Johto', 82), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 234 AND form IS NULL), 'Johto', 83), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 235 AND form IS NULL), 'Johto', 84), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 236 AND form IS NULL), 'Johto', 85), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 237 AND form IS NULL), 'Johto', 86), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 238 AND form IS NULL), 'Johto', 87), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 239 AND form IS NULL), 'Johto', 88), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 240 AND form IS NULL), 'Johto', 89), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 241 AND form IS NULL), 'Johto', 90), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 242 AND form IS NULL), 'Johto', 91), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 243 AND form IS NULL), 'Johto', 92), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 244 AND form IS NULL), 'Johto', 93), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 245 AND form IS NULL), 'Johto', 94), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 246 AND form IS NULL), 'Johto', 95), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 247 AND form IS NULL), 'Johto', 96), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 248 AND form IS NULL), 'Johto', 97), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 249 AND form IS NULL), 'Johto', 98), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 250 AND form IS NULL), 'Johto', 99), + ((SELECT id FROM pokedex_entries WHERE "pokedexNumber" = 251 AND form IS NULL), 'Johto', 100); + +-- Add metadata +INSERT INTO metadata (key, value) VALUES + ('johto_seeded', 'true'), + ('johto_seed_date', NOW()::TEXT), + ('johto_pokemon_count', '99');