diff --git a/.beans/nuzlocke-tracker-sgp4--fetch-and-store-badge-images-locally.md b/.beans/nuzlocke-tracker-sgp4--fetch-and-store-badge-images-locally.md
index fc25ad8..8d744cd 100644
--- a/.beans/nuzlocke-tracker-sgp4--fetch-and-store-badge-images-locally.md
+++ b/.beans/nuzlocke-tracker-sgp4--fetch-and-store-badge-images-locally.md
@@ -1,10 +1,11 @@
---
# nuzlocke-tracker-sgp4
title: Fetch and store badge images locally
-status: todo
+status: in-progress
type: task
+priority: normal
created_at: 2026-02-08T20:57:15Z
-updated_at: 2026-02-08T20:57:15Z
+updated_at: 2026-02-08T20:57:41Z
---
Badge images are currently loaded via remote URLs, which can lead to missing images if the remote source is unavailable. Download all badge images and store them locally as part of the seed script's export function.
diff --git a/backend/src/app/seeds/data/crystal-bosses.json b/backend/src/app/seeds/data/crystal-bosses.json
index b5939d1..8cbff6a 100644
--- a/backend/src/app/seeds/data/crystal-bosses.json
+++ b/backend/src/app/seeds/data/crystal-bosses.json
@@ -4,13 +4,13 @@
"boss_type": "gym_leader",
"specialty_type": "flying",
"badge_name": "Zephyr Badge",
- "badge_image_url": "https://archives.bulbagarden.net/media/upload/thumb/4/4a/Zephyr_Badge.png/35px-Zephyr_Badge.png",
+ "badge_image_url": "/badges/zephyr-badge.png",
"level_cap": 9,
"order": 1,
"after_route_name": "Violet City",
"location": "Violet Gym",
"section": "Main Story",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/4/4a/Zephyr_Badge.png/35px-Zephyr_Badge.png",
+ "sprite_url": "/boss-sprites/crystal/falkner.png",
"pokemon": []
},
{
@@ -18,13 +18,13 @@
"boss_type": "gym_leader",
"specialty_type": "bug",
"badge_name": "Hive Badge",
- "badge_image_url": "https://github.com/PokeAPI/sprites/blob/master/sprites/badges/10.png?raw=true",
+ "badge_image_url": "/badges/hive-badge.png",
"level_cap": 16,
"order": 2,
"after_route_name": "Slowpoke Well",
"location": "Azalea Gym",
"section": "Main Story",
- "sprite_url": "https://github.com/PokeAPI/sprites/blob/master/sprites/badges/10.png?raw=true",
+ "sprite_url": "/boss-sprites/crystal/bugsy.png",
"pokemon": []
},
{
@@ -32,13 +32,13 @@
"boss_type": "gym_leader",
"specialty_type": "normal",
"badge_name": "Plain Badge",
- "badge_image_url": "https://github.com/PokeAPI/sprites/blob/master/sprites/badges/11.png?raw=true",
+ "badge_image_url": "/badges/plain-badge.png",
"level_cap": 20,
"order": 3,
"after_route_name": "Goldenrod City",
"location": "Goldenrod Gym",
"section": "Main Story",
- "sprite_url": "https://github.com/PokeAPI/sprites/blob/master/sprites/badges/11.png?raw=true",
+ "sprite_url": "/boss-sprites/crystal/whitney.png",
"pokemon": []
},
{
@@ -46,13 +46,13 @@
"boss_type": "gym_leader",
"specialty_type": "ghost",
"badge_name": "Fog Badge",
- "badge_image_url": "https://github.com/PokeAPI/sprites/blob/master/sprites/badges/12.png?raw=true",
+ "badge_image_url": "/badges/fog-badge.png",
"level_cap": 25,
"order": 4,
"after_route_name": null,
"location": "Ecruteak Gym",
"section": "Main Story",
- "sprite_url": "https://github.com/PokeAPI/sprites/blob/master/sprites/badges/12.png?raw=true",
+ "sprite_url": "/boss-sprites/crystal/morty.png",
"pokemon": []
},
{
@@ -60,13 +60,13 @@
"boss_type": "gym_leader",
"specialty_type": "fighting",
"badge_name": "Storm Badge",
- "badge_image_url": "https://github.com/PokeAPI/sprites/blob/master/sprites/badges/13.png?raw=true",
+ "badge_image_url": "/badges/storm-badge.png",
"level_cap": 30,
"order": 5,
"after_route_name": "Cianwood City",
"location": "Cianwood Gym",
"section": "Main Story",
- "sprite_url": "https://github.com/PokeAPI/sprites/blob/master/sprites/badges/13.png?raw=true",
+ "sprite_url": "/boss-sprites/crystal/chuck.png",
"pokemon": []
},
{
@@ -74,13 +74,13 @@
"boss_type": "gym_leader",
"specialty_type": "steel",
"badge_name": "Mineral Badge",
- "badge_image_url": "https://github.com/PokeAPI/sprites/blob/master/sprites/badges/14.png?raw=true",
+ "badge_image_url": "/badges/mineral-badge.png",
"level_cap": 35,
"order": 6,
"after_route_name": "Cianwood City",
"location": "Olivine Gym",
"section": "Main Story",
- "sprite_url": "https://github.com/PokeAPI/sprites/blob/master/sprites/badges/14.png?raw=true",
+ "sprite_url": "/boss-sprites/crystal/jasmine.png",
"pokemon": []
},
{
@@ -88,13 +88,13 @@
"boss_type": "gym_leader",
"specialty_type": "ice",
"badge_name": "Glacier Badge",
- "badge_image_url": "https://github.com/PokeAPI/sprites/blob/master/sprites/badges/15.png?raw=true",
+ "badge_image_url": "/badges/glacier-badge.png",
"level_cap": 31,
"order": 7,
"after_route_name": "Lake Of Rage",
"location": "Mahogany Gym",
"section": "Main Story",
- "sprite_url": "https://github.com/PokeAPI/sprites/blob/master/sprites/badges/15.png?raw=true",
+ "sprite_url": "/boss-sprites/crystal/pryce.png",
"pokemon": []
},
{
@@ -102,13 +102,13 @@
"boss_type": "gym_leader",
"specialty_type": "dragon",
"badge_name": "Rising Badge",
- "badge_image_url": "https://archives.bulbagarden.net/media/upload/thumb/5/58/Rising_Badge.png/35px-Rising_Badge.png",
+ "badge_image_url": "/badges/rising-badge.png",
"level_cap": 40,
"order": 8,
"after_route_name": "Blackthorn City",
"location": "Blackthorn Gym",
"section": "Main Story",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/5/58/Rising_Badge.png/35px-Rising_Badge.png",
+ "sprite_url": "/boss-sprites/crystal/clair.png",
"pokemon": []
},
{
@@ -186,13 +186,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": 46,
"order": 14,
"after_route_name": "Vermilion City",
"location": "Vermilion Gym",
"section": "Endgame",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/a/a6/Thunder_Badge.png/35px-Thunder_Badge.png",
+ "sprite_url": "/boss-sprites/crystal/lt-surge.png",
"pokemon": []
},
{
@@ -200,13 +200,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": 48,
"order": 15,
"after_route_name": "Route 6",
"location": "Saffron Gym",
"section": "Endgame",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/6/6b/Marsh_Badge.png/35px-Marsh_Badge.png",
+ "sprite_url": "/boss-sprites/crystal/sabrina.png",
"pokemon": []
},
{
@@ -214,13 +214,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": 47,
"order": 16,
"after_route_name": "Cerulean City",
"location": "Cerulean Gym",
"section": "Endgame",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/9/9c/Cascade_Badge.png/35px-Cascade_Badge.png",
+ "sprite_url": "/boss-sprites/crystal/misty.png",
"pokemon": []
},
{
@@ -228,13 +228,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": 46,
"order": 17,
"after_route_name": "Route 7",
"location": "Celadon Gym",
"section": "Endgame",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/b/b5/Rainbow_Badge.png/35px-Rainbow_Badge.png",
+ "sprite_url": "/boss-sprites/crystal/erika.png",
"pokemon": []
},
{
@@ -242,13 +242,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": 39,
"order": 18,
"after_route_name": "Fuchsia City",
"location": "Fuchsia Gym",
"section": "Endgame",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/7/7d/Soul_Badge.png/35px-Soul_Badge.png",
+ "sprite_url": "/boss-sprites/crystal/janine.png",
"pokemon": []
},
{
@@ -256,13 +256,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": 44,
"order": 19,
"after_route_name": "Pewter City",
"location": "Pewter Gym",
"section": "Endgame",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/d/dd/Boulder_Badge.png/35px-Boulder_Badge.png",
+ "sprite_url": "/boss-sprites/crystal/brock.png",
"pokemon": []
},
{
@@ -270,13 +270,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": 50,
"order": 20,
"after_route_name": "Cinnabar Island",
"location": "Cinnabar Gym",
"section": "Endgame",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/1/12/Volcano_Badge.png/35px-Volcano_Badge.png",
+ "sprite_url": "/boss-sprites/crystal/blaine.png",
"pokemon": []
},
{
@@ -284,13 +284,13 @@
"boss_type": "gym_leader",
"specialty_type": null,
"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": 58,
"order": 21,
"after_route_name": null,
"location": "Viridian Gym",
"section": "Endgame",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/7/78/Earth_Badge.png/35px-Earth_Badge.png",
+ "sprite_url": "/boss-sprites/crystal/blue.png",
"pokemon": []
},
{
diff --git a/backend/src/app/seeds/data/diamond-bosses.json b/backend/src/app/seeds/data/diamond-bosses.json
index ad76a5a..1e32416 100644
--- a/backend/src/app/seeds/data/diamond-bosses.json
+++ b/backend/src/app/seeds/data/diamond-bosses.json
@@ -4,13 +4,13 @@
"boss_type": "gym_leader",
"specialty_type": "rock",
"badge_name": "Coal Badge",
- "badge_image_url": "https://archives.bulbagarden.net/media/upload/thumb/0/0b/Coal_Badge.png/35px-Coal_Badge.png",
+ "badge_image_url": "/badges/coal-badge.png",
"level_cap": 14,
"order": 1,
"after_route_name": "Oreburgh Mine",
"location": "Oreburgh Gym",
"section": "Main Story",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/0/0b/Coal_Badge.png/35px-Coal_Badge.png",
+ "sprite_url": "/boss-sprites/diamond/roark.png",
"pokemon": []
}
]
diff --git a/backend/src/app/seeds/data/emerald-bosses.json b/backend/src/app/seeds/data/emerald-bosses.json
index 2311b5a..1836b2d 100644
--- a/backend/src/app/seeds/data/emerald-bosses.json
+++ b/backend/src/app/seeds/data/emerald-bosses.json
@@ -4,13 +4,13 @@
"boss_type": "gym_leader",
"specialty_type": "rock",
"badge_name": "Stone Badge",
- "badge_image_url": "https://archives.bulbagarden.net/media/upload/thumb/6/63/Stone_Badge.png/35px-Stone_Badge.png",
+ "badge_image_url": "/badges/stone-badge.png",
"level_cap": 15,
"order": 1,
"after_route_name": null,
"location": "Rustboro Gym",
"section": "Main Story",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/6/63/Stone_Badge.png/35px-Stone_Badge.png",
+ "sprite_url": "/boss-sprites/emerald/roxanne.png",
"pokemon": []
},
{
@@ -18,13 +18,13 @@
"boss_type": "gym_leader",
"specialty_type": "fighting",
"badge_name": "Knuckle Badge",
- "badge_image_url": "https://archives.bulbagarden.net/media/upload/thumb/9/97/Knuckle_Badge.png/35px-Knuckle_Badge.png",
+ "badge_image_url": "/badges/knuckle-badge.png",
"level_cap": 19,
"order": 2,
"after_route_name": null,
"location": "Dewford Gym",
"section": "Main Story",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/9/97/Knuckle_Badge.png/35px-Knuckle_Badge.png",
+ "sprite_url": "/boss-sprites/emerald/brawly.png",
"pokemon": []
},
{
@@ -32,13 +32,13 @@
"boss_type": "gym_leader",
"specialty_type": "electric",
"badge_name": "Dynamo Badge",
- "badge_image_url": "https://archives.bulbagarden.net/media/upload/thumb/3/34/Dynamo_Badge.png/35px-Dynamo_Badge.png",
+ "badge_image_url": "/badges/dynamo-badge.png",
"level_cap": 24,
"order": 3,
"after_route_name": null,
"location": "Mauville Gym",
"section": "Main Story",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/3/34/Dynamo_Badge.png/35px-Dynamo_Badge.png",
+ "sprite_url": "/boss-sprites/emerald/wattson.png",
"pokemon": []
},
{
@@ -46,13 +46,13 @@
"boss_type": "gym_leader",
"specialty_type": "fire",
"badge_name": "Heat Badge",
- "badge_image_url": "https://archives.bulbagarden.net/media/upload/thumb/c/c4/Heat_Badge.png/35px-Heat_Badge.png",
+ "badge_image_url": "/badges/heat-badge.png",
"level_cap": 29,
"order": 4,
"after_route_name": null,
"location": "Lavaridge Gym",
"section": "Main Story",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/c/c4/Heat_Badge.png/35px-Heat_Badge.png",
+ "sprite_url": "/boss-sprites/emerald/flannery.png",
"pokemon": []
},
{
@@ -60,13 +60,13 @@
"boss_type": "gym_leader",
"specialty_type": "normal",
"badge_name": "Balance Badge",
- "badge_image_url": "https://archives.bulbagarden.net/media/upload/thumb/6/63/Balance_Badge.png/35px-Balance_Badge.png",
+ "badge_image_url": "/badges/balance-badge.png",
"level_cap": 31,
"order": 5,
"after_route_name": null,
"location": "Petalburg Gym",
"section": "Main Story",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/6/63/Balance_Badge.png/35px-Balance_Badge.png",
+ "sprite_url": "/boss-sprites/emerald/norman.png",
"pokemon": []
},
{
@@ -74,13 +74,13 @@
"boss_type": "gym_leader",
"specialty_type": "flying",
"badge_name": "Feather Badge",
- "badge_image_url": "https://archives.bulbagarden.net/media/upload/thumb/6/62/Feather_Badge.png/35px-Feather_Badge.png",
+ "badge_image_url": "/badges/feather-badge.png",
"level_cap": 33,
"order": 6,
"after_route_name": null,
"location": "Foretree Gym",
"section": "Main Story",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/6/62/Feather_Badge.png/35px-Feather_Badge.png",
+ "sprite_url": "/boss-sprites/emerald/winona.png",
"pokemon": []
},
{
@@ -88,13 +88,13 @@
"boss_type": "gym_leader",
"specialty_type": "psychic",
"badge_name": "Mind Badge",
- "badge_image_url": "https://archives.bulbagarden.net/media/upload/thumb/c/cc/Mind_Badge.png/35px-Mind_Badge.png",
+ "badge_image_url": "/badges/mind-badge.png",
"level_cap": 42,
"order": 7,
"after_route_name": null,
"location": "Mossdeep Gym",
"section": "Main Story",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/c/cc/Mind_Badge.png/35px-Mind_Badge.png",
+ "sprite_url": "/boss-sprites/emerald/tate--lisa.png",
"pokemon": []
},
{
@@ -102,13 +102,13 @@
"boss_type": "gym_leader",
"specialty_type": "water",
"badge_name": "Rain Badge",
- "badge_image_url": "https://archives.bulbagarden.net/media/upload/thumb/9/9b/Rain_Badge.png/35px-Rain_Badge.png",
+ "badge_image_url": "/badges/rain-badge.png",
"level_cap": 46,
"order": 8,
"after_route_name": null,
"location": "Sootopolis Gym",
"section": "Main Story",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/9/9b/Rain_Badge.png/35px-Rain_Badge.png",
+ "sprite_url": "/boss-sprites/emerald/wallace.png",
"pokemon": []
},
{
diff --git a/backend/src/app/seeds/data/firered-bosses.json b/backend/src/app/seeds/data/firered-bosses.json
index 2e5e10e..c5136a5 100644
--- a/backend/src/app/seeds/data/firered-bosses.json
+++ b/backend/src/app/seeds/data/firered-bosses.json
@@ -4,13 +4,13 @@
"boss_type": "gym_leader",
"specialty_type": null,
"badge_name": "Boulder Badge",
- "badge_image_url": "https://archives.bulbagarden.net/media/upload/thumb/d/dd/Boulder_Badge.png/50px-Boulder_Badge.png",
+ "badge_image_url": "/badges/boulder-badge.png",
"level_cap": 14,
"order": 1,
"after_route_name": null,
"location": "Pewter City Gym",
"section": null,
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/d/dd/Boulder_Badge.png/50px-Boulder_Badge.png",
+ "sprite_url": "/boss-sprites/firered/brock.png",
"pokemon": [
{
"pokeapi_id": 74,
@@ -31,13 +31,13 @@
"boss_type": "gym_leader",
"specialty_type": null,
"badge_name": "Cascade Badge",
- "badge_image_url": "https://archives.bulbagarden.net/media/upload/thumb/9/9c/Cascade_Badge.png/50px-Cascade_Badge.png",
+ "badge_image_url": "/badges/cascade-badge.png",
"level_cap": 21,
"order": 2,
"after_route_name": null,
"location": "Cerulean City Gym",
"section": null,
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/9/9c/Cascade_Badge.png/50px-Cascade_Badge.png",
+ "sprite_url": "/boss-sprites/firered/misty.png",
"pokemon": [
{
"pokeapi_id": 120,
@@ -58,13 +58,13 @@
"boss_type": "gym_leader",
"specialty_type": null,
"badge_name": "Thunder Badge",
- "badge_image_url": "https://archives.bulbagarden.net/media/upload/thumb/a/a6/Thunder_Badge.png/50px-Thunder_Badge.png",
+ "badge_image_url": "/badges/thunder-badge.png",
"level_cap": 24,
"order": 3,
"after_route_name": null,
"location": "Vermillion City Gym",
"section": null,
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/a/a6/Thunder_Badge.png/50px-Thunder_Badge.png",
+ "sprite_url": "/boss-sprites/firered/lt-surge.png",
"pokemon": [
{
"pokeapi_id": 100,
@@ -91,13 +91,13 @@
"boss_type": "gym_leader",
"specialty_type": null,
"badge_name": "Rainbow Badge",
- "badge_image_url": "https://archives.bulbagarden.net/media/upload/thumb/b/b5/Rainbow_Badge.png/50px-Rainbow_Badge.png",
+ "badge_image_url": "/badges/rainbow-badge.png",
"level_cap": 29,
"order": 4,
"after_route_name": null,
"location": "Celadon City Gym",
"section": null,
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/b/b5/Rainbow_Badge.png/50px-Rainbow_Badge.png",
+ "sprite_url": "/boss-sprites/firered/erika.png",
"pokemon": []
},
{
@@ -105,13 +105,13 @@
"boss_type": "gym_leader",
"specialty_type": null,
"badge_name": "Marsh Badge",
- "badge_image_url": "https://archives.bulbagarden.net/media/upload/thumb/6/6b/Marsh_Badge.png/50px-Marsh_Badge.png",
+ "badge_image_url": "/badges/marsh-badge.png",
"level_cap": 43,
"order": 5,
"after_route_name": null,
"location": "Saffron City Gym",
"section": null,
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/6/6b/Marsh_Badge.png/50px-Marsh_Badge.png",
+ "sprite_url": "/boss-sprites/firered/sabrina.png",
"pokemon": []
},
{
@@ -119,13 +119,13 @@
"boss_type": "gym_leader",
"specialty_type": null,
"badge_name": "Soul Badge",
- "badge_image_url": "https://archives.bulbagarden.net/media/upload/thumb/7/7d/Soul_Badge.png/50px-Soul_Badge.png",
+ "badge_image_url": "/badges/soul-badge.png",
"level_cap": 43,
"order": 6,
"after_route_name": null,
"location": "Fuchsia City Gym",
"section": null,
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/7/7d/Soul_Badge.png/50px-Soul_Badge.png",
+ "sprite_url": "/boss-sprites/firered/koga.png",
"pokemon": []
},
{
@@ -133,13 +133,13 @@
"boss_type": "gym_leader",
"specialty_type": null,
"badge_name": "Volcano Badge",
- "badge_image_url": "https://archives.bulbagarden.net/media/upload/thumb/1/12/Volcano_Badge.png/50px-Volcano_Badge.png",
+ "badge_image_url": "/badges/volcano-badge.png",
"level_cap": 47,
"order": 7,
"after_route_name": null,
"location": "Cinnabar Island Gym",
"section": null,
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/1/12/Volcano_Badge.png/50px-Volcano_Badge.png",
+ "sprite_url": "/boss-sprites/firered/blaine.png",
"pokemon": []
},
{
@@ -147,13 +147,13 @@
"boss_type": "gym_leader",
"specialty_type": null,
"badge_name": "50",
- "badge_image_url": "https://archives.bulbagarden.net/media/upload/thumb/7/78/Earth_Badge.png/50px-Earth_Badge.png",
+ "badge_image_url": "/badges/50.png",
"level_cap": 50,
"order": 8,
"after_route_name": null,
"location": "Viridian City Gym",
"section": null,
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/7/78/Earth_Badge.png/50px-Earth_Badge.png",
+ "sprite_url": "/boss-sprites/firered/giovanni.png",
"pokemon": []
},
{
@@ -220,7 +220,7 @@
"badge_image_url": null,
"level_cap": 63,
"order": 13,
- "after_route_name": null,
+ "after_route_name": "Victory Road",
"location": "Indigo Plateau",
"section": null,
"sprite_url": null,
@@ -231,6 +231,24 @@
"level": 59,
"order": 1
},
+ {
+ "pokeapi_id": 6,
+ "pokemon_name": "Charizard",
+ "level": 63,
+ "order": 1
+ },
+ {
+ "pokeapi_id": 3,
+ "pokemon_name": "Venusaur",
+ "level": 63,
+ "order": 1
+ },
+ {
+ "pokeapi_id": 9,
+ "pokemon_name": "Blastoise",
+ "level": 63,
+ "order": 1
+ },
{
"pokeapi_id": 65,
"pokemon_name": "Alakazam",
@@ -254,12 +272,6 @@
"pokemon_name": "Gyarados",
"level": 61,
"order": 5
- },
- {
- "pokeapi_id": 6,
- "pokemon_name": "Charizard",
- "level": 63,
- "order": 6
}
]
}
diff --git a/backend/src/app/seeds/data/gold-bosses.json b/backend/src/app/seeds/data/gold-bosses.json
index b5939d1..62e4835 100644
--- a/backend/src/app/seeds/data/gold-bosses.json
+++ b/backend/src/app/seeds/data/gold-bosses.json
@@ -4,13 +4,13 @@
"boss_type": "gym_leader",
"specialty_type": "flying",
"badge_name": "Zephyr Badge",
- "badge_image_url": "https://archives.bulbagarden.net/media/upload/thumb/4/4a/Zephyr_Badge.png/35px-Zephyr_Badge.png",
+ "badge_image_url": "/badges/zephyr-badge.png",
"level_cap": 9,
"order": 1,
"after_route_name": "Violet City",
"location": "Violet Gym",
"section": "Main Story",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/4/4a/Zephyr_Badge.png/35px-Zephyr_Badge.png",
+ "sprite_url": "/boss-sprites/gold/falkner.png",
"pokemon": []
},
{
@@ -18,13 +18,13 @@
"boss_type": "gym_leader",
"specialty_type": "bug",
"badge_name": "Hive Badge",
- "badge_image_url": "https://github.com/PokeAPI/sprites/blob/master/sprites/badges/10.png?raw=true",
+ "badge_image_url": "/badges/hive-badge.png",
"level_cap": 16,
"order": 2,
"after_route_name": "Slowpoke Well",
"location": "Azalea Gym",
"section": "Main Story",
- "sprite_url": "https://github.com/PokeAPI/sprites/blob/master/sprites/badges/10.png?raw=true",
+ "sprite_url": "/boss-sprites/gold/bugsy.png",
"pokemon": []
},
{
@@ -32,13 +32,13 @@
"boss_type": "gym_leader",
"specialty_type": "normal",
"badge_name": "Plain Badge",
- "badge_image_url": "https://github.com/PokeAPI/sprites/blob/master/sprites/badges/11.png?raw=true",
+ "badge_image_url": "/badges/plain-badge.png",
"level_cap": 20,
"order": 3,
"after_route_name": "Goldenrod City",
"location": "Goldenrod Gym",
"section": "Main Story",
- "sprite_url": "https://github.com/PokeAPI/sprites/blob/master/sprites/badges/11.png?raw=true",
+ "sprite_url": "/boss-sprites/gold/whitney.png",
"pokemon": []
},
{
@@ -46,13 +46,13 @@
"boss_type": "gym_leader",
"specialty_type": "ghost",
"badge_name": "Fog Badge",
- "badge_image_url": "https://github.com/PokeAPI/sprites/blob/master/sprites/badges/12.png?raw=true",
+ "badge_image_url": "/badges/fog-badge.png",
"level_cap": 25,
"order": 4,
"after_route_name": null,
"location": "Ecruteak Gym",
"section": "Main Story",
- "sprite_url": "https://github.com/PokeAPI/sprites/blob/master/sprites/badges/12.png?raw=true",
+ "sprite_url": "/boss-sprites/gold/morty.png",
"pokemon": []
},
{
@@ -60,13 +60,13 @@
"boss_type": "gym_leader",
"specialty_type": "fighting",
"badge_name": "Storm Badge",
- "badge_image_url": "https://github.com/PokeAPI/sprites/blob/master/sprites/badges/13.png?raw=true",
+ "badge_image_url": "/badges/storm-badge.png",
"level_cap": 30,
"order": 5,
"after_route_name": "Cianwood City",
"location": "Cianwood Gym",
"section": "Main Story",
- "sprite_url": "https://github.com/PokeAPI/sprites/blob/master/sprites/badges/13.png?raw=true",
+ "sprite_url": "/boss-sprites/gold/chuck.png",
"pokemon": []
},
{
@@ -74,13 +74,13 @@
"boss_type": "gym_leader",
"specialty_type": "steel",
"badge_name": "Mineral Badge",
- "badge_image_url": "https://github.com/PokeAPI/sprites/blob/master/sprites/badges/14.png?raw=true",
+ "badge_image_url": "/badges/mineral-badge.png",
"level_cap": 35,
"order": 6,
"after_route_name": "Cianwood City",
"location": "Olivine Gym",
"section": "Main Story",
- "sprite_url": "https://github.com/PokeAPI/sprites/blob/master/sprites/badges/14.png?raw=true",
+ "sprite_url": "/boss-sprites/gold/jasmine.png",
"pokemon": []
},
{
@@ -88,13 +88,13 @@
"boss_type": "gym_leader",
"specialty_type": "ice",
"badge_name": "Glacier Badge",
- "badge_image_url": "https://github.com/PokeAPI/sprites/blob/master/sprites/badges/15.png?raw=true",
+ "badge_image_url": "/badges/glacier-badge.png",
"level_cap": 31,
"order": 7,
"after_route_name": "Lake Of Rage",
"location": "Mahogany Gym",
"section": "Main Story",
- "sprite_url": "https://github.com/PokeAPI/sprites/blob/master/sprites/badges/15.png?raw=true",
+ "sprite_url": "/boss-sprites/gold/pryce.png",
"pokemon": []
},
{
@@ -102,13 +102,13 @@
"boss_type": "gym_leader",
"specialty_type": "dragon",
"badge_name": "Rising Badge",
- "badge_image_url": "https://archives.bulbagarden.net/media/upload/thumb/5/58/Rising_Badge.png/35px-Rising_Badge.png",
+ "badge_image_url": "/badges/rising-badge.png",
"level_cap": 40,
"order": 8,
"after_route_name": "Blackthorn City",
"location": "Blackthorn Gym",
"section": "Main Story",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/5/58/Rising_Badge.png/35px-Rising_Badge.png",
+ "sprite_url": "/boss-sprites/gold/clair.png",
"pokemon": []
},
{
@@ -186,13 +186,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": 46,
"order": 14,
"after_route_name": "Vermilion City",
"location": "Vermilion Gym",
"section": "Endgame",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/a/a6/Thunder_Badge.png/35px-Thunder_Badge.png",
+ "sprite_url": "/boss-sprites/gold/lt-surge.png",
"pokemon": []
},
{
@@ -200,13 +200,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": 48,
"order": 15,
"after_route_name": "Route 6",
"location": "Saffron Gym",
"section": "Endgame",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/6/6b/Marsh_Badge.png/35px-Marsh_Badge.png",
+ "sprite_url": "/boss-sprites/gold/sabrina.png",
"pokemon": []
},
{
@@ -214,13 +214,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": 47,
"order": 16,
"after_route_name": "Cerulean City",
"location": "Cerulean Gym",
"section": "Endgame",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/9/9c/Cascade_Badge.png/35px-Cascade_Badge.png",
+ "sprite_url": "/boss-sprites/gold/misty.png",
"pokemon": []
},
{
@@ -228,13 +228,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": 46,
"order": 17,
"after_route_name": "Route 7",
"location": "Celadon Gym",
"section": "Endgame",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/b/b5/Rainbow_Badge.png/35px-Rainbow_Badge.png",
+ "sprite_url": "/boss-sprites/gold/erika.png",
"pokemon": []
},
{
@@ -242,13 +242,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": 39,
"order": 18,
"after_route_name": "Fuchsia City",
"location": "Fuchsia Gym",
"section": "Endgame",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/7/7d/Soul_Badge.png/35px-Soul_Badge.png",
+ "sprite_url": "/boss-sprites/gold/janine.png",
"pokemon": []
},
{
@@ -256,13 +256,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": 44,
"order": 19,
"after_route_name": "Pewter City",
"location": "Pewter Gym",
"section": "Endgame",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/d/dd/Boulder_Badge.png/35px-Boulder_Badge.png",
+ "sprite_url": "/boss-sprites/gold/brock.png",
"pokemon": []
},
{
@@ -270,13 +270,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": 50,
"order": 20,
"after_route_name": "Cinnabar Island",
"location": "Cinnabar Gym",
"section": "Endgame",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/1/12/Volcano_Badge.png/35px-Volcano_Badge.png",
+ "sprite_url": "/boss-sprites/gold/blaine.png",
"pokemon": []
},
{
@@ -284,13 +284,13 @@
"boss_type": "gym_leader",
"specialty_type": null,
"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": 58,
"order": 21,
"after_route_name": null,
"location": "Viridian Gym",
"section": "Endgame",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/7/78/Earth_Badge.png/35px-Earth_Badge.png",
+ "sprite_url": "/boss-sprites/gold/blue.png",
"pokemon": []
},
{
diff --git a/backend/src/app/seeds/data/heartgold-bosses.json b/backend/src/app/seeds/data/heartgold-bosses.json
index 7695ddf..4663874 100644
--- a/backend/src/app/seeds/data/heartgold-bosses.json
+++ b/backend/src/app/seeds/data/heartgold-bosses.json
@@ -4,13 +4,13 @@
"boss_type": "gym_leader",
"specialty_type": null,
"badge_name": "Zephyr Badge",
- "badge_image_url": "https://archives.bulbagarden.net/media/upload/thumb/4/4a/Zephyr_Badge.png/35px-Zephyr_Badge.png",
+ "badge_image_url": "/badges/zephyr-badge.png",
"level_cap": 13,
"order": 1,
"after_route_name": null,
"location": "Violet Gym",
"section": "Main Story",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/4/4a/Zephyr_Badge.png/35px-Zephyr_Badge.png",
+ "sprite_url": "/boss-sprites/heartgold/falkner.png",
"pokemon": []
},
{
@@ -18,13 +18,13 @@
"boss_type": "gym_leader",
"specialty_type": null,
"badge_name": "Hive Badge",
- "badge_image_url": "https://github.com/PokeAPI/sprites/blob/master/sprites/badges/10.png?raw=true",
+ "badge_image_url": "/badges/hive-badge.png",
"level_cap": 17,
"order": 2,
"after_route_name": null,
"location": "Azalea Gym",
"section": "Main Story",
- "sprite_url": "https://github.com/PokeAPI/sprites/blob/master/sprites/badges/10.png?raw=true",
+ "sprite_url": "/boss-sprites/heartgold/bugsy.png",
"pokemon": []
},
{
@@ -32,13 +32,13 @@
"boss_type": "gym_leader",
"specialty_type": null,
"badge_name": "Plain Badge",
- "badge_image_url": "https://github.com/PokeAPI/sprites/blob/master/sprites/badges/11.png?raw=true",
+ "badge_image_url": "/badges/plain-badge.png",
"level_cap": 19,
"order": 3,
"after_route_name": null,
"location": "Goldenrod Gym",
"section": "Main Story",
- "sprite_url": "https://github.com/PokeAPI/sprites/blob/master/sprites/badges/11.png?raw=true",
+ "sprite_url": "/boss-sprites/heartgold/whitney.png",
"pokemon": []
},
{
@@ -46,13 +46,13 @@
"boss_type": "gym_leader",
"specialty_type": null,
"badge_name": "Fog Badge",
- "badge_image_url": "https://github.com/PokeAPI/sprites/blob/master/sprites/badges/12.png?raw=true",
+ "badge_image_url": "/badges/fog-badge.png",
"level_cap": 25,
"order": 4,
"after_route_name": null,
"location": "Ecruteak Gym",
"section": "Main Story",
- "sprite_url": "https://github.com/PokeAPI/sprites/blob/master/sprites/badges/12.png?raw=true",
+ "sprite_url": "/boss-sprites/heartgold/morty.png",
"pokemon": []
},
{
@@ -60,13 +60,13 @@
"boss_type": "gym_leader",
"specialty_type": null,
"badge_name": "Storm Badge",
- "badge_image_url": "https://github.com/PokeAPI/sprites/blob/master/sprites/badges/13.png?raw=true",
+ "badge_image_url": "/badges/storm-badge.png",
"level_cap": 31,
"order": 5,
"after_route_name": null,
"location": "Cianwood Gym",
"section": "Main Story",
- "sprite_url": "https://github.com/PokeAPI/sprites/blob/master/sprites/badges/13.png?raw=true",
+ "sprite_url": "/boss-sprites/heartgold/chuck.png",
"pokemon": []
},
{
@@ -74,13 +74,13 @@
"boss_type": "gym_leader",
"specialty_type": null,
"badge_name": "Mineral Badge",
- "badge_image_url": "https://github.com/PokeAPI/sprites/blob/master/sprites/badges/14.png?raw=true",
+ "badge_image_url": "/badges/mineral-badge.png",
"level_cap": 35,
"order": 6,
"after_route_name": null,
"location": "Olivine Gym",
"section": "Main Story",
- "sprite_url": "https://github.com/PokeAPI/sprites/blob/master/sprites/badges/14.png?raw=true",
+ "sprite_url": "/boss-sprites/heartgold/jasmine.png",
"pokemon": []
},
{
@@ -88,13 +88,13 @@
"boss_type": "gym_leader",
"specialty_type": null,
"badge_name": "Glacier Badge",
- "badge_image_url": "https://github.com/PokeAPI/sprites/blob/master/sprites/badges/15.png?raw=true",
+ "badge_image_url": "/badges/glacier-badge.png",
"level_cap": 34,
"order": 7,
"after_route_name": null,
"location": "Mahogany Gym",
"section": "Main Story",
- "sprite_url": "https://github.com/PokeAPI/sprites/blob/master/sprites/badges/15.png?raw=true",
+ "sprite_url": "/boss-sprites/heartgold/pryce.png",
"pokemon": []
},
{
@@ -102,13 +102,13 @@
"boss_type": "gym_leader",
"specialty_type": null,
"badge_name": "Rising Badge",
- "badge_image_url": "https://archives.bulbagarden.net/media/upload/thumb/5/58/Rising_Badge.png/35px-Rising_Badge.png",
+ "badge_image_url": "/badges/rising-badge.png",
"level_cap": 41,
"order": 8,
"after_route_name": null,
"location": "Blackthorn Gym",
"section": "Main Story",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/5/58/Rising_Badge.png/35px-Rising_Badge.png",
+ "sprite_url": "/boss-sprites/heartgold/clair.png",
"pokemon": []
},
{
@@ -186,13 +186,13 @@
"boss_type": "gym_leader",
"specialty_type": null,
"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": 54,
"order": 14,
"after_route_name": null,
"location": "Pewter Gym",
"section": "Endgame",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/d/dd/Boulder_Badge.png/35px-Boulder_Badge.png",
+ "sprite_url": "/boss-sprites/heartgold/brock.png",
"pokemon": []
},
{
@@ -200,13 +200,13 @@
"boss_type": "gym_leader",
"specialty_type": null,
"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": 54,
"order": 15,
"after_route_name": null,
"location": "Cerulean Gym",
"section": "Endgame",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/9/9c/Cascade_Badge.png/35px-Cascade_Badge.png",
+ "sprite_url": "/boss-sprites/heartgold/misty.png",
"pokemon": []
},
{
@@ -214,13 +214,13 @@
"boss_type": "gym_leader",
"specialty_type": null,
"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": 53,
"order": 16,
"after_route_name": null,
"location": "Vermilion Gym",
"section": "Endgame",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/a/a6/Thunder_Badge.png/35px-Thunder_Badge.png",
+ "sprite_url": "/boss-sprites/heartgold/lt-surge.png",
"pokemon": []
},
{
@@ -228,13 +228,13 @@
"boss_type": "gym_leader",
"specialty_type": null,
"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": 56,
"order": 17,
"after_route_name": null,
"location": "Celadon Gym",
"section": "Endgame",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/b/b5/Rainbow_Badge.png/35px-Rainbow_Badge.png",
+ "sprite_url": "/boss-sprites/heartgold/erika.png",
"pokemon": []
},
{
@@ -242,13 +242,13 @@
"boss_type": "gym_leader",
"specialty_type": null,
"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": 50,
"order": 18,
"after_route_name": null,
"location": "Fuchsia Gym",
"section": "Endgame",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/7/7d/Soul_Badge.png/35px-Soul_Badge.png",
+ "sprite_url": "/boss-sprites/heartgold/janine.png",
"pokemon": []
},
{
@@ -256,13 +256,13 @@
"boss_type": "gym_leader",
"specialty_type": null,
"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": 55,
"order": 19,
"after_route_name": null,
"location": "Saffron Gym",
"section": "Endgame",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/6/6b/Marsh_Badge.png/35px-Marsh_Badge.png",
+ "sprite_url": "/boss-sprites/heartgold/sabrina.png",
"pokemon": []
},
{
@@ -270,13 +270,13 @@
"boss_type": "gym_leader",
"specialty_type": null,
"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": 59,
"order": 20,
"after_route_name": null,
"location": "Cinnabar Gym",
"section": "Endgame",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/1/12/Volcano_Badge.png/35px-Volcano_Badge.png",
+ "sprite_url": "/boss-sprites/heartgold/blaine.png",
"pokemon": []
},
{
@@ -284,13 +284,13 @@
"boss_type": "gym_leader",
"specialty_type": null,
"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": 60,
"order": 21,
"after_route_name": null,
"location": "Viridian Gym",
"section": "Endgame",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/7/78/Earth_Badge.png/35px-Earth_Badge.png",
+ "sprite_url": "/boss-sprites/heartgold/blue.png",
"pokemon": []
},
{
diff --git a/backend/src/app/seeds/data/red-bosses.json b/backend/src/app/seeds/data/red-bosses.json
index 62230af..bc22422 100644
--- a/backend/src/app/seeds/data/red-bosses.json
+++ b/backend/src/app/seeds/data/red-bosses.json
@@ -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": []
},
{
diff --git a/backend/src/app/seeds/data/ruby-bosses.json b/backend/src/app/seeds/data/ruby-bosses.json
index 7c53894..b1e4cfe 100644
--- a/backend/src/app/seeds/data/ruby-bosses.json
+++ b/backend/src/app/seeds/data/ruby-bosses.json
@@ -4,13 +4,13 @@
"boss_type": "gym_leader",
"specialty_type": "rock",
"badge_name": "Stone Badge",
- "badge_image_url": "https://archives.bulbagarden.net/media/upload/thumb/6/63/Stone_Badge.png/35px-Stone_Badge.png",
+ "badge_image_url": "/badges/stone-badge.png",
"level_cap": 15,
"order": 1,
"after_route_name": "Rustboro City",
"location": "Rustboro Gym",
"section": "Main Story",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/6/63/Stone_Badge.png/35px-Stone_Badge.png",
+ "sprite_url": "/boss-sprites/ruby/roxanne.png",
"pokemon": []
},
{
@@ -18,13 +18,13 @@
"boss_type": "gym_leader",
"specialty_type": "fighting",
"badge_name": "Knuckle Badge",
- "badge_image_url": "https://archives.bulbagarden.net/media/upload/thumb/9/97/Knuckle_Badge.png/35px-Knuckle_Badge.png",
+ "badge_image_url": "/badges/knuckle-badge.png",
"level_cap": 18,
"order": 2,
"after_route_name": "Dewford Town",
"location": "Dewford Gym",
"section": "Main Story",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/9/97/Knuckle_Badge.png/35px-Knuckle_Badge.png",
+ "sprite_url": "/boss-sprites/ruby/brawly.png",
"pokemon": []
},
{
@@ -32,13 +32,13 @@
"boss_type": "gym_leader",
"specialty_type": "electric",
"badge_name": "Dynamo Badge",
- "badge_image_url": "https://archives.bulbagarden.net/media/upload/thumb/3/34/Dynamo_Badge.png/35px-Dynamo_Badge.png",
+ "badge_image_url": "/badges/dynamo-badge.png",
"level_cap": 23,
"order": 3,
"after_route_name": "Route 110",
"location": "Mauville Gym",
"section": "Main Story",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/3/34/Dynamo_Badge.png/35px-Dynamo_Badge.png",
+ "sprite_url": "/boss-sprites/ruby/wattson.png",
"pokemon": []
},
{
@@ -46,13 +46,13 @@
"boss_type": "gym_leader",
"specialty_type": "fire",
"badge_name": "Heat Badge",
- "badge_image_url": "https://archives.bulbagarden.net/media/upload/thumb/c/c4/Heat_Badge.png/35px-Heat_Badge.png",
+ "badge_image_url": "/badges/heat-badge.png",
"level_cap": 28,
"order": 4,
"after_route_name": "Lavaridge Town",
"location": "Lavaridge Gym",
"section": "Main Story",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/c/c4/Heat_Badge.png/35px-Heat_Badge.png",
+ "sprite_url": "/boss-sprites/ruby/flannery.png",
"pokemon": []
},
{
@@ -60,13 +60,13 @@
"boss_type": "gym_leader",
"specialty_type": "normal",
"badge_name": "Balance Badge",
- "badge_image_url": "https://archives.bulbagarden.net/media/upload/thumb/6/63/Balance_Badge.png/35px-Balance_Badge.png",
+ "badge_image_url": "/badges/balance-badge.png",
"level_cap": 31,
"order": 5,
"after_route_name": "Route 115",
"location": "Petalburg Gym",
"section": "Main Story",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/6/63/Balance_Badge.png/35px-Balance_Badge.png",
+ "sprite_url": "/boss-sprites/ruby/norman.png",
"pokemon": []
},
{
@@ -74,13 +74,13 @@
"boss_type": "gym_leader",
"specialty_type": "flying",
"badge_name": "Feather Badge",
- "badge_image_url": "https://archives.bulbagarden.net/media/upload/thumb/6/62/Feather_Badge.png/35px-Feather_Badge.png",
+ "badge_image_url": "/badges/feather-badge.png",
"level_cap": 33,
"order": 6,
"after_route_name": "Route 119",
"location": "Foretree Gym",
"section": "Main Story",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/6/62/Feather_Badge.png/35px-Feather_Badge.png",
+ "sprite_url": "/boss-sprites/ruby/winona.png",
"pokemon": []
},
{
@@ -88,13 +88,13 @@
"boss_type": "gym_leader",
"specialty_type": "psychic",
"badge_name": "Mind Badge",
- "badge_image_url": "https://archives.bulbagarden.net/media/upload/thumb/c/cc/Mind_Badge.png/35px-Mind_Badge.png",
+ "badge_image_url": "/badges/mind-badge.png",
"level_cap": 42,
"order": 7,
"after_route_name": "Mossdeep City",
"location": "Mossdeep Gym",
"section": "Main Story",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/c/cc/Mind_Badge.png/35px-Mind_Badge.png",
+ "sprite_url": "/boss-sprites/ruby/tate--lisa.png",
"pokemon": []
},
{
@@ -102,13 +102,13 @@
"boss_type": "gym_leader",
"specialty_type": "water",
"badge_name": "Rain Badge",
- "badge_image_url": "https://archives.bulbagarden.net/media/upload/thumb/9/9b/Rain_Badge.png/35px-Rain_Badge.png",
+ "badge_image_url": "/badges/rain-badge.png",
"level_cap": 43,
"order": 8,
"after_route_name": "Sootopolis City",
"location": "Sootopolis Gym",
"section": "Main Story",
- "sprite_url": "https://archives.bulbagarden.net/media/upload/thumb/9/9b/Rain_Badge.png/35px-Rain_Badge.png",
+ "sprite_url": "/boss-sprites/ruby/wallace.png",
"pokemon": []
},
{
diff --git a/backend/src/app/seeds/data/yellow-bosses.json b/backend/src/app/seeds/data/yellow-bosses.json
index 838ad5a..46def1c 100644
--- a/backend/src/app/seeds/data/yellow-bosses.json
+++ b/backend/src/app/seeds/data/yellow-bosses.json
@@ -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": 12,
"order": 1,
"after_route_name": null,
"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/yellow/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": null,
"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/yellow/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": 28,
"order": 3,
"after_route_name": null,
"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/yellow/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": 32,
"order": 4,
"after_route_name": null,
"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/yellow/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": 50,
"order": 5,
"after_route_name": null,
"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/yellow/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": 50,
"order": 6,
"after_route_name": null,
"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/yellow/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": 54,
"order": 7,
"after_route_name": null,
"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/yellow/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": 55,
"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/yellow/giovanni.png",
"pokemon": []
},
{
diff --git a/backend/src/app/seeds/run.py b/backend/src/app/seeds/run.py
index 0d7750d..b2e27f1 100644
--- a/backend/src/app/seeds/run.py
+++ b/backend/src/app/seeds/run.py
@@ -1,6 +1,8 @@
"""Seed runner — reads JSON files and upserts into the database."""
import json
+import re
+import urllib.request
from pathlib import Path
from sqlalchemy import func, select
@@ -403,11 +405,58 @@ async def _export_routes(session: AsyncSession, vg_data: dict):
print(f"Routes: {exported} game files exported")
+FRONTEND_PUBLIC = Path(__file__).resolve().parents[4] / "frontend" / "public"
+
+
+def _slugify(name: str) -> str:
+ """Convert a name to a filename-safe slug: lowercase, hyphens, no special chars."""
+ slug = name.lower().replace(" ", "-")
+ slug = re.sub(r"[^a-z0-9-]", "", slug)
+ return slug
+
+
+def _download_image(
+ url: str,
+ output_dir: Path,
+ slug: str,
+ downloaded: set[str],
+) -> str:
+ """Download an image to output_dir/slug.ext if not already downloaded.
+
+ Returns the local path (relative to frontend/public).
+ """
+ url_ext = url.rsplit(".", 1)[-1].split("?")[0].lower()
+ if url_ext in ("png", "jpg", "jpeg", "gif", "webp", "svg"):
+ ext = f".{url_ext}"
+ else:
+ ext = ".png"
+
+ filename = f"{slug}{ext}"
+ dest = output_dir / filename
+
+ if filename not in downloaded:
+ output_dir.mkdir(parents=True, exist_ok=True)
+ req = urllib.request.Request(url, headers={"User-Agent": "nuzlocke-tracker/1.0"})
+ try:
+ with urllib.request.urlopen(req, timeout=30) as resp:
+ dest.write_bytes(resp.read())
+ except (urllib.error.URLError, OSError) as exc:
+ print(f" Warning: failed to download {url}: {exc}")
+ return url
+ downloaded.add(filename)
+ print(f" Downloaded: {dest.relative_to(FRONTEND_PUBLIC)}")
+
+ return f"/{dest.relative_to(FRONTEND_PUBLIC)}"
+
+
async def _export_bosses(session: AsyncSession, vg_data: dict):
"""Export boss battles per version group."""
vg_result = await session.execute(select(VersionGroup))
slug_to_vg = {vg.slug: vg for vg in vg_result.scalars().all()}
+ badge_dir = FRONTEND_PUBLIC / "badges"
+ downloaded_badges: set[str] = set()
+
exported = 0
for vg_slug, vg_info in vg_data.items():
vg = slug_to_vg.get(vg_slug)
@@ -429,19 +478,37 @@ async def _export_bosses(session: AsyncSession, vg_data: dict):
continue
first_game_slug = list(vg_info["games"].keys())[0]
- data = [
- {
+ sprite_dir = FRONTEND_PUBLIC / "boss-sprites" / first_game_slug
+ downloaded_sprites: set[str] = set()
+ data = []
+ for b in bosses:
+ badge_image_url = b.badge_image_url
+ sprite_url = b.sprite_url
+
+ if badge_image_url and b.badge_name:
+ badge_slug = _slugify(b.badge_name)
+ badge_image_url = _download_image(
+ badge_image_url, badge_dir, badge_slug, downloaded_badges,
+ )
+
+ if sprite_url:
+ sprite_slug = _slugify(b.name)
+ sprite_url = _download_image(
+ sprite_url, sprite_dir, sprite_slug, downloaded_sprites,
+ )
+
+ data.append({
"name": b.name,
"boss_type": b.boss_type,
"specialty_type": b.specialty_type,
"badge_name": b.badge_name,
- "badge_image_url": b.badge_image_url,
+ "badge_image_url": badge_image_url,
"level_cap": b.level_cap,
"order": b.order,
"after_route_name": b.after_route.name if b.after_route else None,
"location": b.location,
"section": b.section,
- "sprite_url": b.sprite_url,
+ "sprite_url": sprite_url,
"pokemon": [
{
"pokeapi_id": bp.pokemon.pokeapi_id,
@@ -451,9 +518,7 @@ async def _export_bosses(session: AsyncSession, vg_data: dict):
}
for bp in sorted(b.pokemon, key=lambda p: p.order)
],
- }
- for b in bosses
- ]
+ })
_write_json(f"{first_game_slug}-bosses.json", data)
exported += 1
diff --git a/frontend/public/badges/50.png b/frontend/public/badges/50.png
new file mode 100644
index 0000000..60a9fa2
Binary files /dev/null and b/frontend/public/badges/50.png differ
diff --git a/frontend/public/badges/balance-badge.png b/frontend/public/badges/balance-badge.png
new file mode 100644
index 0000000..1d1c04a
Binary files /dev/null and b/frontend/public/badges/balance-badge.png differ
diff --git a/frontend/public/badges/boulder-badge.png b/frontend/public/badges/boulder-badge.png
new file mode 100644
index 0000000..66660ce
Binary files /dev/null and b/frontend/public/badges/boulder-badge.png differ
diff --git a/frontend/public/badges/cascade-badge.png b/frontend/public/badges/cascade-badge.png
new file mode 100644
index 0000000..b790e63
Binary files /dev/null and b/frontend/public/badges/cascade-badge.png differ
diff --git a/frontend/public/badges/coal-badge.png b/frontend/public/badges/coal-badge.png
new file mode 100644
index 0000000..2c92fcc
Binary files /dev/null and b/frontend/public/badges/coal-badge.png differ
diff --git a/frontend/public/badges/dynamo-badge.png b/frontend/public/badges/dynamo-badge.png
new file mode 100644
index 0000000..ad19d27
Binary files /dev/null and b/frontend/public/badges/dynamo-badge.png differ
diff --git a/frontend/public/badges/earth-badge.png b/frontend/public/badges/earth-badge.png
new file mode 100644
index 0000000..cc2120c
Binary files /dev/null and b/frontend/public/badges/earth-badge.png differ
diff --git a/frontend/public/badges/feather-badge.png b/frontend/public/badges/feather-badge.png
new file mode 100644
index 0000000..6fa69b2
Binary files /dev/null and b/frontend/public/badges/feather-badge.png differ
diff --git a/frontend/public/badges/fog-badge.png b/frontend/public/badges/fog-badge.png
new file mode 100644
index 0000000..f155911
Binary files /dev/null and b/frontend/public/badges/fog-badge.png differ
diff --git a/frontend/public/badges/glacier-badge.png b/frontend/public/badges/glacier-badge.png
new file mode 100644
index 0000000..a57a400
Binary files /dev/null and b/frontend/public/badges/glacier-badge.png differ
diff --git a/frontend/public/badges/heat-badge.png b/frontend/public/badges/heat-badge.png
new file mode 100644
index 0000000..af106db
Binary files /dev/null and b/frontend/public/badges/heat-badge.png differ
diff --git a/frontend/public/badges/hive-badge.png b/frontend/public/badges/hive-badge.png
new file mode 100644
index 0000000..e855c8a
Binary files /dev/null and b/frontend/public/badges/hive-badge.png differ
diff --git a/frontend/public/badges/knuckle-badge.png b/frontend/public/badges/knuckle-badge.png
new file mode 100644
index 0000000..bc4fc5a
Binary files /dev/null and b/frontend/public/badges/knuckle-badge.png differ
diff --git a/frontend/public/badges/marsh-badge.png b/frontend/public/badges/marsh-badge.png
new file mode 100644
index 0000000..3984c13
Binary files /dev/null and b/frontend/public/badges/marsh-badge.png differ
diff --git a/frontend/public/badges/mind-badge.png b/frontend/public/badges/mind-badge.png
new file mode 100644
index 0000000..a25d13b
Binary files /dev/null and b/frontend/public/badges/mind-badge.png differ
diff --git a/frontend/public/badges/mineral-badge.png b/frontend/public/badges/mineral-badge.png
new file mode 100644
index 0000000..34b1aee
Binary files /dev/null and b/frontend/public/badges/mineral-badge.png differ
diff --git a/frontend/public/badges/plain-badge.png b/frontend/public/badges/plain-badge.png
new file mode 100644
index 0000000..160eb41
Binary files /dev/null and b/frontend/public/badges/plain-badge.png differ
diff --git a/frontend/public/badges/rain-badge.png b/frontend/public/badges/rain-badge.png
new file mode 100644
index 0000000..815a93d
Binary files /dev/null and b/frontend/public/badges/rain-badge.png differ
diff --git a/frontend/public/badges/rainbow-badge.png b/frontend/public/badges/rainbow-badge.png
new file mode 100644
index 0000000..e6feb6c
Binary files /dev/null and b/frontend/public/badges/rainbow-badge.png differ
diff --git a/frontend/public/badges/rising-badge.png b/frontend/public/badges/rising-badge.png
new file mode 100644
index 0000000..e6e17e9
Binary files /dev/null and b/frontend/public/badges/rising-badge.png differ
diff --git a/frontend/public/badges/soul-badge.png b/frontend/public/badges/soul-badge.png
new file mode 100644
index 0000000..95647f4
Binary files /dev/null and b/frontend/public/badges/soul-badge.png differ
diff --git a/frontend/public/badges/stone-badge.png b/frontend/public/badges/stone-badge.png
new file mode 100644
index 0000000..0774389
Binary files /dev/null and b/frontend/public/badges/stone-badge.png differ
diff --git a/frontend/public/badges/storm-badge.png b/frontend/public/badges/storm-badge.png
new file mode 100644
index 0000000..0163413
Binary files /dev/null and b/frontend/public/badges/storm-badge.png differ
diff --git a/frontend/public/badges/thunder-badge.png b/frontend/public/badges/thunder-badge.png
new file mode 100644
index 0000000..a36e9de
Binary files /dev/null and b/frontend/public/badges/thunder-badge.png differ
diff --git a/frontend/public/badges/volcano-badge.png b/frontend/public/badges/volcano-badge.png
new file mode 100644
index 0000000..85b3130
Binary files /dev/null and b/frontend/public/badges/volcano-badge.png differ
diff --git a/frontend/public/badges/zephyr-badge.png b/frontend/public/badges/zephyr-badge.png
new file mode 100644
index 0000000..eac2aa1
Binary files /dev/null and b/frontend/public/badges/zephyr-badge.png differ
diff --git a/frontend/public/boss-sprites/crystal/blaine.png b/frontend/public/boss-sprites/crystal/blaine.png
new file mode 100644
index 0000000..85b3130
Binary files /dev/null and b/frontend/public/boss-sprites/crystal/blaine.png differ
diff --git a/frontend/public/boss-sprites/crystal/blue.png b/frontend/public/boss-sprites/crystal/blue.png
new file mode 100644
index 0000000..cc2120c
Binary files /dev/null and b/frontend/public/boss-sprites/crystal/blue.png differ
diff --git a/frontend/public/boss-sprites/crystal/brock.png b/frontend/public/boss-sprites/crystal/brock.png
new file mode 100644
index 0000000..66660ce
Binary files /dev/null and b/frontend/public/boss-sprites/crystal/brock.png differ
diff --git a/frontend/public/boss-sprites/crystal/bugsy.png b/frontend/public/boss-sprites/crystal/bugsy.png
new file mode 100644
index 0000000..e855c8a
Binary files /dev/null and b/frontend/public/boss-sprites/crystal/bugsy.png differ
diff --git a/frontend/public/boss-sprites/crystal/chuck.png b/frontend/public/boss-sprites/crystal/chuck.png
new file mode 100644
index 0000000..0163413
Binary files /dev/null and b/frontend/public/boss-sprites/crystal/chuck.png differ
diff --git a/frontend/public/boss-sprites/crystal/clair.png b/frontend/public/boss-sprites/crystal/clair.png
new file mode 100644
index 0000000..e6e17e9
Binary files /dev/null and b/frontend/public/boss-sprites/crystal/clair.png differ
diff --git a/frontend/public/boss-sprites/crystal/erika.png b/frontend/public/boss-sprites/crystal/erika.png
new file mode 100644
index 0000000..e6feb6c
Binary files /dev/null and b/frontend/public/boss-sprites/crystal/erika.png differ
diff --git a/frontend/public/boss-sprites/crystal/falkner.png b/frontend/public/boss-sprites/crystal/falkner.png
new file mode 100644
index 0000000..eac2aa1
Binary files /dev/null and b/frontend/public/boss-sprites/crystal/falkner.png differ
diff --git a/frontend/public/boss-sprites/crystal/janine.png b/frontend/public/boss-sprites/crystal/janine.png
new file mode 100644
index 0000000..95647f4
Binary files /dev/null and b/frontend/public/boss-sprites/crystal/janine.png differ
diff --git a/frontend/public/boss-sprites/crystal/jasmine.png b/frontend/public/boss-sprites/crystal/jasmine.png
new file mode 100644
index 0000000..34b1aee
Binary files /dev/null and b/frontend/public/boss-sprites/crystal/jasmine.png differ
diff --git a/frontend/public/boss-sprites/crystal/lt-surge.png b/frontend/public/boss-sprites/crystal/lt-surge.png
new file mode 100644
index 0000000..a36e9de
Binary files /dev/null and b/frontend/public/boss-sprites/crystal/lt-surge.png differ
diff --git a/frontend/public/boss-sprites/crystal/misty.png b/frontend/public/boss-sprites/crystal/misty.png
new file mode 100644
index 0000000..b790e63
Binary files /dev/null and b/frontend/public/boss-sprites/crystal/misty.png differ
diff --git a/frontend/public/boss-sprites/crystal/morty.png b/frontend/public/boss-sprites/crystal/morty.png
new file mode 100644
index 0000000..f155911
Binary files /dev/null and b/frontend/public/boss-sprites/crystal/morty.png differ
diff --git a/frontend/public/boss-sprites/crystal/pryce.png b/frontend/public/boss-sprites/crystal/pryce.png
new file mode 100644
index 0000000..a57a400
Binary files /dev/null and b/frontend/public/boss-sprites/crystal/pryce.png differ
diff --git a/frontend/public/boss-sprites/crystal/sabrina.png b/frontend/public/boss-sprites/crystal/sabrina.png
new file mode 100644
index 0000000..3984c13
Binary files /dev/null and b/frontend/public/boss-sprites/crystal/sabrina.png differ
diff --git a/frontend/public/boss-sprites/crystal/whitney.png b/frontend/public/boss-sprites/crystal/whitney.png
new file mode 100644
index 0000000..160eb41
Binary files /dev/null and b/frontend/public/boss-sprites/crystal/whitney.png differ
diff --git a/frontend/public/boss-sprites/diamond/roark.png b/frontend/public/boss-sprites/diamond/roark.png
new file mode 100644
index 0000000..2c92fcc
Binary files /dev/null and b/frontend/public/boss-sprites/diamond/roark.png differ
diff --git a/frontend/public/boss-sprites/emerald/brawly.png b/frontend/public/boss-sprites/emerald/brawly.png
new file mode 100644
index 0000000..bc4fc5a
Binary files /dev/null and b/frontend/public/boss-sprites/emerald/brawly.png differ
diff --git a/frontend/public/boss-sprites/emerald/flannery.png b/frontend/public/boss-sprites/emerald/flannery.png
new file mode 100644
index 0000000..af106db
Binary files /dev/null and b/frontend/public/boss-sprites/emerald/flannery.png differ
diff --git a/frontend/public/boss-sprites/emerald/norman.png b/frontend/public/boss-sprites/emerald/norman.png
new file mode 100644
index 0000000..1d1c04a
Binary files /dev/null and b/frontend/public/boss-sprites/emerald/norman.png differ
diff --git a/frontend/public/boss-sprites/emerald/roxanne.png b/frontend/public/boss-sprites/emerald/roxanne.png
new file mode 100644
index 0000000..0774389
Binary files /dev/null and b/frontend/public/boss-sprites/emerald/roxanne.png differ
diff --git a/frontend/public/boss-sprites/emerald/tate--lisa.png b/frontend/public/boss-sprites/emerald/tate--lisa.png
new file mode 100644
index 0000000..a25d13b
Binary files /dev/null and b/frontend/public/boss-sprites/emerald/tate--lisa.png differ
diff --git a/frontend/public/boss-sprites/emerald/wallace.png b/frontend/public/boss-sprites/emerald/wallace.png
new file mode 100644
index 0000000..815a93d
Binary files /dev/null and b/frontend/public/boss-sprites/emerald/wallace.png differ
diff --git a/frontend/public/boss-sprites/emerald/wattson.png b/frontend/public/boss-sprites/emerald/wattson.png
new file mode 100644
index 0000000..ad19d27
Binary files /dev/null and b/frontend/public/boss-sprites/emerald/wattson.png differ
diff --git a/frontend/public/boss-sprites/emerald/winona.png b/frontend/public/boss-sprites/emerald/winona.png
new file mode 100644
index 0000000..6fa69b2
Binary files /dev/null and b/frontend/public/boss-sprites/emerald/winona.png differ
diff --git a/frontend/public/boss-sprites/firered/blaine.png b/frontend/public/boss-sprites/firered/blaine.png
new file mode 100644
index 0000000..41613d4
Binary files /dev/null and b/frontend/public/boss-sprites/firered/blaine.png differ
diff --git a/frontend/public/boss-sprites/firered/brock.png b/frontend/public/boss-sprites/firered/brock.png
new file mode 100644
index 0000000..b6febf0
Binary files /dev/null and b/frontend/public/boss-sprites/firered/brock.png differ
diff --git a/frontend/public/boss-sprites/firered/erika.png b/frontend/public/boss-sprites/firered/erika.png
new file mode 100644
index 0000000..2550f04
Binary files /dev/null and b/frontend/public/boss-sprites/firered/erika.png differ
diff --git a/frontend/public/boss-sprites/firered/giovanni.png b/frontend/public/boss-sprites/firered/giovanni.png
new file mode 100644
index 0000000..60a9fa2
Binary files /dev/null and b/frontend/public/boss-sprites/firered/giovanni.png differ
diff --git a/frontend/public/boss-sprites/firered/koga.png b/frontend/public/boss-sprites/firered/koga.png
new file mode 100644
index 0000000..74fa06b
Binary files /dev/null and b/frontend/public/boss-sprites/firered/koga.png differ
diff --git a/frontend/public/boss-sprites/firered/lt-surge.png b/frontend/public/boss-sprites/firered/lt-surge.png
new file mode 100644
index 0000000..78b410b
Binary files /dev/null and b/frontend/public/boss-sprites/firered/lt-surge.png differ
diff --git a/frontend/public/boss-sprites/firered/misty.png b/frontend/public/boss-sprites/firered/misty.png
new file mode 100644
index 0000000..9e4a5ef
Binary files /dev/null and b/frontend/public/boss-sprites/firered/misty.png differ
diff --git a/frontend/public/boss-sprites/firered/sabrina.png b/frontend/public/boss-sprites/firered/sabrina.png
new file mode 100644
index 0000000..df38579
Binary files /dev/null and b/frontend/public/boss-sprites/firered/sabrina.png differ
diff --git a/frontend/public/boss-sprites/gold/blaine.png b/frontend/public/boss-sprites/gold/blaine.png
new file mode 100644
index 0000000..85b3130
Binary files /dev/null and b/frontend/public/boss-sprites/gold/blaine.png differ
diff --git a/frontend/public/boss-sprites/gold/blue.png b/frontend/public/boss-sprites/gold/blue.png
new file mode 100644
index 0000000..cc2120c
Binary files /dev/null and b/frontend/public/boss-sprites/gold/blue.png differ
diff --git a/frontend/public/boss-sprites/gold/brock.png b/frontend/public/boss-sprites/gold/brock.png
new file mode 100644
index 0000000..66660ce
Binary files /dev/null and b/frontend/public/boss-sprites/gold/brock.png differ
diff --git a/frontend/public/boss-sprites/gold/bugsy.png b/frontend/public/boss-sprites/gold/bugsy.png
new file mode 100644
index 0000000..e855c8a
Binary files /dev/null and b/frontend/public/boss-sprites/gold/bugsy.png differ
diff --git a/frontend/public/boss-sprites/gold/chuck.png b/frontend/public/boss-sprites/gold/chuck.png
new file mode 100644
index 0000000..0163413
Binary files /dev/null and b/frontend/public/boss-sprites/gold/chuck.png differ
diff --git a/frontend/public/boss-sprites/gold/clair.png b/frontend/public/boss-sprites/gold/clair.png
new file mode 100644
index 0000000..e6e17e9
Binary files /dev/null and b/frontend/public/boss-sprites/gold/clair.png differ
diff --git a/frontend/public/boss-sprites/gold/erika.png b/frontend/public/boss-sprites/gold/erika.png
new file mode 100644
index 0000000..e6feb6c
Binary files /dev/null and b/frontend/public/boss-sprites/gold/erika.png differ
diff --git a/frontend/public/boss-sprites/gold/falkner.png b/frontend/public/boss-sprites/gold/falkner.png
new file mode 100644
index 0000000..eac2aa1
Binary files /dev/null and b/frontend/public/boss-sprites/gold/falkner.png differ
diff --git a/frontend/public/boss-sprites/gold/janine.png b/frontend/public/boss-sprites/gold/janine.png
new file mode 100644
index 0000000..95647f4
Binary files /dev/null and b/frontend/public/boss-sprites/gold/janine.png differ
diff --git a/frontend/public/boss-sprites/gold/jasmine.png b/frontend/public/boss-sprites/gold/jasmine.png
new file mode 100644
index 0000000..34b1aee
Binary files /dev/null and b/frontend/public/boss-sprites/gold/jasmine.png differ
diff --git a/frontend/public/boss-sprites/gold/lt-surge.png b/frontend/public/boss-sprites/gold/lt-surge.png
new file mode 100644
index 0000000..a36e9de
Binary files /dev/null and b/frontend/public/boss-sprites/gold/lt-surge.png differ
diff --git a/frontend/public/boss-sprites/gold/misty.png b/frontend/public/boss-sprites/gold/misty.png
new file mode 100644
index 0000000..b790e63
Binary files /dev/null and b/frontend/public/boss-sprites/gold/misty.png differ
diff --git a/frontend/public/boss-sprites/gold/morty.png b/frontend/public/boss-sprites/gold/morty.png
new file mode 100644
index 0000000..f155911
Binary files /dev/null and b/frontend/public/boss-sprites/gold/morty.png differ
diff --git a/frontend/public/boss-sprites/gold/pryce.png b/frontend/public/boss-sprites/gold/pryce.png
new file mode 100644
index 0000000..a57a400
Binary files /dev/null and b/frontend/public/boss-sprites/gold/pryce.png differ
diff --git a/frontend/public/boss-sprites/gold/sabrina.png b/frontend/public/boss-sprites/gold/sabrina.png
new file mode 100644
index 0000000..3984c13
Binary files /dev/null and b/frontend/public/boss-sprites/gold/sabrina.png differ
diff --git a/frontend/public/boss-sprites/gold/whitney.png b/frontend/public/boss-sprites/gold/whitney.png
new file mode 100644
index 0000000..160eb41
Binary files /dev/null and b/frontend/public/boss-sprites/gold/whitney.png differ
diff --git a/frontend/public/boss-sprites/heartgold/blaine.png b/frontend/public/boss-sprites/heartgold/blaine.png
new file mode 100644
index 0000000..85b3130
Binary files /dev/null and b/frontend/public/boss-sprites/heartgold/blaine.png differ
diff --git a/frontend/public/boss-sprites/heartgold/blue.png b/frontend/public/boss-sprites/heartgold/blue.png
new file mode 100644
index 0000000..cc2120c
Binary files /dev/null and b/frontend/public/boss-sprites/heartgold/blue.png differ
diff --git a/frontend/public/boss-sprites/heartgold/brock.png b/frontend/public/boss-sprites/heartgold/brock.png
new file mode 100644
index 0000000..66660ce
Binary files /dev/null and b/frontend/public/boss-sprites/heartgold/brock.png differ
diff --git a/frontend/public/boss-sprites/heartgold/bugsy.png b/frontend/public/boss-sprites/heartgold/bugsy.png
new file mode 100644
index 0000000..e855c8a
Binary files /dev/null and b/frontend/public/boss-sprites/heartgold/bugsy.png differ
diff --git a/frontend/public/boss-sprites/heartgold/chuck.png b/frontend/public/boss-sprites/heartgold/chuck.png
new file mode 100644
index 0000000..0163413
Binary files /dev/null and b/frontend/public/boss-sprites/heartgold/chuck.png differ
diff --git a/frontend/public/boss-sprites/heartgold/clair.png b/frontend/public/boss-sprites/heartgold/clair.png
new file mode 100644
index 0000000..e6e17e9
Binary files /dev/null and b/frontend/public/boss-sprites/heartgold/clair.png differ
diff --git a/frontend/public/boss-sprites/heartgold/erika.png b/frontend/public/boss-sprites/heartgold/erika.png
new file mode 100644
index 0000000..e6feb6c
Binary files /dev/null and b/frontend/public/boss-sprites/heartgold/erika.png differ
diff --git a/frontend/public/boss-sprites/heartgold/falkner.png b/frontend/public/boss-sprites/heartgold/falkner.png
new file mode 100644
index 0000000..eac2aa1
Binary files /dev/null and b/frontend/public/boss-sprites/heartgold/falkner.png differ
diff --git a/frontend/public/boss-sprites/heartgold/janine.png b/frontend/public/boss-sprites/heartgold/janine.png
new file mode 100644
index 0000000..95647f4
Binary files /dev/null and b/frontend/public/boss-sprites/heartgold/janine.png differ
diff --git a/frontend/public/boss-sprites/heartgold/jasmine.png b/frontend/public/boss-sprites/heartgold/jasmine.png
new file mode 100644
index 0000000..34b1aee
Binary files /dev/null and b/frontend/public/boss-sprites/heartgold/jasmine.png differ
diff --git a/frontend/public/boss-sprites/heartgold/lt-surge.png b/frontend/public/boss-sprites/heartgold/lt-surge.png
new file mode 100644
index 0000000..a36e9de
Binary files /dev/null and b/frontend/public/boss-sprites/heartgold/lt-surge.png differ
diff --git a/frontend/public/boss-sprites/heartgold/misty.png b/frontend/public/boss-sprites/heartgold/misty.png
new file mode 100644
index 0000000..b790e63
Binary files /dev/null and b/frontend/public/boss-sprites/heartgold/misty.png differ
diff --git a/frontend/public/boss-sprites/heartgold/morty.png b/frontend/public/boss-sprites/heartgold/morty.png
new file mode 100644
index 0000000..f155911
Binary files /dev/null and b/frontend/public/boss-sprites/heartgold/morty.png differ
diff --git a/frontend/public/boss-sprites/heartgold/pryce.png b/frontend/public/boss-sprites/heartgold/pryce.png
new file mode 100644
index 0000000..a57a400
Binary files /dev/null and b/frontend/public/boss-sprites/heartgold/pryce.png differ
diff --git a/frontend/public/boss-sprites/heartgold/sabrina.png b/frontend/public/boss-sprites/heartgold/sabrina.png
new file mode 100644
index 0000000..3984c13
Binary files /dev/null and b/frontend/public/boss-sprites/heartgold/sabrina.png differ
diff --git a/frontend/public/boss-sprites/heartgold/whitney.png b/frontend/public/boss-sprites/heartgold/whitney.png
new file mode 100644
index 0000000..160eb41
Binary files /dev/null and b/frontend/public/boss-sprites/heartgold/whitney.png differ
diff --git a/frontend/public/boss-sprites/red/blaine.png b/frontend/public/boss-sprites/red/blaine.png
new file mode 100644
index 0000000..85b3130
Binary files /dev/null and b/frontend/public/boss-sprites/red/blaine.png differ
diff --git a/frontend/public/boss-sprites/red/brock.png b/frontend/public/boss-sprites/red/brock.png
new file mode 100644
index 0000000..66660ce
Binary files /dev/null and b/frontend/public/boss-sprites/red/brock.png differ
diff --git a/frontend/public/boss-sprites/red/erika.png b/frontend/public/boss-sprites/red/erika.png
new file mode 100644
index 0000000..e6feb6c
Binary files /dev/null and b/frontend/public/boss-sprites/red/erika.png differ
diff --git a/frontend/public/boss-sprites/red/giovanni.png b/frontend/public/boss-sprites/red/giovanni.png
new file mode 100644
index 0000000..cc2120c
Binary files /dev/null and b/frontend/public/boss-sprites/red/giovanni.png differ
diff --git a/frontend/public/boss-sprites/red/koga.png b/frontend/public/boss-sprites/red/koga.png
new file mode 100644
index 0000000..95647f4
Binary files /dev/null and b/frontend/public/boss-sprites/red/koga.png differ
diff --git a/frontend/public/boss-sprites/red/lt-surge.png b/frontend/public/boss-sprites/red/lt-surge.png
new file mode 100644
index 0000000..a36e9de
Binary files /dev/null and b/frontend/public/boss-sprites/red/lt-surge.png differ
diff --git a/frontend/public/boss-sprites/red/misty.png b/frontend/public/boss-sprites/red/misty.png
new file mode 100644
index 0000000..b790e63
Binary files /dev/null and b/frontend/public/boss-sprites/red/misty.png differ
diff --git a/frontend/public/boss-sprites/red/sabrina.png b/frontend/public/boss-sprites/red/sabrina.png
new file mode 100644
index 0000000..3984c13
Binary files /dev/null and b/frontend/public/boss-sprites/red/sabrina.png differ
diff --git a/frontend/public/boss-sprites/ruby/brawly.png b/frontend/public/boss-sprites/ruby/brawly.png
new file mode 100644
index 0000000..7b1b920
--- /dev/null
+++ b/frontend/public/boss-sprites/ruby/brawly.png
@@ -0,0 +1,3676 @@
+
+
+
+
+Brawly - Bulbapedia, the community-driven Pokémon encyclopedia
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Brawly
+
+
From Bulbapedia, the community-driven Pokémon encyclopedia.
+
+
+
Jump to navigation Jump to search
+
+
+
Brawly (Japanese: トウキ Touki ) is the Gym Leader of Dewford Town 's Gym , known officially as the Dewford Gym . Trainers who defeat him receive the Knuckle Badge . He is a young surfer who specializes in Fighting-type Pokémon .
+
+
+
+
In the core series games
+
Brawly challenging the player
+
Brawly's title is "A big wave in fighting." His strategy is direct physical moves . He is also a deep thinker, often comparing the scene of battle to everyday life and vice-versa.
+
Brawly's Gym is kept in pitch-black darkness to test the bravery of the Trainers. Brawly also trains in the rough waves around Dewford and the pitch-black Granite Cave . He believes the world awaits him as the next big wave. He often talks in surfing jargon, and constantly talks about "big waves" — both literal and metaphorical.
+
Brawly once trained with Bruno of the Indigo Elite Four in Sevault Canyon of Seven Island . He also seems to be good friends with Steven . In Pokémon Omega Ruby and Alpha Sapphire , he helps Chaz train to challenge Gyms .
+
In addition to the Knuckle Badge, Brawly gives out TM08 (Bulk Up ) when defeated.
+
Brawly also appears in Pokémon Black 2 and White 2 , taking part in the Pokémon World Tournament . He can be faced in the Hoenn Leaders , Type Expert , and World Leaders Tournaments .
+
+
+
Leader Brawly R S OR AS / The Big Hit BrawlyE
+
+
Strategy
+Direct physical action!
+Trainer's Pokémon
+Fighting Pokémon rule!
+Self-Introduction
+The world awaits me as the next big wave!R S E
+The world awaits me as the next big wave in training!OR AS
+
Pokémon
+
+
Brawly uses two Super Potions .
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Ability:
+
Held item:
+
None
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Ability:
+
Held item:
+
None
+
+
+
+
+
+
+
+
+
+
+
+
+
Brawly uses two Super Potions in the Gym battle, and three Full Restores in the rematches. All rematches are double battles.
+
+
Gym battle
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Ability:
+
Held item:
+
None
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Ability:
+
Held item:
+
None
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Ability:
+
Held item:
+
None
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Ability:
+
Held item:
+
None
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Second rematch
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Ability:
+
Held item:
+
None
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Ability:
+
Held item:
+
None
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Third rematch
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Ability:
+
Held item:
+
None
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Ability:
+
Held item:
+
None
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Ability:
+
Held item:
+
None
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Fourth rematch onwards
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Ability:
+
Held item:
+
None
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Ability:
+
Held item:
+
None
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Ability:
+
Held item:
+
None
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Ability:
+
Held item:
+
None
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Brawly uses three of these Pokémon in Single Battles , four in Double and Rotation Battles , and all six in Triple Battles . Brawly will always lead with his signature Pokémon, Hariyama .
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Ability:
+
Held item:
+
None
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Ability:
+
Held item:
+
None
+
+
+
+
+
+
+
+
+
+
+
+
In the spin-off games
+
+
Main article: Brawly (Masters)
+
Brawly forms a sync pair with Makuhita and its evolved form Hariyama in Pokémon Masters EX . Brawly became a playable sync pair since the game's release.
+
+
+
Gallery
+
Artwork
+
+
Sprites and models
+
+
Quotes
+
Main article: Brawly/Quotes
+
In animation
+
Pokémon the Series
+
Brawly in Pokémon the Series: Ruby and Sapphire
+
History
+
Brawly once trained with Chuck , a Gym Leader from Johto . Brawly teaches many of the locals how to surf as well as how to train Pokémon. Many of his pupils at the Gym are surfers like himself.
+
Brawly debuted in the Pokémon the Series: Ruby and Sapphire episode Brave the Wave . Ash became extremely annoyed when Brawly started constantly postponing their Gym battle in favor of going surfing. As such, he interrupted their morning surf session, but Brawly was unfazed by this and even helped Ash recover Pikachu from Team Rocket .
+
After seeing Pikachu send Team Rocket blasting off, Brawly offered Ash a Gym challenge. Ash eagerly accepted and the pair walked over to the Dewford Gym battlefield. Taillow took on Brawly's Machop in the first round, but it was defeated by a single Cross Chop . Treecko managed to defeat Machop with its speed and a direct Pound attack. Brawly then defeated Ash with his newly evolved Hariyama , and in part because of Ash's own arrogance.
+
Afterwards, Ash caught up with Brawly on the beach, and Brawly explained the importance of his surf training to his battling strategy. Ash took Brawly's advice and trained for several weeks on Dewford Island in anticipation of a rematch . Ash even went so far as to copy Brawly's wave-training to teach his own Pokémon to dodge and resist attacks.
+
In A Meditite Fight! , Brawly interrupted Ash's battle against his student Shauna because of a brewing storm. Brawly led everyone, some wild Pokémon , and even Team Rocket to a cave on the shore to wait for the storm to pass. When the storm ended, Team Rocket attempted to steal Pikachu, but Brawly's Hariyama quickly sent the trio blasting off. Afterwards, Brawly refereed a match between Ash and Shauna. While Ash won, Brawly was thrilled to see Shauna had connected with her Meditite and officially made her one of his apprentices. He also agreed to a rematch against Ash at an islet off the coast of Dewford. Using his Pokémon's new techniques and his newly caught Corphish , Ash was finally able to claim the Knuckle Badge in Just One of the Geysers! .
+
He reappeared in flashbacks in Whiscash and Ash and Wheel of Frontier .
+
+
Character
+
Brawly is calm and approachable. He also has a great respect for nature, as revealed in A Meditite Fight! .
+
Like his mentor Chuck , Brawly's battle style is based on focus. At first, Ash was unable to realize that Brawly's surf training had helped him develop his Pokémon's unique dodges and concentrated balance techniques. Surfing has taught them to concentrate their center of gravity by bending their legs, while their upper bodies are prepared to launch or fend off an attack.
+
+
Pokémon
+
This lsiting is of Brawly's known Pokémon in Pokémon the Series :
+
+
+
+
Machop
+
+
+
+
+
Machop was the first Pokémon Brawly used against Ash in both the first Gym battle and the rematch . During the first match, it was used against Taillow . Although Taillow kept using Wing Attack and hitting it, Machop kept getting up and eventually managed to knock Taillow out with a Cross Chop. Then, Ash used Treecko , which was finally able to defeat it.
+
In Ash and Brawly's rematch, Machop was again used first. It began to overpower Treecko, but fell to Ash's newly-caught Corphish .
+
Machop's known moves are Cross Chop and Karate Chop .
+
+
+
+
+
+
+
+
Makuhita → Hariyama
+
+
+
+
Main article: Brawly's Hariyama
+
+
Hariyama first appeared as a Makuhita . During a Gym battle with Treecko , it evolved into Hariyama and defeated Treecko. After helping the gang to escape from a violent storm, Ash had his rematch against Brawly. Hariyama was able to defeat Corphish and almost defeated Treecko, but thanks to Ash's newly developed strategy, Treecko was able to defeat Hariyama after a fierce battle.
+
+
+
+
+
+
Voice actors
+
+
GOTCHA!
+
Brawly briefly appeared in GOTCHA! .
+
+
In the manga
+
Pokémon Adventures
+
Brawly in Pokémon Adventures
+
History
+
Past
+
As in the Generation III games , Brawly used to train with Bruno .
+
+
+
Brawly first appears surfing in Dewford Town, when Sapphire 's Lorry sneezes, causing a giant wave. Sapphire apologizes for the incident, but Brawly states that it was all right, as he enjoyed surfing on the wave. He then reveals himself to be the Gym Leader, much to Sapphire's surprise. He warns Sapphire to challenge him before he goes on a days-long trip the next day. Sapphire promises and heads into Granite Cave to train for her Gym battle in the morning. After Sapphire finishes her training, both have their battle at the Dewford Gym. Sapphire manages to easily defeat Brawly's first Pokémon, but she struggles with his Makuhita . With the power of Jū, Brawly counters many of Sapphire's attacks, which eventually leads into his Makuhita evolving into Hariyama . Sapphire comes out the victor when she uses her own variation of Jū to counter Hariyama, allowing her to defeat it and earn the Knuckle Badge.
+
Later, Brawly and the other Gym Leaders are called by Flannery to meet in Fortree City . They have a discussion on Team Magma and Team Aqua about whether or not one of the teams is evil and the other is good. As a surfer, Brawly sides with Team Aqua, since their goal of expanding the sea means he has more places to surf.
+
+
Brawly in the thirteenth chapter
+
When Groudon and Kyogre are awakened, they begin causing droughts and downpours throughout Hoenn. Brawly and Roxanne are sent to the drought-plagued areas to face Groudon in battle. Despite their best efforts, Groudon proves to be too powerful for any of their attacks to damage it. They are later assisted by Wallace , who also participates in the battle to stop Groudon, but all three are interrupted by the Three Fires of Team Magma, Blaise , Tabitha , and Courtney . The three grab Brawly, Roxanne, and Wallace and take them to Lilycove City to prevent the Gym Leaders from stopping Groudon any further. Brawly is taken to Lilycove Museum , where Blaise faces him in battle. With his illusions, Blaise scares Brawly by making it so that the paintings in the museum appear to be coming to life. Having learned the secrets of Gō from his trip with Bruno, Brawly uses force to break through the illusions and defeats Blaise.
+
After both Team Magma and Team Aqua are defeated and Groudon and Kyogre returned to their deep slumber, Brawly celebrated the victory with his allies and thanked Sapphire and Ruby for their assistance in the battle.
+
+
+
Brawly, along with various people from around Hoenn, is called to Sootopolis City to assist in stopping Grand Meteor Delta , a giant meteoroid threatening to destroy the planet. When the plan to attack Grand Meteor Delta starts, Brawly and the others have their Pokémon attack the meteoroid at the same time. This, combined with the might of Mega Rayquaza , successfully shatters Grand Meteor Delta into pieces.
+
+
Character
+
Brawly is an avid surfer. Prior to the Pokémon Adventures manga, he mastered the secrets of "subtlety" (Japanese: 柔 Jū; meaning soft ), a fighting style that makes use of turning an opponent's attack back at the user to damage them. He is also well versed in "brutality" (Japanese: 剛 Gō; meaning sturdy ), a fighting style he learned from his friend, Bruno , that has the user attacking the opponent head-on.
+
+
Pokémon
+
This listing is for Brawly's Pokémon in the Pokémon Adventures manga.
+
+
+
+
Makuhita → Hariyama ♂
+
+
+
+
Main article: Brawly's Hariyama
+
+
Hariyama is Brawly's first known Pokémon. He debuted as a Makuhita surfing with his Trainer. Later, he evolved in Brawly's Gym battle against Sapphire , but it wasn't enough to win the battle. Since then, he has been used in several other battles.
+
+
+
+
+
+
+
+
Machop → Machoke ♂
+
+
+
+
+
Machoke is Brawly's second known Pokémon. He debuted as a Machop in Brawly's battle against Sapphire , where he was easily defeated by her Chic and switched out to Makuhita. Later, he was revealed to have evolved into a Machoke when he and Brawly went to the Gym Leader meeting in Fortree City. During the battle against Groudon , Machoke was used to battle the Continent Pokémon, but was defeated by Thunder . During the battle against Blaise , Machoke held his own until the illusions caused him to become scared and run away.
+
Machoke's know moves are Focus Punch and Revenge , and his Ability is Guts .
+
+
+
+
+
+
Pokémon Ruby-Sapphire
+
Brawly in Pokémon Pocket Monsters
+
Brawly appeared in The Haunted Gym . He first appeared as Sableye's illusion when it was navigating Red and his Pokémon in the dark Dewford Gym . The group thought that Brawly was real when he was flexing his muscles but it turned out to be a poster Sableye put up. As the group went after Sableye after tricking them into believing that it was Brawly, they saw the real Brawly stuck in a Pelipper -shaped seat. Red and the Pokémon worked together to get him off and were successful. Brawly then thanked them in doing so and laughed at Clefairy after he got stuck in the seat.
+
+
Pokémon
+
+
+
Sableye
+
+
+
+
+
Sableye is Brawly's only known Pokémon. It is considered an unusual choice for him as it was not a Fighting-type Pokémon and it is immune to Fighting moves. Due to the Dewford Gym being dark, Sableye helped Red and his Pokémon navigate through. Sableye then tricked them into believing that Brawly was there but it turned out that Sableye was putting up a poster of him flexing his muscles. When Sableye did so again but this time, showing the group a doll, it ran off and the group chased after it. Clefairy found Sableye with the real Brawly when he kicked down a door in one of the rooms. It turned out that Sableye was feeding Brawly when he was stuck in a Pelipper -shaped seat. As the group freed Brawly from being stuck, Sableye and Brawly laughed at Clefairy when he became stuck in the seat.
+
None of Sableye's moves are known.
+
+
+
+
+
+
In the TCG
+
This listing is of cards mentioning or featuring Brawly or his Pokémon in the Pokémon Trading Card Game .
+
+
+
Trivia
+
Brawly is a Fighting-type Trainer with a pastime involving water, in comparison with Crasher Wake , a Water-type Trainer with a pastime involving fighting. Coincidentally, they both wear clothes with the colors orange, blue, black, and white.
+In Pokémon Ruby and Sapphire , a Black Belt training himself on Route 127 says that Brawly used to train with "Bruno in Kanto". Similarly, in Pokémon FireRed and LeafGreen , a Black Belt in Sevault Canyon on Seven Island says that Bruno of the Indigo League 's Elite Four used to train with an old friend there, that friend being Brawly. In Pokémon Omega Ruby and Alpha Sapphire , a television program states that Brawly moved from Kanto to surf year-round in Hoenn.
+Before being battled in Pokémon Omega Ruby and Alpha Sapphire , if the language is set to French, Brawly says, "J'ai découvert le secret de la vraie puissance en fixant un Nautile pendant des jours et des jours… ", a direct reference to Twitch Plays Pokémon .
+In Ruby, Sapphire, and Emerald , Brawly is the only Gym Leader who does not use a fully evolved Pokémon in Gym battles .
+
Names
+
+
+
+
+Language
+
+Name
+
+Origin
+
+
+Japanese
+
+トウキ Touki
+
+From 当帰 tōki (Japanese angelica ) and 闘気 tōki (fighting spirit)
+
+
+English, Latin American Spanish, Indonesian, Brazilian Portuguese
+
+Brawly
+
+From brawl
+
+
+German
+
+Kamillo
+
+From Kampf (battle)
+
+
+European Spanish
+
+Marcial
+
+From marcial (martial)
+
+
+French
+
+Bastien
+
+From baston (fight)
+
+
+Italian
+
+Rudi
+
+From rude (tough; rough)
+
+
+Korean
+
+철구 Cheolgu
+
+Possibly from 철구 (鐵球) cheolgu (wrecking ball )
+
+
+유민기 Yu Min-gi [ n 1]
+
+Possibly from 유영 (游泳) yuyeong (swimming), 민첩 (敏捷) mincheop (agile), and 기 (氣) gi (qi )
+
+
+Chinese (Traditional)
+
+藤樹 Téngshù / Tàhngsyuh
+
+From the Japanese name 藤樹 Tōki
+
+
+Chinese (Simplified)
+
+藤树 Téngshù
+
+
+Russian
+
+Броули Brouli
+
+Transcription of his English name
+
+
+Thai
+
+โทกิ Thoki
+
+Transcription of his Japanese name
+
+
+Vietnamese
+
+Toki
+
+Transcription of his Japanese name
+
+
+
+
Notes
+
+
References
+
+
Related articles
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Navigation menu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/public/boss-sprites/ruby/flannery.png b/frontend/public/boss-sprites/ruby/flannery.png
new file mode 100644
index 0000000..af106db
Binary files /dev/null and b/frontend/public/boss-sprites/ruby/flannery.png differ
diff --git a/frontend/public/boss-sprites/ruby/norman.png b/frontend/public/boss-sprites/ruby/norman.png
new file mode 100644
index 0000000..1d1c04a
Binary files /dev/null and b/frontend/public/boss-sprites/ruby/norman.png differ
diff --git a/frontend/public/boss-sprites/ruby/roxanne.png b/frontend/public/boss-sprites/ruby/roxanne.png
new file mode 100644
index 0000000..e9c4e89
Binary files /dev/null and b/frontend/public/boss-sprites/ruby/roxanne.png differ
diff --git a/frontend/public/boss-sprites/ruby/tate--lisa.png b/frontend/public/boss-sprites/ruby/tate--lisa.png
new file mode 100644
index 0000000..a25d13b
Binary files /dev/null and b/frontend/public/boss-sprites/ruby/tate--lisa.png differ
diff --git a/frontend/public/boss-sprites/ruby/wallace.png b/frontend/public/boss-sprites/ruby/wallace.png
new file mode 100644
index 0000000..815a93d
Binary files /dev/null and b/frontend/public/boss-sprites/ruby/wallace.png differ
diff --git a/frontend/public/boss-sprites/ruby/wattson.png b/frontend/public/boss-sprites/ruby/wattson.png
new file mode 100644
index 0000000..ad19d27
Binary files /dev/null and b/frontend/public/boss-sprites/ruby/wattson.png differ
diff --git a/frontend/public/boss-sprites/ruby/winona.png b/frontend/public/boss-sprites/ruby/winona.png
new file mode 100644
index 0000000..6fa69b2
Binary files /dev/null and b/frontend/public/boss-sprites/ruby/winona.png differ
diff --git a/frontend/public/boss-sprites/yellow/blaine.png b/frontend/public/boss-sprites/yellow/blaine.png
new file mode 100644
index 0000000..85b3130
Binary files /dev/null and b/frontend/public/boss-sprites/yellow/blaine.png differ
diff --git a/frontend/public/boss-sprites/yellow/brock.png b/frontend/public/boss-sprites/yellow/brock.png
new file mode 100644
index 0000000..66660ce
Binary files /dev/null and b/frontend/public/boss-sprites/yellow/brock.png differ
diff --git a/frontend/public/boss-sprites/yellow/erika.png b/frontend/public/boss-sprites/yellow/erika.png
new file mode 100644
index 0000000..e6feb6c
Binary files /dev/null and b/frontend/public/boss-sprites/yellow/erika.png differ
diff --git a/frontend/public/boss-sprites/yellow/giovanni.png b/frontend/public/boss-sprites/yellow/giovanni.png
new file mode 100644
index 0000000..cc2120c
Binary files /dev/null and b/frontend/public/boss-sprites/yellow/giovanni.png differ
diff --git a/frontend/public/boss-sprites/yellow/koga.png b/frontend/public/boss-sprites/yellow/koga.png
new file mode 100644
index 0000000..95647f4
Binary files /dev/null and b/frontend/public/boss-sprites/yellow/koga.png differ
diff --git a/frontend/public/boss-sprites/yellow/lt-surge.png b/frontend/public/boss-sprites/yellow/lt-surge.png
new file mode 100644
index 0000000..a36e9de
Binary files /dev/null and b/frontend/public/boss-sprites/yellow/lt-surge.png differ
diff --git a/frontend/public/boss-sprites/yellow/misty.png b/frontend/public/boss-sprites/yellow/misty.png
new file mode 100644
index 0000000..b790e63
Binary files /dev/null and b/frontend/public/boss-sprites/yellow/misty.png differ
diff --git a/frontend/public/boss-sprites/yellow/sabrina.png b/frontend/public/boss-sprites/yellow/sabrina.png
new file mode 100644
index 0000000..3984c13
Binary files /dev/null and b/frontend/public/boss-sprites/yellow/sabrina.png differ