Spawn levels: every evolution stage that fits a zone spawns up to its top

Adrian (2026-10-31): Dusclops only spawned at Lv 45-46 in the Deep Dark,
because Cobblemon's own range for a stage stops where the next one takes
over. Every stage that reaches a zone's band now spawns up to the band's
top (Dusclops, Golbat, Doublade 45-60). Wild Pokemon never evolve; a
caught one past its evolution level evolves on its next level-up. Island
quick check passed (spawn survey and 36 self-tests).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
claudeandClaude Opus 5.5 committed 2026-10-31 02:28:48 +01:00
1 parent d49684a2eb
commit 610b0d2a47
12 files changed
+277 -277

No files matched your search

+6 -6
View File
@@ -20,8 +20,9 @@ datapacks/core/data/cobblesurvival/spawn_pool_world/<zone>.json:
2. In its home zone a line keeps Cobblemon's spawn entries (bucket, weight, time, light,
presets) for the biomes the zone has, plus "zone": "<id>". Levels are clamped into the
zone's band, so the band picks the evolution stages: a stage whose levels miss the band
doesn't spawn there. If no stage fits, the closest one spawns across the whole band. The
line's top stage spawns up to the top of the band (Cobblemon's own ranges stop earlier).
doesn't spawn there. If no stage fits, the closest one spawns across the whole band. Every
stage that reaches the band spawns up to its top (Adrian, 2026-10-31; Cobblemon's own ranges
stop where the next stage takes over, which left e.g. Dusclops at Lv 45–46 in the Deep Dark).
3. world/zones.json → "species" pins a line to a zone by hand: {"pikachu": "southwold"}.
4. In cave zones every entry spawns in the cave's biome, and sky-light minimums, "can see sky", time
of day, excluded biomes and the "natural" ground preset are dropped (there's no sky or day underground).
@@ -261,10 +262,9 @@ def main():
if (zid in cave_zones or b & biomes_of[zid]) and (high or m not in strong_flyers)]
if not usable:
continue
reaching = [u for u in usable if u[3][0] <= hi and u[3][1] >= lo]
top = max(reaching, key=lambda u: u[3][1])[2] if reaching else None
# The top stage spawns up to the band's top; Cobblemon's own ranges often stop well below it.
fitting = [(e, m, max(lv[0], lo), hi if m == top else min(lv[1], hi)) for e, b, m, lv in reaching]
# Every stage that reaches the band spawns up to its top; Cobblemon's own ranges stop where the next stage
# takes over. A caught one past its evolution level evolves on its next level-up.
fitting = [(e, m, max(lv[0], lo), hi) for e, b, m, lv in usable if lv[0] <= hi and lv[1] >= lo]
if not fitting:
# No stage reaches the band: the closest stage spawns across all of it.
e, b, m, lv = min(usable, key=lambda u: min(abs(u[3][0] - hi), abs(u[3][1] - lo)))