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

@@ -865,8 +865,8 @@
]
},
{
"name": "Granite Cave (1fsmall Room)",
"order": 15,
"name": "Granite Cave (1Fsmall Room)",
"order": 18,
"encounters": [
{
"pokeapi_id": 296,
@@ -902,44 +902,6 @@
}
]
},
{
"name": "Granite Cave (1f)",
"order": 16,
"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,
@@ -1039,144 +1001,6 @@
"max_level": 10
}
]
},
{
"name": "Granite Cave (B1f)",
"order": 17,
"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": 302,
"pokemon_name": "Sableye",
"method": "walk",
"encounter_rate": 10,
"min_level": 9,
"max_level": 11
}
]
},
{
"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 (B2f)",
"order": 18,
"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": 302,
"pokemon_name": "Sableye",
"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
}
]
}
]
},
@@ -2384,100 +2208,6 @@
}
]
},
{
"name": "Meteor Falls (B1f)",
"order": 37,
"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": 37,
@@ -4108,34 +3838,6 @@
}
]
},
{
"name": "Mt Pyre (2f)",
"order": 55,
"encounters": [
{
"pokeapi_id": 353,
"pokemon_name": "Shuppet",
"method": "walk",
"encounter_rate": 100,
"min_level": 22,
"max_level": 29
}
]
},
{
"name": "Mt Pyre (3f)",
"order": 56,
"encounters": [
{
"pokeapi_id": 353,
"pokemon_name": "Shuppet",
"method": "walk",
"encounter_rate": 100,
"min_level": 22,
"max_level": 29
}
]
},
{
"name": "Mt Pyre (2F)",
"order": 56,
@@ -4150,28 +3852,6 @@
}
]
},
{
"name": "Mt Pyre (4f)",
"order": 57,
"encounters": [
{
"pokeapi_id": 353,
"pokemon_name": "Shuppet",
"method": "walk",
"encounter_rate": 90,
"min_level": 22,
"max_level": 29
},
{
"pokeapi_id": 355,
"pokemon_name": "Duskull",
"method": "walk",
"encounter_rate": 10,
"min_level": 25,
"max_level": 29
}
]
},
{
"name": "Mt Pyre (3F)",
"order": 57,
@@ -4186,28 +3866,6 @@
}
]
},
{
"name": "Mt Pyre (5f)",
"order": 58,
"encounters": [
{
"pokeapi_id": 353,
"pokemon_name": "Shuppet",
"method": "walk",
"encounter_rate": 90,
"min_level": 22,
"max_level": 29
},
{
"pokeapi_id": 355,
"pokemon_name": "Duskull",
"method": "walk",
"encounter_rate": 10,
"min_level": 25,
"max_level": 29
}
]
},
{
"name": "Mt Pyre (4F)",
"order": 58,
@@ -4230,28 +3888,6 @@
}
]
},
{
"name": "Mt Pyre (6f)",
"order": 59,
"encounters": [
{
"pokeapi_id": 353,
"pokemon_name": "Shuppet",
"method": "walk",
"encounter_rate": 90,
"min_level": 22,
"max_level": 29
},
{
"pokeapi_id": 355,
"pokemon_name": "Duskull",
"method": "walk",
"encounter_rate": 10,
"min_level": 25,
"max_level": 29
}
]
},
{
"name": "Mt Pyre (5F)",
"order": 59,
@@ -4355,20 +3991,6 @@
"max_level": 28
}
]
},
{
"name": "Mt Pyre (1f)",
"order": 62,
"encounters": [
{
"pokeapi_id": 353,
"pokemon_name": "Shuppet",
"method": "walk",
"encounter_rate": 100,
"min_level": 22,
"max_level": 29
}
]
}
]
},
@@ -5177,66 +4799,6 @@
}
]
},
{
"name": "Cave Of Origin (1f)",
"order": 74,
"encounters": [
{
"pokeapi_id": 41,
"pokemon_name": "Zubat",
"method": "walk",
"encounter_rate": 60,
"min_level": 30,
"max_level": 34
},
{
"pokeapi_id": 302,
"pokemon_name": "Sableye",
"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 (B1f)",
"order": 75,
"encounters": [
{
"pokeapi_id": 41,
"pokemon_name": "Zubat",
"method": "walk",
"encounter_rate": 60,
"min_level": 30,
"max_level": 34
},
{
"pokeapi_id": 302,
"pokemon_name": "Sableye",
"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 (B1F)",
"order": 75,
@@ -5267,36 +4829,6 @@
}
]
},
{
"name": "Cave Of Origin (B2f)",
"order": 76,
"encounters": [
{
"pokeapi_id": 41,
"pokemon_name": "Zubat",
"method": "walk",
"encounter_rate": 60,
"min_level": 30,
"max_level": 34
},
{
"pokeapi_id": 302,
"pokemon_name": "Sableye",
"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": 76,
@@ -5356,36 +4888,6 @@
"max_level": 36
}
]
},
{
"name": "Cave Of Origin (B3f)",
"order": 77,
"encounters": [
{
"pokeapi_id": 41,
"pokemon_name": "Zubat",
"method": "walk",
"encounter_rate": 60,
"min_level": 30,
"max_level": 34
},
{
"pokeapi_id": 302,
"pokemon_name": "Sableye",
"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
}
]
}
]
},
@@ -6404,76 +5906,6 @@
"order": 89,
"encounters": [],
"children": [
{
"name": "Victory Road (1f)",
"order": 90,
"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 (1F)",
"order": 90,
@@ -6544,60 +5976,6 @@
}
]
},
{
"name": "Victory Road (B1f)",
"order": 91,
"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": 25,
"min_level": 40,
"max_level": 42
},
{
"pokeapi_id": 303,
"pokemon_name": "Mawile",
"method": "walk",
"encounter_rate": 5,
"min_level": 38,
"max_level": 38
}
]
},
{
"name": "Victory Road (B1F)",
"order": 91,
@@ -6753,108 +6131,6 @@
"max_level": 44
}
]
},
{
"name": "Victory Road (B2f)",
"order": 92,
"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": 302,
"pokemon_name": "Sableye",
"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": 305,
"pokemon_name": "Lairon",
"method": "walk",
"encounter_rate": 25,
"min_level": 40,
"max_level": 44
},
{
"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": 303,
"pokemon_name": "Mawile",
"method": "walk",
"encounter_rate": 5,
"min_level": 42,
"max_level": 44
}
]
}
]
},
@@ -6863,44 +6139,6 @@
"order": 93,
"encounters": [],
"children": [
{
"name": "Sky Pillar (1f)",
"order": 94,
"encounters": [
{
"pokeapi_id": 42,
"pokemon_name": "Golbat",
"method": "walk",
"encounter_rate": 30,
"min_level": 34,
"max_level": 35
},
{
"pokeapi_id": 302,
"pokemon_name": "Sableye",
"method": "walk",
"encounter_rate": 30,
"min_level": 33,
"max_level": 34
},
{
"pokeapi_id": 344,
"pokemon_name": "Claydol",
"method": "walk",
"encounter_rate": 25,
"min_level": 36,
"max_level": 38
},
{
"pokeapi_id": 354,
"pokemon_name": "Banette",
"method": "walk",
"encounter_rate": 15,
"min_level": 37,
"max_level": 38
}
]
},
{
"name": "Sky Pillar (1F)",
"order": 94,
@@ -6977,90 +6215,6 @@
}
]
},
{
"name": "Sky Pillar (3f)",
"order": 95,
"encounters": [
{
"pokeapi_id": 42,
"pokemon_name": "Golbat",
"method": "walk",
"encounter_rate": 30,
"min_level": 34,
"max_level": 35
},
{
"pokeapi_id": 302,
"pokemon_name": "Sableye",
"method": "walk",
"encounter_rate": 30,
"min_level": 33,
"max_level": 34
},
{
"pokeapi_id": 344,
"pokemon_name": "Claydol",
"method": "walk",
"encounter_rate": 25,
"min_level": 36,
"max_level": 38
},
{
"pokeapi_id": 354,
"pokemon_name": "Banette",
"method": "walk",
"encounter_rate": 15,
"min_level": 37,
"max_level": 38
}
]
},
{
"name": "Sky Pillar (5f)",
"order": 96,
"encounters": [
{
"pokeapi_id": 42,
"pokemon_name": "Golbat",
"method": "walk",
"encounter_rate": 30,
"min_level": 34,
"max_level": 35
},
{
"pokeapi_id": 302,
"pokemon_name": "Sableye",
"method": "walk",
"encounter_rate": 30,
"min_level": 33,
"max_level": 34
},
{
"pokeapi_id": 344,
"pokemon_name": "Claydol",
"method": "walk",
"encounter_rate": 19,
"min_level": 36,
"max_level": 37
},
{
"pokeapi_id": 354,
"pokemon_name": "Banette",
"method": "walk",
"encounter_rate": 15,
"min_level": 37,
"max_level": 38
},
{
"pokeapi_id": 334,
"pokemon_name": "Altaria",
"method": "walk",
"encounter_rate": 6,
"min_level": 38,
"max_level": 39
}
]
},
{
"name": "Sky Pillar (5F)",
"order": 96,