Add per-condition encounter rates to seed data
Some checks failed
CI / backend-lint (pull_request) Successful in 9s
CI / actions-lint (pull_request) Failing after 6s
CI / frontend-lint (pull_request) Successful in 21s

Add a `condition` column to RouteEncounter so encounters can store
per-condition rates (time of day, season, weather) instead of flattening
to max(). Update the seed loader, API schemas, and frontend to support
the new `conditions` dict format in seed JSON.

Port the PoC branch's condition-aware EncounterModal UI with filter
tabs that let players see encounter rates for specific conditions.
Add horde/SOS as distinct encounter methods with their own badges.

Update the import tool to extract per-condition rates instead of
flattening, and add a merge script (tools/merge-conditions.py) that
enriches existing curated seed files with condition data from PokeDB.

Seed data updated for 22 games (5,684 encounters):
- Gen 2: Gold, Silver, Crystal (morning/day/night)
- Gen 4: HG, SS, Diamond, Pearl, Platinum, BD, SP (morning/day/night)
- Gen 5: Black, White, Black 2, White 2 (spring/summer/autumn/winter)
- Gen 7: Sun, Moon, Ultra Sun, Ultra Moon (day/night)
- Gen 8: Sword, Shield (weather)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-17 18:52:20 +01:00
parent d0fff248fe
commit 5240236759
36 changed files with 36715 additions and 11587 deletions

View File

@@ -1486,7 +1486,7 @@
]
},
{
"name": "Relic Castle (Volcarona\u2019s Room and Room Outside)",
"name": "Relic Castle (Volcaronas Room and Room Outside)",
"order": 30,
"encounters": [
{
@@ -2971,25 +2971,40 @@
"pokeapi_id": 536,
"pokemon_name": "Palpitoad",
"method": "walk",
"encounter_rate": 40,
"encounter_rate": null,
"min_level": 30,
"max_level": 33
"max_level": 33,
"conditions": {
"spring": 40,
"summer": 40,
"autumn": 40
}
},
{
"pokeapi_id": 616,
"pokemon_name": "Shelmet",
"method": "walk",
"encounter_rate": 40,
"encounter_rate": null,
"min_level": 30,
"max_level": 33
"max_level": 33,
"conditions": {
"spring": 40,
"summer": 40,
"autumn": 40
}
},
{
"pokeapi_id": 618,
"pokemon_name": "Stunfisk",
"method": "walk",
"encounter_rate": 20,
"encounter_rate": null,
"min_level": 31,
"max_level": 32
"max_level": 32,
"conditions": {
"spring": 20,
"summer": 20,
"autumn": 20
}
},
{
"pokeapi_id": 340,
@@ -3439,25 +3454,40 @@
"pokeapi_id": 536,
"pokemon_name": "Palpitoad",
"method": "walk",
"encounter_rate": 40,
"encounter_rate": null,
"min_level": 30,
"max_level": 33
"max_level": 33,
"conditions": {
"spring": 40,
"summer": 40,
"autumn": 40
}
},
{
"pokeapi_id": 616,
"pokemon_name": "Shelmet",
"method": "walk",
"encounter_rate": 40,
"encounter_rate": null,
"min_level": 30,
"max_level": 33
"max_level": 33,
"conditions": {
"spring": 40,
"summer": 40,
"autumn": 40
}
},
{
"pokeapi_id": 618,
"pokemon_name": "Stunfisk",
"method": "walk",
"encounter_rate": 20,
"encounter_rate": null,
"min_level": 31,
"max_level": 32
"max_level": 32,
"conditions": {
"spring": 20,
"summer": 20,
"autumn": 20
}
},
{
"pokeapi_id": 340,
@@ -5630,9 +5660,12 @@
"pokeapi_id": 446,
"pokemon_name": "Munchlax",
"method": "trade",
"encounter_rate": 100,
"encounter_rate": null,
"min_level": 60,
"max_level": 60
"max_level": 60,
"conditions": {
"summer": 100
}
},
{
"pokeapi_id": 90,
@@ -5740,9 +5773,15 @@
"pokeapi_id": 320,
"pokemon_name": "Wailmer",
"method": "surf",
"encounter_rate": 90,
"encounter_rate": null,
"min_level": 25,
"max_level": 60
"max_level": 60,
"conditions": {
"spring": 90,
"summer": 90,
"autumn": 90,
"winter": 60
}
},
{
"pokeapi_id": 223,
@@ -5772,25 +5811,36 @@
"pokeapi_id": 458,
"pokemon_name": "Mantyke",
"method": "surf",
"encounter_rate": 30,
"encounter_rate": null,
"min_level": 25,
"max_level": 55
"max_level": 55,
"conditions": {
"spring": 30,
"summer": 30,
"autumn": 30
}
},
{
"pokeapi_id": 364,
"pokemon_name": "Sealeo",
"method": "surf",
"encounter_rate": 30,
"encounter_rate": null,
"min_level": 25,
"max_level": 60
"max_level": 60,
"conditions": {
"winter": 30
}
},
{
"pokeapi_id": 363,
"pokemon_name": "Spheal",
"method": "surf",
"encounter_rate": 30,
"encounter_rate": null,
"min_level": 25,
"max_level": 55
"max_level": 55,
"conditions": {
"winter": 30
}
},
{
"pokeapi_id": 279,
@@ -5812,9 +5862,14 @@
"pokeapi_id": 226,
"pokemon_name": "Mantine",
"method": "surf",
"encounter_rate": 5,
"encounter_rate": null,
"min_level": 25,
"max_level": 60
"max_level": 60,
"conditions": {
"spring": 5,
"summer": 5,
"autumn": 5
}
},
{
"pokeapi_id": 224,
@@ -5836,9 +5891,12 @@
"pokeapi_id": 365,
"pokemon_name": "Walrein",
"method": "surf",
"encounter_rate": 5,
"encounter_rate": null,
"min_level": 25,
"max_level": 70
"max_level": 70,
"conditions": {
"winter": 5
}
}
]
},