Add Pokemon form support to seeding (Alolan, regional variants, etc.)

Pokemon forms with dex IDs >= 10000 (e.g., Alolan Rattata = 10091) were
being collected in encounter data but missing from pokemon.json, causing
them to be silently dropped during DB seeding. Now fetch_all_pokemon()
also fetches form entries that appear in encounter data, with clean
display names like "Rattata (Alola)" and correct form-specific types.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-07 14:32:13 +01:00
parent 5edda2dba9
commit 9cec9836b4
4 changed files with 420 additions and 80 deletions

View File

@@ -85,71 +85,9 @@
}
]
},
{
"name": "Eterna City",
"order": 2,
"encounters": [
{
"national_dex": 129,
"pokemon_name": "magikarp",
"method": "old-rod",
"encounter_rate": 100,
"min_level": 3,
"max_level": 15
},
{
"national_dex": 54,
"pokemon_name": "psyduck",
"method": "surf",
"encounter_rate": 90,
"min_level": 20,
"max_level": 30
},
{
"national_dex": 130,
"pokemon_name": "gyarados",
"method": "super-rod",
"encounter_rate": 55,
"min_level": 30,
"max_level": 55
},
{
"national_dex": 129,
"pokemon_name": "magikarp",
"method": "good-rod",
"encounter_rate": 55,
"min_level": 10,
"max_level": 25
},
{
"national_dex": 339,
"pokemon_name": "barboach",
"method": "good-rod",
"encounter_rate": 45,
"min_level": 10,
"max_level": 25
},
{
"national_dex": 340,
"pokemon_name": "whiscash",
"method": "super-rod",
"encounter_rate": 45,
"min_level": 30,
"max_level": 55
},
{
"national_dex": 55,
"pokemon_name": "golduck",
"method": "surf",
"encounter_rate": 10,
"min_level": 20,
"max_level": 40
}
]
},
{
"name": "Pastoria City",
"order": 3,
"order": 2,
"encounters": [
{
"national_dex": 129,
@@ -235,7 +173,7 @@
},
{
"name": "Sunyshore City",
"order": 4,
"order": 3,
"encounters": [
{
"national_dex": 129,
@@ -321,7 +259,7 @@
},
{
"name": "Pokemon League",
"order": 5,
"order": 4,
"encounters": [
{
"national_dex": 129,
@@ -399,12 +337,12 @@
},
{
"name": "Oreburgh Mine",
"order": 6,
"order": 5,
"encounters": [],
"children": [
{
"name": "Oreburgh Mine (1F)",
"order": 7,
"order": 6,
"encounters": [
{
"national_dex": 74,
@@ -434,7 +372,7 @@
},
{
"name": "Oreburgh Mine (B1F)",
"order": 8,
"order": 7,
"encounters": [
{
"national_dex": 74,
@@ -466,7 +404,7 @@
},
{
"name": "Valley Windworks",
"order": 9,
"order": 8,
"encounters": [
{
"national_dex": 129,
@@ -600,7 +538,7 @@
},
{
"name": "Eterna Forest",
"order": 10,
"order": 9,
"encounters": [
{
"national_dex": 406,
@@ -756,6 +694,68 @@
}
]
},
{
"name": "Eterna City",
"order": 10,
"encounters": [
{
"national_dex": 129,
"pokemon_name": "magikarp",
"method": "old-rod",
"encounter_rate": 100,
"min_level": 3,
"max_level": 15
},
{
"national_dex": 54,
"pokemon_name": "psyduck",
"method": "surf",
"encounter_rate": 90,
"min_level": 20,
"max_level": 30
},
{
"national_dex": 130,
"pokemon_name": "gyarados",
"method": "super-rod",
"encounter_rate": 55,
"min_level": 30,
"max_level": 55
},
{
"national_dex": 129,
"pokemon_name": "magikarp",
"method": "good-rod",
"encounter_rate": 55,
"min_level": 10,
"max_level": 25
},
{
"national_dex": 339,
"pokemon_name": "barboach",
"method": "good-rod",
"encounter_rate": 45,
"min_level": 10,
"max_level": 25
},
{
"national_dex": 340,
"pokemon_name": "whiscash",
"method": "super-rod",
"encounter_rate": 45,
"min_level": 30,
"max_level": 55
},
{
"national_dex": 55,
"pokemon_name": "golduck",
"method": "surf",
"encounter_rate": 10,
"min_level": 20,
"max_level": 40
}
]
},
{
"name": "Fuego Ironworks",
"order": 11,

View File

@@ -8724,5 +8724,145 @@
"ghost"
],
"sprite_url": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/1025.png"
},
{
"national_dex": 10016,
"name": "Basculin (Blue Striped)",
"types": [
"water"
],
"sprite_url": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/10016.png"
},
{
"national_dex": 10091,
"name": "Rattata (Alola)",
"types": [
"dark",
"normal"
],
"sprite_url": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/10091.png"
},
{
"national_dex": 10092,
"name": "Raticate (Alola)",
"types": [
"dark",
"normal"
],
"sprite_url": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/10092.png"
},
{
"national_dex": 10101,
"name": "Sandshrew (Alola)",
"types": [
"ice",
"steel"
],
"sprite_url": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/10101.png"
},
{
"national_dex": 10103,
"name": "Vulpix (Alola)",
"types": [
"ice"
],
"sprite_url": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/10103.png"
},
{
"national_dex": 10105,
"name": "Diglett (Alola)",
"types": [
"ground",
"steel"
],
"sprite_url": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/10105.png"
},
{
"national_dex": 10106,
"name": "Dugtrio (Alola)",
"types": [
"ground",
"steel"
],
"sprite_url": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/10106.png"
},
{
"national_dex": 10107,
"name": "Meowth (Alola)",
"types": [
"dark"
],
"sprite_url": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/10107.png"
},
{
"national_dex": 10109,
"name": "Geodude (Alola)",
"types": [
"rock",
"electric"
],
"sprite_url": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/10109.png"
},
{
"national_dex": 10110,
"name": "Graveler (Alola)",
"types": [
"rock",
"electric"
],
"sprite_url": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/10110.png"
},
{
"national_dex": 10112,
"name": "Grimer (Alola)",
"types": [
"poison",
"dark"
],
"sprite_url": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/10112.png"
},
{
"national_dex": 10114,
"name": "Exeggutor (Alola)",
"types": [
"grass",
"dragon"
],
"sprite_url": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/10114.png"
},
{
"national_dex": 10123,
"name": "Oricorio (Pom Pom)",
"types": [
"electric",
"flying"
],
"sprite_url": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/10123.png"
},
{
"national_dex": 10124,
"name": "Oricorio (Pau)",
"types": [
"psychic",
"flying"
],
"sprite_url": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/10124.png"
},
{
"national_dex": 10125,
"name": "Oricorio (Sensu)",
"types": [
"ghost",
"flying"
],
"sprite_url": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/10125.png"
},
{
"national_dex": 10126,
"name": "Lycanroc (Midnight)",
"types": [
"rock"
],
"sprite_url": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/10126.png"
}
]