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": 40,
"min_level": 10,
"max_level": 20
},
{
"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
}
]
},
@@ -461,6 +485,14 @@
"encounter_rate": 15,
"min_level": 8,
"max_level": 10
},
{
"national_dex": 129,
"pokemon_name": "magikarp",
"method": "gift",
"encounter_rate": 100,
"min_level": 5,
"max_level": 5
}
]
},
@@ -1434,12 +1466,50 @@
"encounter_rate": 50,
"min_level": 10,
"max_level": 10
},
{
"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": 84,
@@ -1485,7 +1555,7 @@
},
{
"name": "Route 17",
"order": 32,
"order": 33,
"encounters": [
{
"national_dex": 129,
@@ -1563,7 +1633,7 @@
},
{
"name": "Route 18",
"order": 33,
"order": 34,
"encounters": [
{
"national_dex": 129,
@@ -1649,7 +1719,7 @@
},
{
"name": "Fuchsia City",
"order": 34,
"order": 35,
"encounters": [
{
"national_dex": 129,
@@ -1695,12 +1765,12 @@
},
{
"name": "Safari Zone",
"order": 35,
"order": 36,
"encounters": [],
"children": [
{
"name": "Safari Zone (Middle)",
"order": 36,
"order": 37,
"encounters": [
{
"national_dex": 129,
@@ -1826,7 +1896,7 @@
},
{
"name": "Safari Zone (Area 1 East)",
"order": 37,
"order": 38,
"encounters": [
{
"national_dex": 129,
@@ -1944,7 +2014,7 @@
},
{
"name": "Safari Zone (Area 2 North)",
"order": 38,
"order": 39,
"encounters": [
{
"national_dex": 129,
@@ -2062,7 +2132,7 @@
},
{
"name": "Safari Zone (Area 3 West)",
"order": 39,
"order": 40,
"encounters": [
{
"national_dex": 129,
@@ -2182,7 +2252,7 @@
},
{
"name": "Route 15",
"order": 40,
"order": 41,
"encounters": [
{
"national_dex": 69,
@@ -2244,7 +2314,7 @@
},
{
"name": "Route 14",
"order": 41,
"order": 42,
"encounters": [
{
"national_dex": 69,
@@ -2306,7 +2376,7 @@
},
{
"name": "Route 13",
"order": 42,
"order": 43,
"encounters": [
{
"national_dex": 129,
@@ -2432,7 +2502,7 @@
},
{
"name": "Route 12",
"order": 43,
"order": 44,
"encounters": [
{
"national_dex": 129,
@@ -2550,33 +2620,11 @@
},
{
"name": "Pokemon Tower",
"order": 44,
"order": 45,
"encounters": [],
"children": [
{
"name": "Pokemon Tower (3F)",
"order": 45,
"encounters": [
{
"national_dex": 92,
"pokemon_name": "gastly",
"method": "walk",
"encounter_rate": 95,
"min_level": 18,
"max_level": 25
},
{
"national_dex": 93,
"pokemon_name": "haunter",
"method": "walk",
"encounter_rate": 5,
"min_level": 20,
"max_level": 25
}
]
},
{
"name": "Pokemon Tower (4F)",
"order": 46,
"encounters": [
{
@@ -2598,8 +2646,30 @@
]
},
{
"name": "Pokemon Tower (5F)",
"name": "Pokemon Tower (4F)",
"order": 47,
"encounters": [
{
"national_dex": 92,
"pokemon_name": "gastly",
"method": "walk",
"encounter_rate": 95,
"min_level": 18,
"max_level": 25
},
{
"national_dex": 93,
"pokemon_name": "haunter",
"method": "walk",
"encounter_rate": 5,
"min_level": 20,
"max_level": 25
}
]
},
{
"name": "Pokemon Tower (5F)",
"order": 48,
"encounters": [
{
"national_dex": 92,
@@ -2629,7 +2699,7 @@
},
{
"name": "Pokemon Tower (6F)",
"order": 48,
"order": 49,
"encounters": [
{
"national_dex": 92,
@@ -2659,7 +2729,7 @@
},
{
"name": "Pokemon Tower (7F)",
"order": 49,
"order": 50,
"encounters": [
{
"national_dex": 92,
@@ -2691,7 +2761,7 @@
},
{
"name": "Sea Route 19",
"order": 50,
"order": 51,
"encounters": [
{
"national_dex": 129,
@@ -2753,7 +2823,7 @@
},
{
"name": "Sea Route 20",
"order": 51,
"order": 52,
"encounters": [
{
"national_dex": 129,
@@ -2815,12 +2885,12 @@
},
{
"name": "Seafoam Islands",
"order": 52,
"order": 53,
"encounters": [],
"children": [
{
"name": "Seafoam Islands (1F)",
"order": 53,
"order": 54,
"encounters": [
{
"national_dex": 41,
@@ -2858,7 +2928,7 @@
},
{
"name": "Seafoam Islands (B1F)",
"order": 54,
"order": 55,
"encounters": [
{
"national_dex": 41,
@@ -2912,7 +2982,7 @@
},
{
"name": "Seafoam Islands (B2F)",
"order": 55,
"order": 56,
"encounters": [
{
"national_dex": 41,
@@ -2974,7 +3044,7 @@
},
{
"name": "Seafoam Islands (B3F)",
"order": 56,
"order": 57,
"encounters": [
{
"national_dex": 129,
@@ -3092,7 +3162,7 @@
},
{
"name": "Seafoam Islands (B4F)",
"order": 57,
"order": 58,
"encounters": [
{
"national_dex": 129,
@@ -3212,7 +3282,7 @@
},
{
"name": "Cinnabar Island",
"order": 58,
"order": 59,
"encounters": [
{
"national_dex": 129,
@@ -3253,17 +3323,41 @@
"encounter_rate": 40,
"min_level": 15,
"max_level": 30
},
{
"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": 20,
@@ -3301,7 +3395,7 @@
},
{
"name": "Pokemon Mansion (2F)",
"order": 61,
"order": 62,
"encounters": [
{
"national_dex": 88,
@@ -3339,7 +3433,7 @@
},
{
"name": "Pokemon Mansion (3F)",
"order": 62,
"order": 63,
"encounters": [
{
"national_dex": 88,
@@ -3377,7 +3471,7 @@
},
{
"name": "Pokemon Mansion (B1F)",
"order": 63,
"order": 64,
"encounters": [
{
"national_dex": 88,
@@ -3417,7 +3511,7 @@
},
{
"name": "Sea Route 21",
"order": 64,
"order": 65,
"encounters": [
{
"national_dex": 129,
@@ -3511,7 +3605,7 @@
},
{
"name": "Route 23",
"order": 65,
"order": 66,
"encounters": [
{
"national_dex": 129,
@@ -3597,12 +3691,12 @@
},
{
"name": "Victory Road 2",
"order": 66,
"order": 67,
"encounters": [],
"children": [
{
"name": "Victory Road 2 (1F)",
"order": 67,
"order": 68,
"encounters": [
{
"national_dex": 74,
@@ -3640,7 +3734,7 @@
},
{
"name": "Victory Road 2 (2F)",
"order": 68,
"order": 69,
"encounters": [
{
"national_dex": 74,
@@ -3694,7 +3788,7 @@
},
{
"name": "Victory Road 2 (3F)",
"order": 69,
"order": 70,
"encounters": [
{
"national_dex": 74,
@@ -3742,12 +3836,12 @@
},
{
"name": "Cerulean Cave",
"order": 70,
"order": 71,
"encounters": [],
"children": [
{
"name": "Cerulean Cave (1F)",
"order": 71,
"order": 72,
"encounters": [
{
"national_dex": 129,
@@ -3857,7 +3951,7 @@
},
{
"name": "Cerulean Cave (2F)",
"order": 72,
"order": 73,
"encounters": [
{
"national_dex": 42,
@@ -3927,7 +4021,7 @@
},
{
"name": "Cerulean Cave (B1F)",
"order": 73,
"order": 74,
"encounters": [
{
"national_dex": 129,
@@ -4028,5 +4122,19 @@
]
}
]
},
{
"name": "Water Labyrinth",
"order": 75,
"encounters": [
{
"national_dex": 175,
"pokemon_name": "togepi",
"method": "gift",
"encounter_rate": 100,
"min_level": 5,
"max_level": 5
}
]
}
]