Cobblemon Survival Pack: phases 0-2 and Phase 3 zones and hazards

Free NeoForge 1.21.1 modpack on Cobblemon 1.8.4 built with packwiz, plus
the Kotlin companion mod (cobblesurvival) and its built-in data pack.

- Phase 0: packwiz pack with Modrinth/CurseForge cross-links, build and
  export tooling, Prism instance sync, test server with smoke checks.
- Phase 1: Poke Ball shaped island (WorldGen Editor preset, seed isle-26),
  Adrian's biome list, no natural ore, structures without ore or vanilla
  mobs, no Nether portals, world template builder and world report.
- Phase 2: permadeath (CobbleHardcoreMon plus the companion mod's gap
  fixes), Revival Charm, expensive Healing Machine, Lootr refreshing
  loot, in-game self-tests on Minecraft's GameTest framework.
- Phase 3 so far: 14 zones with their own spawn pools and level bands
  (tools/zone_layout.py, tools/zone_spawns.py, "zone" spawn condition),
  Cold Sweat heat and cold as gates with boss-drop insulation recipes,
  spawn survey and hazard self-tests in tools/quick_check.py.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
claudeandClaude Opus 5.5 committed 2026-10-29 19:01:21 +01:00
commit 398301f0be
232 files changed
+72665

No files matched your search

+53
View File
@@ -0,0 +1,53 @@
# World template
The island world is generated, not hand-built. This folder holds the recipe. The world itself is a build output (several hundred MB of region files), so it stays out of git.
| File | What it sets |
| --- | --- |
| `world.json` | Seed, world type, pregeneration radius, border margin, pinned Chunky download |
| `biomes.json` | The biome list and how every vanilla biome maps onto it, plus extra entries (basalt deltas as a cave biome) |
| `../pack/config/worldgen_editor/presets/cobblesurvival_island.json` | The island's outline: a Poké Ball (round island, channel across the middle, ring channel around the centre island). **Generated** by `tools/pokeball_preset.py` |
| `../datapacks/core/data/cobblesurvival/worldgen/world_preset/island.json` | The world type `cobblesurvival:island`: overworld (island shape + remapped biome table) and the End, no Nether. **Generated** by `tools/biome_layout.py` from `biomes.json`; don't edit by hand |
## Building it
```bash
python3 tools/biome_layout.py # only after changing biomes.json
python3 tools/seed_search.py # only to pick a new seed (add --apply to write it to world.json)
python3 tools/build.py && python3 tools/make_world.py
```
`seed_search.py` previews many seeds without generating chunks (op-only dev command `/cobblesurvival biomepreview`) and ranks them on biome coverage, patch size, a gentle start area and cave biomes. It writes `build/seed-search/candidates.png` and `report.json`.
`make_world.py` uses the local test server (its `eula.txt` must already accept the EULA). In one server session it creates the world, pregenerates a circle of `pregen_radius` with Chunky (the island and a strip of sea; the sea corners inside the square border generate when someone gets there), and puts a square world border `border_margin` blocks outside the outermost coast. It takes about 6 minutes and writes:
- `build/world-template/`: the world, without player data
- `build/island-map.png`: top-down biome map with zone outlines, border and spawn
- `build/island-report.json`: ore scan, land bounds, border gaps, biome shares
For checking a change without rebuilding the island, `tools/quick_check.py` samples a fresh world instead (about 1–2 minutes; structures to sample are listed under `quick_check` in `world.json`).
`python3 tools/prism_instance.py` installs the template into the Prism instance as the save **Cobblemon Survival Island**. `tools/smoke_test.py` boots the test server on it.
Same seed, preset and mod versions give the same island. After changing any of them, rebuild the template; existing chunks never change on their own.
## Editing the island
Change the outline: `python3 tools/pokeball_preset.py --radius 1500 --band 160 --button 280 --ring 120` (all in blocks), then search seeds again and rebuild the template. For other shapes, edit the preset JSON by hand (field reference: the [WorldGen Editor wiki](https://github.com/waterflane/WorldGen-Editor/wiki); the [previewer](https://github.com/waterflane/WorldGen-Editor-Preview) shows outlines before generating). Keep `temperature` at `standard` and don't use `exclude_biomes`: both make WorldGen Editor swap cave biomes for surface fallbacks and let unlisted biomes in. If the ball gets bigger, raise `pregen_radius` in `world.json` too.
Change which biomes exist, or what replaces what: edit `biomes.json`, run `tools/biome_layout.py`, then search seeds again. Where a biome lands depends on the seed's climate noise, not on the lobes.
Hand edits on the finished world (paths, landmarks, a reshaped coast):
- **WorldPainter** (desktop): import `build/world-template` (File → Import → Existing Minecraft map), edit, and export it back to a folder. Keep a copy first. WorldPainter rewrites chunks and may drop Cobblemon data in those chunks, so edit before anyone plays on the world.
- **In-game**, in creative on the Prism save: build normally, or use a world-edit mod for larger changes. Then copy the save back over `build/world-template` and run `python3 tools/world_report.py` to re-check ore and border.
Hand edits are lost when the template is regenerated, so keep them few, or export them as structures.
## Ore
There is no natural ore. NeoForge's `remove_features` biome modifier (`datapacks/core/.../biome_modifier/no_natural_ores.json`) removes vanilla ore features. Cobblemon's evolution-stone ores are added from code, so they are switched off by overriding their placed features with zero placements (`tools/cobblemon_ore_overrides.py`; re-run it after a Cobblemon update). The large copper/iron ore veins are turned off in the overridden WorldGen Editor noise settings (`ore_veins_enabled: false`). Structures and fossils that have ore built in (Cobblemon habitats and ruins, vanilla fossils) keep their shape, but `tools/clean_structures.py` makes their processors turn ore into stone (re-run it after a mod update). Nether fortresses and Nether ruined portals can't appear in the basalt-delta caves (their biome tags leave basalt deltas out). `tools/world_report.py` scans every block of every chunk for anything ending in `_ore`, ancient debris and raw ore blocks.
## Mobs
Only Pokémon. The companion mod (`mod/.../world/OnlyPokemon.kt`) never lets a vanilla mob join a world unless it is loaded from a save (exceptions: entity type tag `cobblesurvival:allowed_vanilla_mobs`, for now the Ender Dragon). That covers mobs that structures place during generation, so all structures stay. When a chunk has just been generated it also removes spawners and trial spawners (block tag `cobblesurvival:removed_on_generation`), stops sculk shriekers from summoning the Warden, and turns infested blocks back into normal ones. Underneath, vanilla spawn lists are emptied (`no_vanilla_spawns.json`), infested stone doesn't generate (`no_infested_stone.json`) and the template has `doMobSpawning false`. `tools/world_report.py` fails if the world stores any vanilla mob or mob source.