Download badge and boss sprite images locally during export

The seed export command now downloads badge images and boss sprites
from remote URLs and stores them in frontend/public/, rewriting the
JSON URLs to local paths. Sprites are namespaced by game version
(e.g. /boss-sprites/red/brock.png) so each generation can have
its own sprite style.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-08 22:13:30 +01:00
parent d2144e47bf
commit 8bd4ad1ecf
126 changed files with 3948 additions and 194 deletions

View File

@@ -4,13 +4,13 @@
"boss_type": "gym_leader",
"specialty_type": "rock",
"badge_name": "Boulder Badge",
"badge_image_url": "https://archives.bulbagarden.net/media/upload/thumb/d/dd/Boulder_Badge.png/35px-Boulder_Badge.png",
"badge_image_url": "/badges/boulder-badge.png",
"level_cap": 14,
"order": 1,
"after_route_name": "Route 2 (South Towards Viridian City)",
"location": "Pewter Gym",
"section": null,
"sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/d/dd/Boulder_Badge.png/35px-Boulder_Badge.png",
"sprite_url": "/boss-sprites/red/brock.png",
"pokemon": []
},
{
@@ -18,13 +18,13 @@
"boss_type": "gym_leader",
"specialty_type": "water",
"badge_name": "Cascade Badge",
"badge_image_url": "https://archives.bulbagarden.net/media/upload/thumb/9/9c/Cascade_Badge.png/35px-Cascade_Badge.png",
"badge_image_url": "/badges/cascade-badge.png",
"level_cap": 21,
"order": 2,
"after_route_name": "Cerulean City",
"location": "Cerulean Gem",
"section": null,
"sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/9/9c/Cascade_Badge.png/35px-Cascade_Badge.png",
"sprite_url": "/boss-sprites/red/misty.png",
"pokemon": []
},
{
@@ -32,13 +32,13 @@
"boss_type": "gym_leader",
"specialty_type": "electric",
"badge_name": "Thunder Badge",
"badge_image_url": "https://archives.bulbagarden.net/media/upload/thumb/a/a6/Thunder_Badge.png/35px-Thunder_Badge.png",
"badge_image_url": "/badges/thunder-badge.png",
"level_cap": 24,
"order": 3,
"after_route_name": "Vermilion City",
"location": "Vermillion Gym",
"section": null,
"sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/a/a6/Thunder_Badge.png/35px-Thunder_Badge.png",
"sprite_url": "/boss-sprites/red/lt-surge.png",
"pokemon": []
},
{
@@ -46,13 +46,13 @@
"boss_type": "gym_leader",
"specialty_type": "grass",
"badge_name": "Rainbow Badge",
"badge_image_url": "https://archives.bulbagarden.net/media/upload/thumb/b/b5/Rainbow_Badge.png/35px-Rainbow_Badge.png",
"badge_image_url": "/badges/rainbow-badge.png",
"level_cap": 29,
"order": 4,
"after_route_name": "Celadon City",
"location": "Celadon Gym",
"section": null,
"sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/b/b5/Rainbow_Badge.png/35px-Rainbow_Badge.png",
"sprite_url": "/boss-sprites/red/erika.png",
"pokemon": []
},
{
@@ -60,13 +60,13 @@
"boss_type": "gym_leader",
"specialty_type": "psychic",
"badge_name": "Marsh Badge",
"badge_image_url": "https://archives.bulbagarden.net/media/upload/thumb/6/6b/Marsh_Badge.png/35px-Marsh_Badge.png",
"badge_image_url": "/badges/marsh-badge.png",
"level_cap": 43,
"order": 5,
"after_route_name": "Saffron City",
"location": "Saffron Gym",
"section": null,
"sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/6/6b/Marsh_Badge.png/35px-Marsh_Badge.png",
"sprite_url": "/boss-sprites/red/sabrina.png",
"pokemon": []
},
{
@@ -74,13 +74,13 @@
"boss_type": "gym_leader",
"specialty_type": "poison",
"badge_name": "Soul Badge",
"badge_image_url": "https://archives.bulbagarden.net/media/upload/thumb/7/7d/Soul_Badge.png/35px-Soul_Badge.png",
"badge_image_url": "/badges/soul-badge.png",
"level_cap": 43,
"order": 6,
"after_route_name": "Fuchsia City",
"location": "Fuchsia Gym",
"section": null,
"sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/7/7d/Soul_Badge.png/35px-Soul_Badge.png",
"sprite_url": "/boss-sprites/red/koga.png",
"pokemon": []
},
{
@@ -88,13 +88,13 @@
"boss_type": "gym_leader",
"specialty_type": "fire",
"badge_name": "Volcano Badge",
"badge_image_url": "https://archives.bulbagarden.net/media/upload/thumb/1/12/Volcano_Badge.png/35px-Volcano_Badge.png",
"badge_image_url": "/badges/volcano-badge.png",
"level_cap": 47,
"order": 7,
"after_route_name": "Cinnabar Island",
"location": "Cinnabar Gym",
"section": null,
"sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/1/12/Volcano_Badge.png/35px-Volcano_Badge.png",
"sprite_url": "/boss-sprites/red/blaine.png",
"pokemon": []
},
{
@@ -102,13 +102,13 @@
"boss_type": "gym_leader",
"specialty_type": "ground",
"badge_name": "Earth Badge",
"badge_image_url": "https://archives.bulbagarden.net/media/upload/thumb/7/78/Earth_Badge.png/35px-Earth_Badge.png",
"badge_image_url": "/badges/earth-badge.png",
"level_cap": 50,
"order": 8,
"after_route_name": null,
"location": "Viridian Gym",
"section": null,
"sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/7/78/Earth_Badge.png/35px-Earth_Badge.png",
"sprite_url": "/boss-sprites/red/giovanni.png",
"pokemon": []
},
{