Fix duplicate sub-areas caused by PokeAPI casing (e.g. 1f vs 1F)

PokeAPI returns both lowercase and uppercase floor names as separate
sub-areas with identical encounter data, causing 649 duplicate routes
across all 22 seed files. Merged case-insensitive duplicates, keeping
the uppercase name and deduplicating encounters. Re-seed required.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-08 13:22:50 +01:00
parent be6c8e75be
commit bbac19677a
23 changed files with 530 additions and 38259 deletions

View File

@@ -1712,60 +1712,6 @@
}
]
},
{
"name": "Chargestone Cave (1f)",
"order": 32,
"encounters": [
{
"pokeapi_id": 595,
"pokemon_name": "Joltik",
"method": "walk",
"encounter_rate": 39,
"min_level": 25,
"max_level": 28
},
{
"pokeapi_id": 599,
"pokemon_name": "Klink",
"method": "walk",
"encounter_rate": 24,
"min_level": 26,
"max_level": 28
},
{
"pokeapi_id": 597,
"pokemon_name": "Ferroseed",
"method": "walk",
"encounter_rate": 20,
"min_level": 26,
"max_level": 27
},
{
"pokeapi_id": 299,
"pokemon_name": "Nosepass",
"method": "walk",
"encounter_rate": 10,
"min_level": 27,
"max_level": 27
},
{
"pokeapi_id": 525,
"pokemon_name": "Boldore",
"method": "walk",
"encounter_rate": 5,
"min_level": 25,
"max_level": 25
},
{
"pokeapi_id": 602,
"pokemon_name": "Tynamo",
"method": "walk",
"encounter_rate": 2,
"min_level": 28,
"max_level": 28
}
]
},
{
"name": "Chargestone Cave (B1F)",
"order": 33,
@@ -1820,60 +1766,6 @@
}
]
},
{
"name": "Chargestone Cave (B1f)",
"order": 33,
"encounters": [
{
"pokeapi_id": 595,
"pokemon_name": "Joltik",
"method": "walk",
"encounter_rate": 39,
"min_level": 28,
"max_level": 31
},
{
"pokeapi_id": 599,
"pokemon_name": "Klink",
"method": "walk",
"encounter_rate": 24,
"min_level": 29,
"max_level": 31
},
{
"pokeapi_id": 597,
"pokemon_name": "Ferroseed",
"method": "walk",
"encounter_rate": 20,
"min_level": 29,
"max_level": 30
},
{
"pokeapi_id": 299,
"pokemon_name": "Nosepass",
"method": "walk",
"encounter_rate": 10,
"min_level": 30,
"max_level": 30
},
{
"pokeapi_id": 525,
"pokemon_name": "Boldore",
"method": "walk",
"encounter_rate": 5,
"min_level": 28,
"max_level": 28
},
{
"pokeapi_id": 602,
"pokemon_name": "Tynamo",
"method": "walk",
"encounter_rate": 2,
"min_level": 31,
"max_level": 31
}
]
},
{
"name": "Chargestone Cave (B2F)",
"order": 34,
@@ -1927,60 +1819,6 @@
"max_level": 28
}
]
},
{
"name": "Chargestone Cave (B2f)",
"order": 34,
"encounters": [
{
"pokeapi_id": 595,
"pokemon_name": "Joltik",
"method": "walk",
"encounter_rate": 36,
"min_level": 28,
"max_level": 31
},
{
"pokeapi_id": 599,
"pokemon_name": "Klink",
"method": "walk",
"encounter_rate": 21,
"min_level": 29,
"max_level": 31
},
{
"pokeapi_id": 597,
"pokemon_name": "Ferroseed",
"method": "walk",
"encounter_rate": 20,
"min_level": 30,
"max_level": 31
},
{
"pokeapi_id": 299,
"pokemon_name": "Nosepass",
"method": "walk",
"encounter_rate": 10,
"min_level": 30,
"max_level": 30
},
{
"pokeapi_id": 602,
"pokemon_name": "Tynamo",
"method": "walk",
"encounter_rate": 8,
"min_level": 31,
"max_level": 31
},
{
"pokeapi_id": 525,
"pokemon_name": "Boldore",
"method": "walk",
"encounter_rate": 5,
"min_level": 28,
"max_level": 28
}
]
}
]
},
@@ -2207,36 +2045,6 @@
}
]
},
{
"name": "Dragonspiral Tower (1f)",
"order": 38,
"encounters": [
{
"pokeapi_id": 623,
"pokemon_name": "Golurk",
"method": "walk",
"encounter_rate": 50,
"min_level": 55,
"max_level": 58
},
{
"pokeapi_id": 621,
"pokemon_name": "Druddigon",
"method": "walk",
"encounter_rate": 30,
"min_level": 56,
"max_level": 58
},
{
"pokeapi_id": 620,
"pokemon_name": "Mienshao",
"method": "walk",
"encounter_rate": 20,
"min_level": 55,
"max_level": 55
}
]
},
{
"name": "Dragonspiral Tower (1F)",
"order": 39,
@@ -2268,8 +2076,8 @@
]
},
{
"name": "Dragonspiral Tower (2f)",
"order": 39,
"name": "Dragonspiral Tower (2F)",
"order": 40,
"encounters": [
{
"pokeapi_id": 623,
@@ -2334,20 +2142,6 @@
"max_level": 58
}
]
},
{
"name": "Dragonspiral Tower (2F)",
"order": 40,
"encounters": [
{
"pokeapi_id": 623,
"pokemon_name": "Golurk",
"method": "walk",
"encounter_rate": 100,
"min_level": 55,
"max_level": 58
}
]
}
]
},
@@ -2528,50 +2322,6 @@
}
]
},
{
"name": "Celestial Tower (2f)",
"order": 46,
"encounters": [
{
"pokeapi_id": 607,
"pokemon_name": "Litwick",
"method": "walk",
"encounter_rate": 100,
"min_level": 27,
"max_level": 30
}
]
},
{
"name": "Celestial Tower (3f)",
"order": 47,
"encounters": [
{
"pokeapi_id": 607,
"pokemon_name": "Litwick",
"method": "walk",
"encounter_rate": 80,
"min_level": 28,
"max_level": 31
},
{
"pokeapi_id": 605,
"pokemon_name": "Elgyem",
"method": "walk",
"encounter_rate": 15,
"min_level": 30,
"max_level": 31
},
{
"pokeapi_id": 42,
"pokemon_name": "Golbat",
"method": "walk",
"encounter_rate": 5,
"min_level": 31,
"max_level": 31
}
]
},
{
"name": "Celestial Tower (3F)",
"order": 47,
@@ -2632,36 +2382,6 @@
}
]
},
{
"name": "Celestial Tower (4f)",
"order": 48,
"encounters": [
{
"pokeapi_id": 607,
"pokemon_name": "Litwick",
"method": "walk",
"encounter_rate": 65,
"min_level": 29,
"max_level": 32
},
{
"pokeapi_id": 605,
"pokemon_name": "Elgyem",
"method": "walk",
"encounter_rate": 25,
"min_level": 30,
"max_level": 32
},
{
"pokeapi_id": 42,
"pokemon_name": "Golbat",
"method": "walk",
"encounter_rate": 10,
"min_level": 32,
"max_level": 32
}
]
},
{
"name": "Celestial Tower (5F)",
"order": 49,
@@ -2691,36 +2411,6 @@
"max_level": 33
}
]
},
{
"name": "Celestial Tower (5f)",
"order": 49,
"encounters": [
{
"pokeapi_id": 605,
"pokemon_name": "Elgyem",
"method": "walk",
"encounter_rate": 40,
"min_level": 30,
"max_level": 33
},
{
"pokeapi_id": 607,
"pokemon_name": "Litwick",
"method": "walk",
"encounter_rate": 40,
"min_level": 30,
"max_level": 33
},
{
"pokeapi_id": 42,
"pokemon_name": "Golbat",
"method": "walk",
"encounter_rate": 20,
"min_level": 33,
"max_level": 33
}
]
}
]
},
@@ -4948,60 +4638,6 @@
"order": 92,
"encounters": [],
"children": [
{
"name": "Strange House (1f)",
"order": 93,
"encounters": [
{
"pokeapi_id": 607,
"pokemon_name": "Litwick",
"method": "walk",
"encounter_rate": 30,
"min_level": 31,
"max_level": 33
},
{
"pokeapi_id": 574,
"pokemon_name": "Gothita",
"method": "walk",
"encounter_rate": 20,
"min_level": 31,
"max_level": 31
},
{
"pokeapi_id": 354,
"pokemon_name": "Banette",
"method": "walk",
"encounter_rate": 15,
"min_level": 32,
"max_level": 34
},
{
"pokeapi_id": 42,
"pokemon_name": "Golbat",
"method": "walk",
"encounter_rate": 15,
"min_level": 32,
"max_level": 33
},
{
"pokeapi_id": 20,
"pokemon_name": "Raticate",
"method": "walk",
"encounter_rate": 15,
"min_level": 32,
"max_level": 33
},
{
"pokeapi_id": 575,
"pokemon_name": "Gothorita",
"method": "walk",
"encounter_rate": 5,
"min_level": 34,
"max_level": 34
}
]
},
{
"name": "Strange House (1F)",
"order": 93,
@@ -5109,60 +4745,6 @@
"max_level": 33
}
]
},
{
"name": "Strange House (B1f)",
"order": 94,
"encounters": [
{
"pokeapi_id": 574,
"pokemon_name": "Gothita",
"method": "walk",
"encounter_rate": 20,
"min_level": 31,
"max_level": 31
},
{
"pokeapi_id": 607,
"pokemon_name": "Litwick",
"method": "walk",
"encounter_rate": 20,
"min_level": 31,
"max_level": 31
},
{
"pokeapi_id": 354,
"pokemon_name": "Banette",
"method": "walk",
"encounter_rate": 15,
"min_level": 32,
"max_level": 34
},
{
"pokeapi_id": 42,
"pokemon_name": "Golbat",
"method": "walk",
"encounter_rate": 15,
"min_level": 32,
"max_level": 33
},
{
"pokeapi_id": 575,
"pokemon_name": "Gothorita",
"method": "walk",
"encounter_rate": 15,
"min_level": 33,
"max_level": 34
},
{
"pokeapi_id": 20,
"pokemon_name": "Raticate",
"method": "walk",
"encounter_rate": 15,
"min_level": 32,
"max_level": 33
}
]
}
]
},
@@ -5883,130 +5465,6 @@
}
]
},
{
"name": "Seaside Cave (1f)",
"order": 112,
"encounters": [
{
"pokeapi_id": 592,
"pokemon_name": "Frillish",
"method": "surf",
"encounter_rate": 70,
"min_level": 25,
"max_level": 40
},
{
"pokeapi_id": 370,
"pokemon_name": "Luvdisc",
"method": "super-rod",
"encounter_rate": 60,
"min_level": 40,
"max_level": 70
},
{
"pokeapi_id": 90,
"pokemon_name": "Shellder",
"method": "super-rod",
"encounter_rate": 40,
"min_level": 40,
"max_level": 60
},
{
"pokeapi_id": 55,
"pokemon_name": "Golduck",
"method": "walk",
"encounter_rate": 35,
"min_level": 34,
"max_level": 36
},
{
"pokeapi_id": 527,
"pokemon_name": "Woobat",
"method": "walk",
"encounter_rate": 35,
"min_level": 34,
"max_level": 36
},
{
"pokeapi_id": 86,
"pokemon_name": "Seel",
"method": "surf",
"encounter_rate": 30,
"min_level": 25,
"max_level": 40
},
{
"pokeapi_id": 525,
"pokemon_name": "Boldore",
"method": "walk",
"encounter_rate": 15,
"min_level": 35,
"max_level": 37
},
{
"pokeapi_id": 86,
"pokemon_name": "Seel",
"method": "walk",
"encounter_rate": 10,
"min_level": 35,
"max_level": 35
},
{
"pokeapi_id": 602,
"pokemon_name": "Tynamo",
"method": "walk",
"encounter_rate": 5,
"min_level": 37,
"max_level": 37
}
]
},
{
"name": "Seaside Cave (B1f)",
"order": 113,
"encounters": [
{
"pokeapi_id": 525,
"pokemon_name": "Boldore",
"method": "walk",
"encounter_rate": 35,
"min_level": 39,
"max_level": 42
},
{
"pokeapi_id": 527,
"pokemon_name": "Woobat",
"method": "walk",
"encounter_rate": 35,
"min_level": 39,
"max_level": 41
},
{
"pokeapi_id": 55,
"pokemon_name": "Golduck",
"method": "walk",
"encounter_rate": 20,
"min_level": 40,
"max_level": 40
},
{
"pokeapi_id": 603,
"pokemon_name": "Eelektrik",
"method": "walk",
"encounter_rate": 5,
"min_level": 42,
"max_level": 42
},
{
"pokeapi_id": 213,
"pokemon_name": "Shuckle",
"method": "walk",
"encounter_rate": 5,
"min_level": 41,
"max_level": 41
}
]
},
{
"name": "Seaside Cave (B1F)",
"order": 113,