Phase 5: breeding with Cobbreeding, Ditto a rare Deep Dark find

Adrian (2026-10-31): add Cobbreeding without a gate; only Ditto should
be rare, in an endgame area or gated behind something else.

- Cobbreeding 2.4.1 (Modrinth only) and Cloth Config (client) in the
  pack; Cobblebase's hatchery takes Cobbreeding's eggs.
- Ditto moved from Button Isle to the Deep Dark with both of Cobblemon's
  entries (rare in slime chunks, ultra-rare elsewhere): zone_spawns.py
  pins take {"zone", "all_entries"}; Deep Dark target +1, Button Isle -1
  so no other line moved; Southwold and Frostpeak guardians pinned (they
  tie on base stats and flipped between runs).
- HMs' Trainer Ditto is made uncatchable; it still trades.
- check_deps.py skips other-side dependencies; Cobbreeding's harmless
  client-mixin log line allowlisted.
- Self-tests cobbreeding_eggs_fit_the_hatchery, trainer_ditto_cant_be_caught;
  docs, balance table, Phase 5 checklist.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
claudeandClaude Opus 5.5 committed 2026-10-31 19:13:55 +01:00
1 parent 5b304025c6
commit 5cae9252c3
20 files changed
+274 -148

No files matched your search

@@ -455,7 +455,7 @@
"timeRange": "day",
"zone": "button_isle"
},
"id": "button_isle-combee-male-1-33",
"id": "button_isle-combee-male-1-31",
"level": "2-10",
"pokemon": "combee male",
"presets": [
@@ -494,7 +494,7 @@
"timeRange": "day",
"zone": "button_isle"
},
"id": "button_isle-combee-male-2-34",
"id": "button_isle-combee-male-2-32",
"level": "2-10",
"pokemon": "combee male",
"presets": [
@@ -512,58 +512,6 @@
"multiplier": 5.0
}
},
{
"anticondition": {
"biomes": [
"#cobblemon:is_ocean"
]
},
"bucket": "rare",
"condition": {
"biomes": [
"#cobblemon:is_overworld"
],
"isSlimeChunk": true,
"maxSkyLight": 15,
"minSkyLight": 8,
"zone": "button_isle"
},
"id": "button_isle-ditto-1-31",
"level": "4-10",
"pokemon": "ditto",
"presets": [
"natural"
],
"spawnablePositionType": "grounded",
"type": "pokemon",
"weight": 100.0
},
{
"anticondition": {
"biomes": [
"#cobblemon:is_ocean"
]
},
"bucket": "ultra-rare",
"condition": {
"biomes": [
"#cobblemon:is_overworld"
],
"isSlimeChunk": false,
"maxSkyLight": 15,
"minSkyLight": 8,
"zone": "button_isle"
},
"id": "button_isle-ditto-2-32",
"level": "4-10",
"pokemon": "ditto",
"presets": [
"natural"
],
"spawnablePositionType": "grounded",
"type": "pokemon",
"weight": 60.0
},
{
"anticondition": {
"biomes": [
@@ -796,7 +744,7 @@
],
"zone": "button_isle"
},
"id": "button_isle-meditite-2-46",
"id": "button_isle-meditite-2-44",
"level": "5-10",
"pokemon": "meditite",
"presets": [
@@ -825,7 +773,7 @@
],
"zone": "button_isle"
},
"id": "button_isle-meditite-3-47",
"id": "button_isle-meditite-3-45",
"level": "5-10",
"pokemon": "meditite",
"presets": [
@@ -859,7 +807,7 @@
"minSkyLight": 8,
"zone": "button_isle"
},
"id": "button_isle-meowth-1-66",
"id": "button_isle-meowth-1-64",
"level": "4-10",
"pokemon": "meowth",
"presets": [
@@ -905,7 +853,7 @@
],
"zone": "button_isle"
},
"id": "button_isle-meowth-2-67",
"id": "button_isle-meowth-2-65",
"level": "4-10",
"pokemon": "meowth",
"presets": [
@@ -939,7 +887,7 @@
"minSkyLight": 8,
"zone": "button_isle"
},
"id": "button_isle-meowth-3-68",
"id": "button_isle-meowth-3-66",
"level": "4-10",
"pokemon": "meowth",
"presets": [
@@ -977,7 +925,7 @@
],
"zone": "button_isle"
},
"id": "button_isle-meowth-4-69",
"id": "button_isle-meowth-4-67",
"level": "4-10",
"pokemon": "meowth",
"presets": [
@@ -1022,7 +970,7 @@
],
"zone": "button_isle"
},
"id": "button_isle-meowth-alolan-5-70",
"id": "button_isle-meowth-alolan-5-68",
"level": "4-10",
"pokemon": "meowth alolan",
"presets": [
@@ -1061,7 +1009,7 @@
],
"zone": "button_isle"
},
"id": "button_isle-meowth-alolan-6-71",
"id": "button_isle-meowth-alolan-6-69",
"level": "4-10",
"pokemon": "meowth alolan",
"presets": [
@@ -1098,7 +1046,7 @@
],
"zone": "button_isle"
},
"id": "button_isle-meowth-alolan-7-72",
"id": "button_isle-meowth-alolan-7-70",
"level": "4-10",
"pokemon": "meowth alolan",
"spawnablePositionType": "grounded",
@@ -1176,7 +1124,7 @@
],
"zone": "button_isle"
},
"id": "button_isle-morpeko-1-65",
"id": "button_isle-morpeko-1-63",
"level": "2-10",
"pokemon": "morpeko",
"presets": [
@@ -1283,7 +1231,7 @@
"minSkyLight": 8,
"zone": "button_isle"
},
"id": "button_isle-rattata-1-50",
"id": "button_isle-rattata-1-48",
"level": "2-10",
"pokemon": "rattata",
"presets": [
@@ -1316,7 +1264,7 @@
"minY": 0,
"zone": "button_isle"
},
"id": "button_isle-rattata-2-51",
"id": "button_isle-rattata-2-49",
"level": "2-10",
"pokemon": "rattata",
"presets": [
@@ -1348,7 +1296,7 @@
"minY": 0,
"zone": "button_isle"
},
"id": "button_isle-rattata-3-52",
"id": "button_isle-rattata-3-50",
"level": "2-10",
"pokemon": "rattata",
"presets": [
@@ -1381,7 +1329,7 @@
"minSkyLight": 0,
"zone": "button_isle"
},
"id": "button_isle-rattata-alolan-4-53",
"id": "button_isle-rattata-alolan-4-51",
"level": "2-10",
"pokemon": "rattata alolan",
"presets": [
@@ -1407,7 +1355,7 @@
"maxY": 0,
"zone": "button_isle"
},
"id": "button_isle-rattata-alolan-5-54",
"id": "button_isle-rattata-alolan-5-52",
"level": "2-10",
"pokemon": "rattata alolan",
"presets": [
@@ -1431,7 +1379,7 @@
],
"zone": "button_isle"
},
"id": "button_isle-sableye-1-37",
"id": "button_isle-sableye-1-35",
"level": "2-10",
"pokemon": "sableye",
"presets": [
@@ -1454,7 +1402,7 @@
"minSkyLight": 8,
"zone": "button_isle"
},
"id": "button_isle-scatterbug-1-48",
"id": "button_isle-scatterbug-1-46",
"level": "2-10",
"pokemon": "scatterbug",
"presets": [
@@ -1511,7 +1459,7 @@
],
"zone": "button_isle"
},
"id": "button_isle-skitty-1-41",
"id": "button_isle-skitty-1-39",
"level": "2-10",
"pokemon": "skitty",
"presets": [
@@ -1544,7 +1492,7 @@
"minSkyLight": 8,
"zone": "button_isle"
},
"id": "button_isle-skitty-2-42",
"id": "button_isle-skitty-2-40",
"level": "2-10",
"pokemon": "skitty",
"presets": [
@@ -1575,7 +1523,7 @@
],
"zone": "button_isle"
},
"id": "button_isle-skitty-4-43",
"id": "button_isle-skitty-4-41",
"level": "2-10",
"pokemon": "skitty",
"presets": [
@@ -1602,7 +1550,7 @@
"minSkyLight": 8,
"zone": "button_isle"
},
"id": "button_isle-skitty-5-44",
"id": "button_isle-skitty-5-42",
"level": "2-10",
"pokemon": "skitty",
"presets": [
@@ -1629,7 +1577,7 @@
"minSkyLight": 8,
"zone": "button_isle"
},
"id": "button_isle-smeargle-1-35",
"id": "button_isle-smeargle-1-33",
"level": "2-10",
"pokemon": "smeargle",
"presets": [
@@ -1659,7 +1607,7 @@
],
"zone": "button_isle"
},
"id": "button_isle-smeargle-2-36",
"id": "button_isle-smeargle-2-34",
"level": "2-10",
"pokemon": "smeargle",
"presets": [
@@ -1688,7 +1636,7 @@
"minSkyLight": 8,
"zone": "button_isle"
},
"id": "button_isle-spewpa-1-49",
"id": "button_isle-spewpa-1-47",
"level": "9-10",
"pokemon": "spewpa",
"presets": [
@@ -1722,7 +1670,7 @@
"timeRange": "night",
"zone": "button_isle"
},
"id": "button_isle-spinarak-1-38",
"id": "button_isle-spinarak-1-36",
"level": "2-10",
"pokemon": "spinarak",
"presets": [
@@ -1749,7 +1697,7 @@
"minSkyLight": 0,
"zone": "button_isle"
},
"id": "button_isle-spinarak-2-39",
"id": "button_isle-spinarak-2-37",
"level": "2-10",
"pokemon": "spinarak",
"presets": [
@@ -1775,7 +1723,7 @@
"minY": 0,
"zone": "button_isle"
},
"id": "button_isle-spinarak-3-40",
"id": "button_isle-spinarak-3-38",
"level": "2-10",
"pokemon": "spinarak",
"presets": [
@@ -1804,7 +1752,7 @@
],
"zone": "button_isle"
},
"id": "button_isle-sunkern-2-55",
"id": "button_isle-sunkern-2-53",
"level": "2-10",
"pokemon": "sunkern",
"presets": [
@@ -1910,7 +1858,7 @@
],
"zone": "button_isle"
},
"id": "button_isle-wooper-3-56",
"id": "button_isle-wooper-3-54",
"level": "2-10",
"pokemon": "wooper",
"presets": [
@@ -1943,7 +1891,7 @@
"minSkyLight": 0,
"zone": "button_isle"
},
"id": "button_isle-wooper-4-57",
"id": "button_isle-wooper-4-55",
"level": "2-10",
"pokemon": "wooper",
"presets": [
@@ -1975,7 +1923,7 @@
"minSkyLight": 0,
"zone": "button_isle"
},
"id": "button_isle-wooper-8-58",
"id": "button_isle-wooper-8-56",
"level": "2-10",
"pokemon": "wooper",
"spawnablePositionType": "fishing",
@@ -1994,7 +1942,7 @@
"canSeeSky": true,
"zone": "button_isle"
},
"id": "button_isle-wooper-paldean-26-61",
"id": "button_isle-wooper-paldean-26-59",
"level": "2-10",
"pokemon": "wooper paldean",
"spawnablePositionType": "fishing",
@@ -2011,7 +1959,7 @@
"minLureLevel": 1,
"zone": "button_isle"
},
"id": "button_isle-wooper-paldean-27-62",
"id": "button_isle-wooper-paldean-27-60",
"level": "2-10",
"pokemon": "wooper paldean",
"spawnablePositionType": "fishing",
@@ -2039,7 +1987,7 @@
"minSkyLight": 8,
"zone": "button_isle"
},
"id": "button_isle-wooper-paldean-31-63",
"id": "button_isle-wooper-paldean-31-61",
"level": "2-10",
"pokemon": "wooper paldean",
"spawnablePositionType": "fishing",
@@ -2058,7 +2006,7 @@
"minSkyLight": 8,
"zone": "button_isle"
},
"id": "button_isle-wooper-paldean-32-64",
"id": "button_isle-wooper-paldean-32-62",
"level": "2-10",
"pokemon": "wooper paldean",
"spawnablePositionType": "fishing",
@@ -2089,7 +2037,7 @@
"rodType": "cobblemon:love_rod",
"zone": "button_isle"
},
"id": "button_isle-wooper-true-15-59",
"id": "button_isle-wooper-true-15-57",
"level": "2-10",
"pokemon": "wooper wooper_heart=true",
"spawnablePositionType": "fishing",
@@ -2113,7 +2061,7 @@
"minSkyLight": 0,
"zone": "button_isle"
},
"id": "button_isle-wooper-true-17-60",
"id": "button_isle-wooper-true-17-58",
"level": "2-10",
"pokemon": "wooper wooper_heart=true",
"spawnablePositionType": "fishing",
@@ -2164,7 +2112,7 @@
"minSkyLight": 0,
"zone": "button_isle"
},
"id": "button_isle-wynaut-1-45",
"id": "button_isle-wynaut-1-43",
"level": "2-10",
"pokemon": "wynaut",
"presets": [
@@ -16,7 +16,7 @@
],
"zone": "deep_dark"
},
"id": "deep_dark-aegislash-2-29",
"id": "deep_dark-aegislash-2-31",
"level": "45-60",
"pokemon": "aegislash",
"spawnablePositionType": "grounded",
@@ -33,7 +33,7 @@
"minY": 0,
"zone": "deep_dark"
},
"id": "deep_dark-bronzong-1-30",
"id": "deep_dark-bronzong-1-32",
"level": "45-60",
"pokemon": "bronzong",
"presets": [],
@@ -54,7 +54,7 @@
],
"zone": "deep_dark"
},
"id": "deep_dark-bronzong-2-31",
"id": "deep_dark-bronzong-2-33",
"level": "45-60",
"pokemon": "bronzong",
"presets": [
@@ -76,7 +76,7 @@
],
"zone": "deep_dark"
},
"id": "deep_dark-carbink-1-25",
"id": "deep_dark-carbink-1-27",
"level": "45-60",
"pokemon": "carbink",
"presets": [],
@@ -103,7 +103,7 @@
],
"zone": "deep_dark"
},
"id": "deep_dark-coalossal-1-17",
"id": "deep_dark-coalossal-1-19",
"level": "45-60",
"pokemon": "coalossal",
"presets": [],
@@ -125,7 +125,7 @@
"maxSkyLight": 15,
"zone": "deep_dark"
},
"id": "deep_dark-corviknight-1-5",
"id": "deep_dark-corviknight-1-7",
"level": "45-60",
"pokemon": "corviknight",
"presets": [
@@ -150,7 +150,7 @@
"maxSkyLight": 15,
"zone": "deep_dark"
},
"id": "deep_dark-crobat-1-20",
"id": "deep_dark-crobat-1-22",
"level": "45-60",
"pokemon": "crobat",
"presets": [],
@@ -173,7 +173,7 @@
"canSeeSky": false,
"zone": "deep_dark"
},
"id": "deep_dark-crobat-4-21",
"id": "deep_dark-crobat-4-23",
"level": "45-60",
"pokemon": "crobat",
"presets": [
@@ -197,6 +197,42 @@
}
]
},
{
"bucket": "rare",
"condition": {
"biomes": [
"minecraft:deep_dark"
],
"isSlimeChunk": true,
"maxSkyLight": 15,
"zone": "deep_dark"
},
"id": "deep_dark-ditto-1-0",
"level": "45-60",
"pokemon": "ditto",
"presets": [],
"spawnablePositionType": "grounded",
"type": "pokemon",
"weight": 100.0
},
{
"bucket": "ultra-rare",
"condition": {
"biomes": [
"minecraft:deep_dark"
],
"isSlimeChunk": false,
"maxSkyLight": 15,
"zone": "deep_dark"
},
"id": "deep_dark-ditto-2-1",
"level": "45-60",
"pokemon": "ditto",
"presets": [],
"spawnablePositionType": "grounded",
"type": "pokemon",
"weight": 60.0
},
{
"bucket": "uncommon",
"condition": {
@@ -209,7 +245,7 @@
],
"zone": "deep_dark"
},
"id": "deep_dark-doublade-2-28",
"id": "deep_dark-doublade-2-30",
"level": "45-60",
"pokemon": "doublade",
"spawnablePositionType": "grounded",
@@ -230,7 +266,7 @@
"maxSkyLight": 15,
"zone": "deep_dark"
},
"id": "deep_dark-dusclops-1-0",
"id": "deep_dark-dusclops-1-2",
"level": "45-60",
"pokemon": "dusclops",
"presets": [],
@@ -252,7 +288,7 @@
"maxSkyLight": 15,
"zone": "deep_dark"
},
"id": "deep_dark-dusknoir-1-1",
"id": "deep_dark-dusknoir-1-3",
"level": "45-60",
"pokemon": "dusknoir",
"presets": [],
@@ -270,7 +306,7 @@
"maxSkyLight": 15,
"zone": "deep_dark"
},
"id": "deep_dark-gallade-1-14",
"id": "deep_dark-gallade-1-16",
"level": "45-60",
"pokemon": "gallade",
"presets": [],
@@ -288,7 +324,7 @@
"maxSkyLight": 15,
"zone": "deep_dark"
},
"id": "deep_dark-gardevoir-1-13",
"id": "deep_dark-gardevoir-1-15",
"level": "45-60",
"pokemon": "gardevoir",
"presets": [],
@@ -306,7 +342,7 @@
"maxY": 0,
"zone": "deep_dark"
},
"id": "deep_dark-gigalith-1-15",
"id": "deep_dark-gigalith-1-17",
"level": "45-60",
"pokemon": "gigalith",
"presets": [],
@@ -323,7 +359,7 @@
"maxSkyLight": 7,
"zone": "deep_dark"
},
"id": "deep_dark-gigalith-2-16",
"id": "deep_dark-gigalith-2-18",
"level": "45-60",
"pokemon": "gigalith",
"presets": [],
@@ -343,7 +379,7 @@
],
"zone": "deep_dark"
},
"id": "deep_dark-glimmora-1-7",
"id": "deep_dark-glimmora-1-9",
"level": "45-60",
"pokemon": "glimmora",
"presets": [],
@@ -372,7 +408,7 @@
"maxSkyLight": 15,
"zone": "deep_dark"
},
"id": "deep_dark-golbat-1-18",
"id": "deep_dark-golbat-1-20",
"level": "45-60",
"pokemon": "golbat",
"presets": [],
@@ -395,7 +431,7 @@
"canSeeSky": false,
"zone": "deep_dark"
},
"id": "deep_dark-golbat-4-19",
"id": "deep_dark-golbat-4-21",
"level": "45-60",
"pokemon": "golbat",
"presets": [
@@ -435,7 +471,7 @@
"maxSkyLight": 15,
"zone": "deep_dark"
},
"id": "deep_dark-honchkrow-1-4",
"id": "deep_dark-honchkrow-1-6",
"level": "45-60",
"pokemon": "honchkrow",
"presets": [
@@ -465,7 +501,7 @@
"maxSkyLight": 15,
"zone": "deep_dark"
},
"id": "deep_dark-houndstone-1-2",
"id": "deep_dark-houndstone-1-4",
"level": "45-60",
"pokemon": "houndstone",
"presets": [],
@@ -487,7 +523,7 @@
],
"zone": "deep_dark"
},
"id": "deep_dark-klinklang-2-9",
"id": "deep_dark-klinklang-2-11",
"level": "49-60",
"pokemon": "klinklang",
"presets": [
@@ -512,7 +548,7 @@
"maxSkyLight": 15,
"zone": "deep_dark"
},
"id": "deep_dark-mabosstiff-1-23",
"id": "deep_dark-mabosstiff-1-25",
"level": "45-60",
"pokemon": "mabosstiff",
"presets": [
@@ -540,7 +576,7 @@
"isSlimeChunk": true,
"zone": "deep_dark"
},
"id": "deep_dark-milotic-1-6",
"id": "deep_dark-milotic-1-8",
"level": "45-60",
"pokemon": "milotic",
"spawnablePositionType": "fishing",
@@ -556,7 +592,7 @@
"maxSkyLight": 15,
"zone": "deep_dark"
},
"id": "deep_dark-mimikyu-1-3",
"id": "deep_dark-mimikyu-1-5",
"level": "45-60",
"pokemon": "mimikyu",
"presets": [],
@@ -573,7 +609,7 @@
"maxSkyLight": 15,
"zone": "deep_dark"
},
"id": "deep_dark-mrmime-1-10",
"id": "deep_dark-mrmime-1-12",
"level": "45-60",
"pokemon": "mrmime",
"presets": [
@@ -598,7 +634,7 @@
"maxSkyLight": 15,
"zone": "deep_dark"
},
"id": "deep_dark-mrmime-galarian-4-11",
"id": "deep_dark-mrmime-galarian-4-13",
"level": "45-60",
"pokemon": "mrmime galarian",
"presets": [
@@ -623,7 +659,7 @@
"maxSkyLight": 15,
"zone": "deep_dark"
},
"id": "deep_dark-mrrime-1-12",
"id": "deep_dark-mrrime-1-14",
"level": "45-60",
"pokemon": "mrrime",
"presets": [
@@ -642,7 +678,7 @@
"maxSkyLight": 7,
"zone": "deep_dark"
},
"id": "deep_dark-probopass-1-8",
"id": "deep_dark-probopass-1-10",
"level": "45-60",
"pokemon": "probopass",
"presets": [],
@@ -659,7 +695,7 @@
"maxSkyLight": 15,
"zone": "deep_dark"
},
"id": "deep_dark-revavroom-1-24",
"id": "deep_dark-revavroom-1-26",
"level": "45-60",
"pokemon": "revavroom",
"presets": [],
@@ -682,7 +718,7 @@
"maxSkyLight": 7,
"zone": "deep_dark"
},
"id": "deep_dark-steelix-1-22",
"id": "deep_dark-steelix-1-24",
"level": "45-60",
"pokemon": "steelix",
"presets": [],
@@ -699,7 +735,7 @@
"maxSkyLight": 7,
"zone": "deep_dark"
},
"id": "deep_dark-zweilous-1-26",
"id": "deep_dark-zweilous-1-28",
"level": "50-60",
"pokemon": "zweilous",
"presets": [],
@@ -723,7 +759,7 @@
"maxY": 0,
"zone": "deep_dark"
},
"id": "deep_dark-zweilous-2-27",
"id": "deep_dark-zweilous-2-29",
"level": "50-60",
"pokemon": "zweilous",
"presets": [],