Add starter, gift, and fossil encounters to seed data

Define special encounter data (starters, gifts, fossils) in a new
special_encounters module and merge them into route seed JSON during
generation. Add new route locations to ROUTE_ORDER for cities that
previously had no wild encounters (Saffron City, Pewter City, etc.).
Show colored method badges in the EncounterModal UI for special
encounter types.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-07 13:50:49 +01:00
parent 73d4a1831c
commit d488c252b8
21 changed files with 7430 additions and 5384 deletions

View File

@@ -42,6 +42,30 @@
"encounter_rate": 50,
"min_level": 15,
"max_level": 15
},
{
"national_dex": 1,
"pokemon_name": "bulbasaur",
"method": "starter",
"encounter_rate": 100,
"min_level": 5,
"max_level": 5
},
{
"national_dex": 4,
"pokemon_name": "charmander",
"method": "starter",
"encounter_rate": 100,
"min_level": 5,
"max_level": 5
},
{
"national_dex": 7,
"pokemon_name": "squirtle",
"method": "starter",
"encounter_rate": 100,
"min_level": 5,
"max_level": 5
}
]
},
@@ -445,6 +469,14 @@
"encounter_rate": 25,
"min_level": 6,
"max_level": 12
},
{
"national_dex": 129,
"pokemon_name": "magikarp",
"method": "gift",
"encounter_rate": 100,
"min_level": 5,
"max_level": 5
}
]
},
@@ -1338,12 +1370,50 @@
"encounter_rate": 50,
"min_level": 15,
"max_level": 15
},
{
"national_dex": 133,
"pokemon_name": "eevee",
"method": "gift",
"encounter_rate": 100,
"min_level": 25,
"max_level": 25
}
]
},
{
"name": "Saffron City",
"order": 31,
"encounters": [
{
"national_dex": 131,
"pokemon_name": "lapras",
"method": "gift",
"encounter_rate": 100,
"min_level": 25,
"max_level": 25
},
{
"national_dex": 106,
"pokemon_name": "hitmonlee",
"method": "gift",
"encounter_rate": 100,
"min_level": 25,
"max_level": 25
},
{
"national_dex": 107,
"pokemon_name": "hitmonchan",
"method": "gift",
"encounter_rate": 100,
"min_level": 25,
"max_level": 25
}
]
},
{
"name": "Route 16",
"order": 31,
"order": 32,
"encounters": [
{
"national_dex": 21,
@@ -1381,7 +1451,7 @@
},
{
"name": "Route 17",
"order": 32,
"order": 33,
"encounters": [
{
"national_dex": 129,
@@ -1475,7 +1545,7 @@
},
{
"name": "Route 18",
"order": 33,
"order": 34,
"encounters": [
{
"national_dex": 129,
@@ -1569,7 +1639,7 @@
},
{
"name": "Fuchsia City",
"order": 34,
"order": 35,
"encounters": [
{
"national_dex": 129,
@@ -1631,12 +1701,12 @@
},
{
"name": "Safari Zone",
"order": 35,
"order": 36,
"encounters": [],
"children": [
{
"name": "Safari Zone (Middle)",
"order": 36,
"order": 37,
"encounters": [
{
"national_dex": 129,
@@ -1770,7 +1840,7 @@
},
{
"name": "Safari Zone (Area 1 East)",
"order": 37,
"order": 38,
"encounters": [
{
"national_dex": 129,
@@ -1904,7 +1974,7 @@
},
{
"name": "Safari Zone (Area 2 North)",
"order": 38,
"order": 39,
"encounters": [
{
"national_dex": 129,
@@ -2038,7 +2108,7 @@
},
{
"name": "Safari Zone (Area 3 West)",
"order": 39,
"order": 40,
"encounters": [
{
"national_dex": 129,
@@ -2174,7 +2244,7 @@
},
{
"name": "Route 15",
"order": 40,
"order": 41,
"encounters": [
{
"national_dex": 69,
@@ -2228,7 +2298,7 @@
},
{
"name": "Route 14",
"order": 41,
"order": 42,
"encounters": [
{
"national_dex": 69,
@@ -2282,7 +2352,7 @@
},
{
"name": "Route 13",
"order": 42,
"order": 43,
"encounters": [
{
"national_dex": 129,
@@ -2384,7 +2454,7 @@
},
{
"name": "Route 12",
"order": 43,
"order": 44,
"encounters": [
{
"national_dex": 129,
@@ -2478,12 +2548,12 @@
},
{
"name": "Pokemon Tower",
"order": 44,
"order": 45,
"encounters": [],
"children": [
{
"name": "Pokemon Tower (3F)",
"order": 45,
"order": 46,
"encounters": [
{
"national_dex": 92,
@@ -2513,36 +2583,6 @@
},
{
"name": "Pokemon Tower (4F)",
"order": 46,
"encounters": [
{
"national_dex": 92,
"pokemon_name": "gastly",
"method": "walk",
"encounter_rate": 86,
"min_level": 18,
"max_level": 24
},
{
"national_dex": 104,
"pokemon_name": "cubone",
"method": "walk",
"encounter_rate": 9,
"min_level": 20,
"max_level": 22
},
{
"national_dex": 93,
"pokemon_name": "haunter",
"method": "walk",
"encounter_rate": 5,
"min_level": 25,
"max_level": 25
}
]
},
{
"name": "Pokemon Tower (5F)",
"order": 47,
"encounters": [
{
@@ -2572,8 +2612,38 @@
]
},
{
"name": "Pokemon Tower (6F)",
"name": "Pokemon Tower (5F)",
"order": 48,
"encounters": [
{
"national_dex": 92,
"pokemon_name": "gastly",
"method": "walk",
"encounter_rate": 86,
"min_level": 18,
"max_level": 24
},
{
"national_dex": 104,
"pokemon_name": "cubone",
"method": "walk",
"encounter_rate": 9,
"min_level": 20,
"max_level": 22
},
{
"national_dex": 93,
"pokemon_name": "haunter",
"method": "walk",
"encounter_rate": 5,
"min_level": 25,
"max_level": 25
}
]
},
{
"name": "Pokemon Tower (6F)",
"order": 49,
"encounters": [
{
"national_dex": 92,
@@ -2603,7 +2673,7 @@
},
{
"name": "Pokemon Tower (7F)",
"order": 49,
"order": 50,
"encounters": [
{
"national_dex": 92,
@@ -2635,76 +2705,6 @@
},
{
"name": "Sea Route 19",
"order": 50,
"encounters": [
{
"national_dex": 129,
"pokemon_name": "magikarp",
"method": "old-rod",
"encounter_rate": 100,
"min_level": 5,
"max_level": 5
},
{
"national_dex": 72,
"pokemon_name": "tentacool",
"method": "surf",
"encounter_rate": 100,
"min_level": 5,
"max_level": 40
},
{
"national_dex": 118,
"pokemon_name": "goldeen",
"method": "good-rod",
"encounter_rate": 50,
"min_level": 10,
"max_level": 10
},
{
"national_dex": 60,
"pokemon_name": "poliwag",
"method": "good-rod",
"encounter_rate": 50,
"min_level": 10,
"max_level": 10
},
{
"national_dex": 118,
"pokemon_name": "goldeen",
"method": "super-rod",
"encounter_rate": 25,
"min_level": 15,
"max_level": 15
},
{
"national_dex": 116,
"pokemon_name": "horsea",
"method": "super-rod",
"encounter_rate": 25,
"min_level": 15,
"max_level": 15
},
{
"national_dex": 90,
"pokemon_name": "shellder",
"method": "super-rod",
"encounter_rate": 25,
"min_level": 15,
"max_level": 15
},
{
"national_dex": 120,
"pokemon_name": "staryu",
"method": "super-rod",
"encounter_rate": 25,
"min_level": 15,
"max_level": 15
}
]
},
{
"name": "Sea Route 20",
"order": 51,
"encounters": [
{
@@ -2774,13 +2774,83 @@
]
},
{
"name": "Seafoam Islands",
"name": "Sea Route 20",
"order": 52,
"encounters": [
{
"national_dex": 129,
"pokemon_name": "magikarp",
"method": "old-rod",
"encounter_rate": 100,
"min_level": 5,
"max_level": 5
},
{
"national_dex": 72,
"pokemon_name": "tentacool",
"method": "surf",
"encounter_rate": 100,
"min_level": 5,
"max_level": 40
},
{
"national_dex": 118,
"pokemon_name": "goldeen",
"method": "good-rod",
"encounter_rate": 50,
"min_level": 10,
"max_level": 10
},
{
"national_dex": 60,
"pokemon_name": "poliwag",
"method": "good-rod",
"encounter_rate": 50,
"min_level": 10,
"max_level": 10
},
{
"national_dex": 118,
"pokemon_name": "goldeen",
"method": "super-rod",
"encounter_rate": 25,
"min_level": 15,
"max_level": 15
},
{
"national_dex": 116,
"pokemon_name": "horsea",
"method": "super-rod",
"encounter_rate": 25,
"min_level": 15,
"max_level": 15
},
{
"national_dex": 90,
"pokemon_name": "shellder",
"method": "super-rod",
"encounter_rate": 25,
"min_level": 15,
"max_level": 15
},
{
"national_dex": 120,
"pokemon_name": "staryu",
"method": "super-rod",
"encounter_rate": 25,
"min_level": 15,
"max_level": 15
}
]
},
{
"name": "Seafoam Islands",
"order": 53,
"encounters": [],
"children": [
{
"name": "Seafoam Islands (1F)",
"order": 53,
"order": 54,
"encounters": [
{
"national_dex": 98,
@@ -2850,7 +2920,7 @@
},
{
"name": "Seafoam Islands (B1F)",
"order": 54,
"order": 55,
"encounters": [
{
"national_dex": 98,
@@ -2912,7 +2982,7 @@
},
{
"name": "Seafoam Islands (B2F)",
"order": 55,
"order": 56,
"encounters": [
{
"national_dex": 86,
@@ -2974,7 +3044,7 @@
},
{
"name": "Seafoam Islands (B3F)",
"order": 56,
"order": 57,
"encounters": [
{
"national_dex": 129,
@@ -3084,7 +3154,7 @@
},
{
"name": "Seafoam Islands (B4F)",
"order": 57,
"order": 58,
"encounters": [
{
"national_dex": 129,
@@ -3196,7 +3266,7 @@
},
{
"name": "Cinnabar Island",
"order": 58,
"order": 59,
"encounters": [
{
"national_dex": 129,
@@ -3253,17 +3323,41 @@
"encounter_rate": 25,
"min_level": 15,
"max_level": 15
},
{
"national_dex": 138,
"pokemon_name": "omanyte",
"method": "fossil",
"encounter_rate": 100,
"min_level": 5,
"max_level": 5
},
{
"national_dex": 140,
"pokemon_name": "kabuto",
"method": "fossil",
"encounter_rate": 100,
"min_level": 5,
"max_level": 5
},
{
"national_dex": 142,
"pokemon_name": "aerodactyl",
"method": "fossil",
"encounter_rate": 100,
"min_level": 5,
"max_level": 5
}
]
},
{
"name": "Pokemon Mansion",
"order": 59,
"order": 60,
"encounters": [],
"children": [
{
"name": "Pokemon Mansion (1F)",
"order": 60,
"order": 61,
"encounters": [
{
"national_dex": 88,
@@ -3317,7 +3411,7 @@
},
{
"name": "Pokemon Mansion (2F)",
"order": 61,
"order": 62,
"encounters": [
{
"national_dex": 88,
@@ -3371,7 +3465,7 @@
},
{
"name": "Pokemon Mansion (3F)",
"order": 62,
"order": 63,
"encounters": [
{
"national_dex": 88,
@@ -3433,7 +3527,7 @@
},
{
"name": "Pokemon Mansion (B1F)",
"order": 63,
"order": 64,
"encounters": [
{
"national_dex": 88,
@@ -3497,7 +3591,7 @@
},
{
"name": "Sea Route 21",
"order": 64,
"order": 65,
"encounters": [
{
"national_dex": 129,
@@ -3607,7 +3701,7 @@
},
{
"name": "Route 23",
"order": 65,
"order": 66,
"encounters": [
{
"national_dex": 129,
@@ -3709,12 +3803,12 @@
},
{
"name": "Victory Road 2",
"order": 66,
"order": 67,
"encounters": [],
"children": [
{
"name": "Victory Road 2 (1F)",
"order": 67,
"order": 68,
"encounters": [
{
"national_dex": 95,
@@ -3784,7 +3878,7 @@
},
{
"name": "Victory Road 2 (2F)",
"order": 68,
"order": 69,
"encounters": [
{
"national_dex": 95,
@@ -3854,7 +3948,7 @@
},
{
"name": "Victory Road 2 (3F)",
"order": 69,
"order": 70,
"encounters": [
{
"national_dex": 74,
@@ -3926,12 +4020,12 @@
},
{
"name": "Cerulean Cave",
"order": 70,
"order": 71,
"encounters": [],
"children": [
{
"name": "Cerulean Cave (1F)",
"order": 71,
"order": 72,
"encounters": [
{
"national_dex": 129,
@@ -4073,7 +4167,7 @@
},
{
"name": "Cerulean Cave (2F)",
"order": 72,
"order": 73,
"encounters": [
{
"national_dex": 85,
@@ -4151,7 +4245,7 @@
},
{
"name": "Cerulean Cave (B1F)",
"order": 73,
"order": 74,
"encounters": [
{
"national_dex": 129,
@@ -4276,5 +4370,19 @@
]
}
]
},
{
"name": "Water Labyrinth",
"order": 75,
"encounters": [
{
"national_dex": 175,
"pokemon_name": "togepi",
"method": "gift",
"encounter_rate": 100,
"min_level": 5,
"max_level": 5
}
]
}
]