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

@@ -848,44 +848,6 @@
}
]
},
{
"name": "Granite Cave (1f)",
"order": 15,
"encounters": [
{
"pokeapi_id": 296,
"pokemon_name": "Makuhita",
"method": "walk",
"encounter_rate": 50,
"min_level": 6,
"max_level": 10
},
{
"pokeapi_id": 41,
"pokemon_name": "Zubat",
"method": "walk",
"encounter_rate": 30,
"min_level": 7,
"max_level": 8
},
{
"pokeapi_id": 63,
"pokemon_name": "Abra",
"method": "walk",
"encounter_rate": 10,
"min_level": 8,
"max_level": 8
},
{
"pokeapi_id": 74,
"pokemon_name": "Geodude",
"method": "walk",
"encounter_rate": 10,
"min_level": 6,
"max_level": 9
}
]
},
{
"name": "Granite Cave (B1F)",
"order": 16,
@@ -932,106 +894,6 @@
}
]
},
{
"name": "Granite Cave (B1f)",
"order": 16,
"encounters": [
{
"pokeapi_id": 304,
"pokemon_name": "Aron",
"method": "walk",
"encounter_rate": 40,
"min_level": 9,
"max_level": 11
},
{
"pokeapi_id": 41,
"pokemon_name": "Zubat",
"method": "walk",
"encounter_rate": 30,
"min_level": 9,
"max_level": 10
},
{
"pokeapi_id": 63,
"pokemon_name": "Abra",
"method": "walk",
"encounter_rate": 10,
"min_level": 9,
"max_level": 9
},
{
"pokeapi_id": 296,
"pokemon_name": "Makuhita",
"method": "walk",
"encounter_rate": 10,
"min_level": 10,
"max_level": 11
},
{
"pokeapi_id": 303,
"pokemon_name": "Mawile",
"method": "walk",
"encounter_rate": 10,
"min_level": 9,
"max_level": 11
}
]
},
{
"name": "Granite Cave (B2f)",
"order": 17,
"encounters": [
{
"pokeapi_id": 74,
"pokemon_name": "Geodude",
"method": "rock-smash",
"encounter_rate": 70,
"min_level": 5,
"max_level": 20
},
{
"pokeapi_id": 304,
"pokemon_name": "Aron",
"method": "walk",
"encounter_rate": 40,
"min_level": 10,
"max_level": 12
},
{
"pokeapi_id": 299,
"pokemon_name": "Nosepass",
"method": "rock-smash",
"encounter_rate": 30,
"min_level": 10,
"max_level": 20
},
{
"pokeapi_id": 41,
"pokemon_name": "Zubat",
"method": "walk",
"encounter_rate": 30,
"min_level": 10,
"max_level": 11
},
{
"pokeapi_id": 303,
"pokemon_name": "Mawile",
"method": "walk",
"encounter_rate": 20,
"min_level": 10,
"max_level": 12
},
{
"pokeapi_id": 63,
"pokemon_name": "Abra",
"method": "walk",
"encounter_rate": 10,
"min_level": 10,
"max_level": 10
}
]
},
{
"name": "Granite Cave (B2F)",
"order": 17,
@@ -1086,44 +948,6 @@
}
]
},
{
"name": "Granite Cave (1fsmall Room)",
"order": 18,
"encounters": [
{
"pokeapi_id": 296,
"pokemon_name": "Makuhita",
"method": "walk",
"encounter_rate": 50,
"min_level": 6,
"max_level": 10
},
{
"pokeapi_id": 41,
"pokemon_name": "Zubat",
"method": "walk",
"encounter_rate": 30,
"min_level": 7,
"max_level": 8
},
{
"pokeapi_id": 63,
"pokemon_name": "Abra",
"method": "walk",
"encounter_rate": 10,
"min_level": 8,
"max_level": 8
},
{
"pokeapi_id": 304,
"pokemon_name": "Aron",
"method": "walk",
"encounter_rate": 10,
"min_level": 7,
"max_level": 8
}
]
},
{
"name": "Granite Cave (1Fsmall Room)",
"order": 18,
@@ -2354,100 +2178,6 @@
}
]
},
{
"name": "Meteor Falls (B1f)",
"order": 36,
"encounters": [
{
"pokeapi_id": 42,
"pokemon_name": "Golbat",
"method": "surf",
"encounter_rate": 90,
"min_level": 30,
"max_level": 35
},
{
"pokeapi_id": 339,
"pokemon_name": "Barboach",
"method": "super-rod",
"encounter_rate": 80,
"min_level": 25,
"max_level": 35
},
{
"pokeapi_id": 129,
"pokemon_name": "Magikarp",
"method": "old-rod",
"encounter_rate": 70,
"min_level": 5,
"max_level": 10
},
{
"pokeapi_id": 42,
"pokemon_name": "Golbat",
"method": "walk",
"encounter_rate": 65,
"min_level": 33,
"max_level": 40
},
{
"pokeapi_id": 129,
"pokemon_name": "Magikarp",
"method": "good-rod",
"encounter_rate": 60,
"min_level": 10,
"max_level": 30
},
{
"pokeapi_id": 338,
"pokemon_name": "Solrock",
"method": "walk",
"encounter_rate": 35,
"min_level": 33,
"max_level": 39
},
{
"pokeapi_id": 118,
"pokemon_name": "Goldeen",
"method": "old-rod",
"encounter_rate": 30,
"min_level": 5,
"max_level": 10
},
{
"pokeapi_id": 339,
"pokemon_name": "Barboach",
"method": "good-rod",
"encounter_rate": 20,
"min_level": 10,
"max_level": 30
},
{
"pokeapi_id": 118,
"pokemon_name": "Goldeen",
"method": "good-rod",
"encounter_rate": 20,
"min_level": 10,
"max_level": 30
},
{
"pokeapi_id": 340,
"pokemon_name": "Whiscash",
"method": "super-rod",
"encounter_rate": 20,
"min_level": 30,
"max_level": 45
},
{
"pokeapi_id": 338,
"pokemon_name": "Solrock",
"method": "surf",
"encounter_rate": 10,
"min_level": 5,
"max_level": 35
}
]
},
{
"name": "Meteor Falls (B1F)",
"order": 36,
@@ -3843,8 +3573,8 @@
]
},
{
"name": "Mt Pyre (6f)",
"order": 52,
"name": "Mt Pyre (6F)",
"order": 57,
"encounters": [
{
"pokeapi_id": 355,
@@ -3960,20 +3690,6 @@
}
]
},
{
"name": "Mt Pyre (1f)",
"order": 55,
"encounters": [
{
"pokeapi_id": 355,
"pokemon_name": "Duskull",
"method": "walk",
"encounter_rate": 100,
"min_level": 22,
"max_level": 29
}
]
},
{
"name": "Mt Pyre (4F)",
"order": 55,
@@ -4017,100 +3733,6 @@
"max_level": 29
}
]
},
{
"name": "Mt Pyre (2f)",
"order": 56,
"encounters": [
{
"pokeapi_id": 355,
"pokemon_name": "Duskull",
"method": "walk",
"encounter_rate": 100,
"min_level": 22,
"max_level": 29
}
]
},
{
"name": "Mt Pyre (6F)",
"order": 57,
"encounters": [
{
"pokeapi_id": 355,
"pokemon_name": "Duskull",
"method": "walk",
"encounter_rate": 90,
"min_level": 22,
"max_level": 29
},
{
"pokeapi_id": 353,
"pokemon_name": "Shuppet",
"method": "walk",
"encounter_rate": 10,
"min_level": 25,
"max_level": 29
}
]
},
{
"name": "Mt Pyre (3f)",
"order": 57,
"encounters": [
{
"pokeapi_id": 355,
"pokemon_name": "Duskull",
"method": "walk",
"encounter_rate": 100,
"min_level": 22,
"max_level": 29
}
]
},
{
"name": "Mt Pyre (4f)",
"order": 58,
"encounters": [
{
"pokeapi_id": 355,
"pokemon_name": "Duskull",
"method": "walk",
"encounter_rate": 90,
"min_level": 22,
"max_level": 29
},
{
"pokeapi_id": 353,
"pokemon_name": "Shuppet",
"method": "walk",
"encounter_rate": 10,
"min_level": 25,
"max_level": 29
}
]
},
{
"name": "Mt Pyre (5f)",
"order": 59,
"encounters": [
{
"pokeapi_id": 355,
"pokemon_name": "Duskull",
"method": "walk",
"encounter_rate": 90,
"min_level": 22,
"max_level": 29
},
{
"pokeapi_id": 353,
"pokemon_name": "Shuppet",
"method": "walk",
"encounter_rate": 10,
"min_level": 25,
"max_level": 29
}
]
}
]
},
@@ -4851,36 +4473,6 @@
}
]
},
{
"name": "Cave Of Origin (1f)",
"order": 70,
"encounters": [
{
"pokeapi_id": 41,
"pokemon_name": "Zubat",
"method": "walk",
"encounter_rate": 60,
"min_level": 30,
"max_level": 34
},
{
"pokeapi_id": 303,
"pokemon_name": "Mawile",
"method": "walk",
"encounter_rate": 30,
"min_level": 30,
"max_level": 34
},
{
"pokeapi_id": 42,
"pokemon_name": "Golbat",
"method": "walk",
"encounter_rate": 10,
"min_level": 33,
"max_level": 36
}
]
},
{
"name": "Cave Of Origin (1F)",
"order": 70,
@@ -4941,66 +4533,6 @@
}
]
},
{
"name": "Cave Of Origin (B1f)",
"order": 71,
"encounters": [
{
"pokeapi_id": 41,
"pokemon_name": "Zubat",
"method": "walk",
"encounter_rate": 60,
"min_level": 30,
"max_level": 34
},
{
"pokeapi_id": 303,
"pokemon_name": "Mawile",
"method": "walk",
"encounter_rate": 30,
"min_level": 30,
"max_level": 34
},
{
"pokeapi_id": 42,
"pokemon_name": "Golbat",
"method": "walk",
"encounter_rate": 10,
"min_level": 33,
"max_level": 36
}
]
},
{
"name": "Cave Of Origin (B2f)",
"order": 72,
"encounters": [
{
"pokeapi_id": 41,
"pokemon_name": "Zubat",
"method": "walk",
"encounter_rate": 60,
"min_level": 30,
"max_level": 34
},
{
"pokeapi_id": 303,
"pokemon_name": "Mawile",
"method": "walk",
"encounter_rate": 30,
"min_level": 30,
"max_level": 34
},
{
"pokeapi_id": 42,
"pokemon_name": "Golbat",
"method": "walk",
"encounter_rate": 10,
"min_level": 33,
"max_level": 36
}
]
},
{
"name": "Cave Of Origin (B2F)",
"order": 72,
@@ -5060,36 +4592,6 @@
"max_level": 36
}
]
},
{
"name": "Cave Of Origin (B3f)",
"order": 73,
"encounters": [
{
"pokeapi_id": 41,
"pokemon_name": "Zubat",
"method": "walk",
"encounter_rate": 60,
"min_level": 30,
"max_level": 34
},
{
"pokeapi_id": 303,
"pokemon_name": "Mawile",
"method": "walk",
"encounter_rate": 30,
"min_level": 30,
"max_level": 34
},
{
"pokeapi_id": 42,
"pokemon_name": "Golbat",
"method": "walk",
"encounter_rate": 10,
"min_level": 33,
"max_level": 36
}
]
}
]
},
@@ -6178,240 +5680,6 @@
}
]
},
{
"name": "Victory Road (B2f)",
"order": 86,
"encounters": [
{
"pokeapi_id": 42,
"pokemon_name": "Golbat",
"method": "surf",
"encounter_rate": 100,
"min_level": 25,
"max_level": 40
},
{
"pokeapi_id": 339,
"pokemon_name": "Barboach",
"method": "super-rod",
"encounter_rate": 80,
"min_level": 25,
"max_level": 35
},
{
"pokeapi_id": 129,
"pokemon_name": "Magikarp",
"method": "old-rod",
"encounter_rate": 70,
"min_level": 5,
"max_level": 10
},
{
"pokeapi_id": 129,
"pokemon_name": "Magikarp",
"method": "good-rod",
"encounter_rate": 60,
"min_level": 10,
"max_level": 30
},
{
"pokeapi_id": 42,
"pokemon_name": "Golbat",
"method": "walk",
"encounter_rate": 35,
"min_level": 40,
"max_level": 44
},
{
"pokeapi_id": 303,
"pokemon_name": "Mawile",
"method": "walk",
"encounter_rate": 35,
"min_level": 40,
"max_level": 44
},
{
"pokeapi_id": 118,
"pokemon_name": "Goldeen",
"method": "old-rod",
"encounter_rate": 30,
"min_level": 5,
"max_level": 10
},
{
"pokeapi_id": 339,
"pokemon_name": "Barboach",
"method": "good-rod",
"encounter_rate": 20,
"min_level": 10,
"max_level": 30
},
{
"pokeapi_id": 118,
"pokemon_name": "Goldeen",
"method": "good-rod",
"encounter_rate": 20,
"min_level": 10,
"max_level": 30
},
{
"pokeapi_id": 340,
"pokemon_name": "Whiscash",
"method": "super-rod",
"encounter_rate": 20,
"min_level": 30,
"max_level": 45
},
{
"pokeapi_id": 305,
"pokemon_name": "Lairon",
"method": "walk",
"encounter_rate": 15,
"min_level": 40,
"max_level": 44
},
{
"pokeapi_id": 308,
"pokemon_name": "Medicham",
"method": "walk",
"encounter_rate": 15,
"min_level": 40,
"max_level": 44
}
]
},
{
"name": "Victory Road (1f)",
"order": 87,
"encounters": [
{
"pokeapi_id": 42,
"pokemon_name": "Golbat",
"method": "walk",
"encounter_rate": 25,
"min_level": 38,
"max_level": 40
},
{
"pokeapi_id": 297,
"pokemon_name": "Hariyama",
"method": "walk",
"encounter_rate": 25,
"min_level": 38,
"max_level": 40
},
{
"pokeapi_id": 305,
"pokemon_name": "Lairon",
"method": "walk",
"encounter_rate": 10,
"min_level": 40,
"max_level": 40
},
{
"pokeapi_id": 294,
"pokemon_name": "Loudred",
"method": "walk",
"encounter_rate": 10,
"min_level": 40,
"max_level": 40
},
{
"pokeapi_id": 296,
"pokemon_name": "Makuhita",
"method": "walk",
"encounter_rate": 10,
"min_level": 36,
"max_level": 36
},
{
"pokeapi_id": 41,
"pokemon_name": "Zubat",
"method": "walk",
"encounter_rate": 10,
"min_level": 36,
"max_level": 36
},
{
"pokeapi_id": 304,
"pokemon_name": "Aron",
"method": "walk",
"encounter_rate": 5,
"min_level": 36,
"max_level": 36
},
{
"pokeapi_id": 293,
"pokemon_name": "Whismur",
"method": "walk",
"encounter_rate": 5,
"min_level": 36,
"max_level": 36
}
]
},
{
"name": "Victory Road (B1F)",
"order": 87,
"encounters": [
{
"pokeapi_id": 75,
"pokemon_name": "Graveler",
"method": "rock-smash",
"encounter_rate": 70,
"min_level": 30,
"max_level": 40
},
{
"pokeapi_id": 42,
"pokemon_name": "Golbat",
"method": "walk",
"encounter_rate": 35,
"min_level": 38,
"max_level": 42
},
{
"pokeapi_id": 297,
"pokemon_name": "Hariyama",
"method": "walk",
"encounter_rate": 35,
"min_level": 38,
"max_level": 42
},
{
"pokeapi_id": 74,
"pokemon_name": "Geodude",
"method": "rock-smash",
"encounter_rate": 30,
"min_level": 30,
"max_level": 40
},
{
"pokeapi_id": 305,
"pokemon_name": "Lairon",
"method": "walk",
"encounter_rate": 15,
"min_level": 40,
"max_level": 42
},
{
"pokeapi_id": 308,
"pokemon_name": "Medicham",
"method": "walk",
"encounter_rate": 10,
"min_level": 40,
"max_level": 40
},
{
"pokeapi_id": 307,
"pokemon_name": "Meditite",
"method": "walk",
"encounter_rate": 5,
"min_level": 38,
"max_level": 38
}
]
},
{
"name": "Victory Road (B2F)",
"order": 88,
@@ -6515,8 +5783,8 @@
]
},
{
"name": "Victory Road (B1f)",
"order": 88,
"name": "Victory Road (B1F)",
"order": 87,
"encounters": [
{
"pokeapi_id": 75,
@@ -6583,44 +5851,6 @@
"order": 89,
"encounters": [],
"children": [
{
"name": "Sky Pillar (1f)",
"order": 90,
"encounters": [
{
"pokeapi_id": 42,
"pokemon_name": "Golbat",
"method": "walk",
"encounter_rate": 30,
"min_level": 48,
"max_level": 50
},
{
"pokeapi_id": 303,
"pokemon_name": "Mawile",
"method": "walk",
"encounter_rate": 30,
"min_level": 48,
"max_level": 50
},
{
"pokeapi_id": 344,
"pokemon_name": "Claydol",
"method": "walk",
"encounter_rate": 25,
"min_level": 47,
"max_level": 50
},
{
"pokeapi_id": 356,
"pokemon_name": "Dusclops",
"method": "walk",
"encounter_rate": 15,
"min_level": 48,
"max_level": 50
}
]
},
{
"name": "Sky Pillar (1F)",
"order": 90,
@@ -6659,44 +5889,6 @@
}
]
},
{
"name": "Sky Pillar (3f)",
"order": 91,
"encounters": [
{
"pokeapi_id": 42,
"pokemon_name": "Golbat",
"method": "walk",
"encounter_rate": 30,
"min_level": 51,
"max_level": 53
},
{
"pokeapi_id": 303,
"pokemon_name": "Mawile",
"method": "walk",
"encounter_rate": 30,
"min_level": 51,
"max_level": 53
},
{
"pokeapi_id": 344,
"pokemon_name": "Claydol",
"method": "walk",
"encounter_rate": 25,
"min_level": 50,
"max_level": 53
},
{
"pokeapi_id": 356,
"pokemon_name": "Dusclops",
"method": "walk",
"encounter_rate": 15,
"min_level": 51,
"max_level": 53
}
]
},
{
"name": "Sky Pillar (3F)",
"order": 91,
@@ -6735,52 +5927,6 @@
}
]
},
{
"name": "Sky Pillar (5f)",
"order": 92,
"encounters": [
{
"pokeapi_id": 42,
"pokemon_name": "Golbat",
"method": "walk",
"encounter_rate": 30,
"min_level": 54,
"max_level": 56
},
{
"pokeapi_id": 303,
"pokemon_name": "Mawile",
"method": "walk",
"encounter_rate": 30,
"min_level": 54,
"max_level": 56
},
{
"pokeapi_id": 344,
"pokemon_name": "Claydol",
"method": "walk",
"encounter_rate": 19,
"min_level": 54,
"max_level": 56
},
{
"pokeapi_id": 356,
"pokemon_name": "Dusclops",
"method": "walk",
"encounter_rate": 15,
"min_level": 54,
"max_level": 56
},
{
"pokeapi_id": 334,
"pokemon_name": "Altaria",
"method": "walk",
"encounter_rate": 6,
"min_level": 54,
"max_level": 60
}
]
},
{
"name": "Sky Pillar (5F)",
"order": 92,