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

@@ -1704,98 +1704,6 @@
}
]
},
{
"name": "Chargestone Cave (B1f)",
"order": 36,
"encounters": [
{
"pokeapi_id": 595,
"pokemon_name": "Joltik",
"method": "walk",
"encounter_rate": 39,
"min_level": 24,
"max_level": 27
},
{
"pokeapi_id": 599,
"pokemon_name": "Klink",
"method": "walk",
"encounter_rate": 29,
"min_level": 25,
"max_level": 27
},
{
"pokeapi_id": 597,
"pokemon_name": "Ferroseed",
"method": "walk",
"encounter_rate": 20,
"min_level": 25,
"max_level": 26
},
{
"pokeapi_id": 525,
"pokemon_name": "Boldore",
"method": "walk",
"encounter_rate": 10,
"min_level": 24,
"max_level": 24
},
{
"pokeapi_id": 602,
"pokemon_name": "Tynamo",
"method": "walk",
"encounter_rate": 2,
"min_level": 27,
"max_level": 27
}
]
},
{
"name": "Chargestone Cave (B2f)",
"order": 37,
"encounters": [
{
"pokeapi_id": 595,
"pokemon_name": "Joltik",
"method": "walk",
"encounter_rate": 36,
"min_level": 24,
"max_level": 27
},
{
"pokeapi_id": 599,
"pokemon_name": "Klink",
"method": "walk",
"encounter_rate": 26,
"min_level": 25,
"max_level": 27
},
{
"pokeapi_id": 597,
"pokemon_name": "Ferroseed",
"method": "walk",
"encounter_rate": 20,
"min_level": 26,
"max_level": 27
},
{
"pokeapi_id": 525,
"pokemon_name": "Boldore",
"method": "walk",
"encounter_rate": 10,
"min_level": 24,
"max_level": 24
},
{
"pokeapi_id": 602,
"pokemon_name": "Tynamo",
"method": "walk",
"encounter_rate": 8,
"min_level": 27,
"max_level": 27
}
]
},
{
"name": "Chargestone Cave (B1F)",
"order": 37,
@@ -1887,52 +1795,6 @@
"max_level": 27
}
]
},
{
"name": "Chargestone Cave (1f)",
"order": 38,
"encounters": [
{
"pokeapi_id": 595,
"pokemon_name": "Joltik",
"method": "walk",
"encounter_rate": 39,
"min_level": 24,
"max_level": 27
},
{
"pokeapi_id": 599,
"pokemon_name": "Klink",
"method": "walk",
"encounter_rate": 29,
"min_level": 25,
"max_level": 27
},
{
"pokeapi_id": 597,
"pokemon_name": "Ferroseed",
"method": "walk",
"encounter_rate": 20,
"min_level": 24,
"max_level": 25
},
{
"pokeapi_id": 525,
"pokemon_name": "Boldore",
"method": "walk",
"encounter_rate": 10,
"min_level": 24,
"max_level": 24
},
{
"pokeapi_id": 602,
"pokemon_name": "Tynamo",
"method": "walk",
"encounter_rate": 2,
"min_level": 27,
"max_level": 27
}
]
}
]
},
@@ -2119,36 +1981,6 @@
}
]
},
{
"name": "Dragonspiral Tower (1f)",
"order": 42,
"encounters": [
{
"pokeapi_id": 622,
"pokemon_name": "Golett",
"method": "walk",
"encounter_rate": 50,
"min_level": 30,
"max_level": 33
},
{
"pokeapi_id": 621,
"pokemon_name": "Druddigon",
"method": "walk",
"encounter_rate": 30,
"min_level": 30,
"max_level": 33
},
{
"pokeapi_id": 619,
"pokemon_name": "Mienfoo",
"method": "walk",
"encounter_rate": 20,
"min_level": 33,
"max_level": 33
}
]
},
{
"name": "Dragonspiral Tower (1F)",
"order": 43,
@@ -2180,8 +2012,8 @@
]
},
{
"name": "Dragonspiral Tower (2f)",
"order": 43,
"name": "Dragonspiral Tower (2F)",
"order": 44,
"encounters": [
{
"pokeapi_id": 622,
@@ -2246,20 +2078,6 @@
"max_level": 33
}
]
},
{
"name": "Dragonspiral Tower (2F)",
"order": 44,
"encounters": [
{
"pokeapi_id": 622,
"pokemon_name": "Golett",
"method": "walk",
"encounter_rate": 100,
"min_level": 30,
"max_level": 33
}
]
}
]
},
@@ -2534,44 +2352,6 @@
}
]
},
{
"name": "Victory Road (4f Middle Room)",
"order": 52,
"encounters": [
{
"pokeapi_id": 632,
"pokemon_name": "Durant",
"method": "walk",
"encounter_rate": 40,
"min_level": 39,
"max_level": 42
},
{
"pokeapi_id": 525,
"pokemon_name": "Boldore",
"method": "walk",
"encounter_rate": 30,
"min_level": 39,
"max_level": 41
},
{
"pokeapi_id": 527,
"pokemon_name": "Woobat",
"method": "walk",
"encounter_rate": 20,
"min_level": 39,
"max_level": 42
},
{
"pokeapi_id": 619,
"pokemon_name": "Mienfoo",
"method": "walk",
"encounter_rate": 10,
"min_level": 41,
"max_level": 41
}
]
},
{
"name": "Victory Road (1F Unknown Room)",
"order": 52,
@@ -2918,84 +2698,6 @@
}
]
},
{
"name": "Victory Road (1f Unknown Room)",
"order": 59,
"encounters": [
{
"pokeapi_id": 550,
"pokemon_name": "Basculin Red Striped",
"method": "surf",
"encounter_rate": 100,
"min_level": 20,
"max_level": 45
},
{
"pokeapi_id": 60,
"pokemon_name": "Poliwag",
"method": "super-rod",
"encounter_rate": 45,
"min_level": 35,
"max_level": 55
},
{
"pokeapi_id": 550,
"pokemon_name": "Basculin Red Striped",
"method": "super-rod",
"encounter_rate": 40,
"min_level": 35,
"max_level": 55
},
{
"pokeapi_id": 632,
"pokemon_name": "Durant",
"method": "walk",
"encounter_rate": 40,
"min_level": 37,
"max_level": 40
},
{
"pokeapi_id": 525,
"pokemon_name": "Boldore",
"method": "walk",
"encounter_rate": 20,
"min_level": 39,
"max_level": 39
},
{
"pokeapi_id": 633,
"pokemon_name": "Deino",
"method": "walk",
"encounter_rate": 20,
"min_level": 38,
"max_level": 40
},
{
"pokeapi_id": 61,
"pokemon_name": "Poliwhirl",
"method": "super-rod",
"encounter_rate": 15,
"min_level": 35,
"max_level": 55
},
{
"pokeapi_id": 619,
"pokemon_name": "Mienfoo",
"method": "walk",
"encounter_rate": 10,
"min_level": 39,
"max_level": 39
},
{
"pokeapi_id": 527,
"pokemon_name": "Woobat",
"method": "walk",
"encounter_rate": 10,
"min_level": 37,
"max_level": 37
}
]
},
{
"name": "Victory Road (Unknown Area 60)",
"order": 60,
@@ -3180,8 +2882,8 @@
"encounters": [],
"children": [
{
"name": "Celestial Tower (3f)",
"order": 65,
"name": "Celestial Tower (3F)",
"order": 66,
"encounters": [
{
"pokeapi_id": 607,
@@ -3215,72 +2917,6 @@
}
]
},
{
"name": "Celestial Tower (4f)",
"order": 66,
"encounters": [
{
"pokeapi_id": 607,
"pokemon_name": "Litwick",
"method": "walk",
"encounter_rate": 70,
"min_level": 26,
"max_level": 29
},
{
"pokeapi_id": 605,
"pokemon_name": "Elgyem",
"method": "walk",
"encounter_rate": 30,
"min_level": 26,
"max_level": 29
}
]
},
{
"name": "Celestial Tower (3F)",
"order": 66,
"encounters": [
{
"pokeapi_id": 607,
"pokemon_name": "Litwick",
"method": "walk",
"encounter_rate": 85,
"min_level": 26,
"max_level": 29
},
{
"pokeapi_id": 605,
"pokemon_name": "Elgyem",
"method": "walk",
"encounter_rate": 15,
"min_level": 26,
"max_level": 28
}
]
},
{
"name": "Celestial Tower (5f)",
"order": 67,
"encounters": [
{
"pokeapi_id": 605,
"pokemon_name": "Elgyem",
"method": "walk",
"encounter_rate": 50,
"min_level": 26,
"max_level": 29
},
{
"pokeapi_id": 607,
"pokemon_name": "Litwick",
"method": "walk",
"encounter_rate": 50,
"min_level": 26,
"max_level": 29
}
]
},
{
"name": "Celestial Tower (4F)",
"order": 67,
@@ -3324,20 +2960,6 @@
"max_level": 29
}
]
},
{
"name": "Celestial Tower (2f)",
"order": 68,
"encounters": [
{
"pokeapi_id": 607,
"pokemon_name": "Litwick",
"method": "walk",
"encounter_rate": 100,
"min_level": 26,
"max_level": 29
}
]
}
]
},
@@ -3400,60 +3022,6 @@
"order": 70,
"encounters": [],
"children": [
{
"name": "Challengers Cave (1f)",
"order": 71,
"encounters": [
{
"pokeapi_id": 525,
"pokemon_name": "Boldore",
"method": "walk",
"encounter_rate": 20,
"min_level": 48,
"max_level": 48
},
{
"pokeapi_id": 75,
"pokemon_name": "Graveler",
"method": "walk",
"encounter_rate": 20,
"min_level": 47,
"max_level": 49
},
{
"pokeapi_id": 108,
"pokemon_name": "Lickitung",
"method": "walk",
"encounter_rate": 20,
"min_level": 49,
"max_level": 50
},
{
"pokeapi_id": 527,
"pokemon_name": "Woobat",
"method": "walk",
"encounter_rate": 20,
"min_level": 47,
"max_level": 47
},
{
"pokeapi_id": 303,
"pokemon_name": "Mawile",
"method": "walk",
"encounter_rate": 10,
"min_level": 49,
"max_level": 49
},
{
"pokeapi_id": 302,
"pokemon_name": "Sableye",
"method": "walk",
"encounter_rate": 10,
"min_level": 49,
"max_level": 49
}
]
},
{
"name": "Challengers Cave (1F)",
"order": 71,
@@ -3508,68 +3076,6 @@
}
]
},
{
"name": "Challengers Cave (B1f)",
"order": 72,
"encounters": [
{
"pokeapi_id": 525,
"pokemon_name": "Boldore",
"method": "walk",
"encounter_rate": 20,
"min_level": 48,
"max_level": 48
},
{
"pokeapi_id": 75,
"pokemon_name": "Graveler",
"method": "walk",
"encounter_rate": 20,
"min_level": 47,
"max_level": 49
},
{
"pokeapi_id": 527,
"pokemon_name": "Woobat",
"method": "walk",
"encounter_rate": 20,
"min_level": 47,
"max_level": 47
},
{
"pokeapi_id": 108,
"pokemon_name": "Lickitung",
"method": "walk",
"encounter_rate": 15,
"min_level": 49,
"max_level": 50
},
{
"pokeapi_id": 303,
"pokemon_name": "Mawile",
"method": "walk",
"encounter_rate": 10,
"min_level": 49,
"max_level": 49
},
{
"pokeapi_id": 302,
"pokemon_name": "Sableye",
"method": "walk",
"encounter_rate": 10,
"min_level": 49,
"max_level": 49
},
{
"pokeapi_id": 447,
"pokemon_name": "Riolu",
"method": "walk",
"encounter_rate": 5,
"min_level": 49,
"max_level": 50
}
]
},
{
"name": "Challengers Cave (B1F)",
"order": 72,
@@ -3632,100 +3138,6 @@
}
]
},
{
"name": "Challengers Cave (B2f)",
"order": 73,
"encounters": [
{
"pokeapi_id": 550,
"pokemon_name": "Basculin Red Striped",
"method": "surf",
"encounter_rate": 100,
"min_level": 25,
"max_level": 55
},
{
"pokeapi_id": 60,
"pokemon_name": "Poliwag",
"method": "super-rod",
"encounter_rate": 45,
"min_level": 35,
"max_level": 55
},
{
"pokeapi_id": 550,
"pokemon_name": "Basculin Red Striped",
"method": "super-rod",
"encounter_rate": 40,
"min_level": 35,
"max_level": 55
},
{
"pokeapi_id": 525,
"pokemon_name": "Boldore",
"method": "walk",
"encounter_rate": 20,
"min_level": 48,
"max_level": 48
},
{
"pokeapi_id": 75,
"pokemon_name": "Graveler",
"method": "walk",
"encounter_rate": 20,
"min_level": 47,
"max_level": 49
},
{
"pokeapi_id": 527,
"pokemon_name": "Woobat",
"method": "walk",
"encounter_rate": 20,
"min_level": 47,
"max_level": 47
},
{
"pokeapi_id": 61,
"pokemon_name": "Poliwhirl",
"method": "super-rod",
"encounter_rate": 15,
"min_level": 35,
"max_level": 55
},
{
"pokeapi_id": 108,
"pokemon_name": "Lickitung",
"method": "walk",
"encounter_rate": 10,
"min_level": 49,
"max_level": 49
},
{
"pokeapi_id": 303,
"pokemon_name": "Mawile",
"method": "walk",
"encounter_rate": 10,
"min_level": 49,
"max_level": 49
},
{
"pokeapi_id": 447,
"pokemon_name": "Riolu",
"method": "walk",
"encounter_rate": 10,
"min_level": 49,
"max_level": 50
},
{
"pokeapi_id": 302,
"pokemon_name": "Sableye",
"method": "walk",
"encounter_rate": 10,
"min_level": 49,
"max_level": 49
}
]
},
{
"name": "Challengers Cave (B2F)",
"order": 73,