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:
commit
398301f0be
232 files changed
+72665
No files matched your search
@@ -0,0 +1,79 @@
|
||||
# Addon status
|
||||
|
||||
Checked 2026-10-28 against Cobblemon **1.8.4** (NeoForge, MC 1.21.1). Re-check before each phase that adds a mod.
|
||||
|
||||
"Declares" is the Cobblemon version range in the mod's own `neoforge.mods.toml`. A range such as `[1.7.0,)` only means the jar *loads* on 1.8; it is not proof that it works there. "Platforms" is where the exact 1.21.1 NeoForge file is hosted (MR = Modrinth, CF = CurseForge). This matters because the pack never bundles third-party jars: a mod missing from one platform is missing from that platform's export.
|
||||
|
||||
## In the pack now
|
||||
|
||||
| Mod | Role | Pinned version (file IDs) | Platforms | Cobblemon 1.8 status |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| Cobblemon | core | 1.8.4+1.21.1 (MR `xsVHrAsY`, CF `9341850`) | MR + CF | n/a. Released 2026-10-27; the roadmap named 1.8.3 as current |
|
||||
| Kotlin for Forge | Cobblemon + companion dependency | 5.12.0 (MR `uhJhCT7X`, CF `8335665`) | MR + CF | n/a. Ships Kotlin 2.4.0. The CF and MR builds differ by 12 bytes (see `tools/crosslink.json`) |
|
||||
| KubeJS | recipes, tags, item tweaks | 2101.7.2-build.377 (MR `THIGFPwf`, CF `8843626`) | MR + CF | n/a (no Cobblemon dependency) |
|
||||
| Rhino | KubeJS dependency | 2101.2.7-build.85 (MR `cQ4POTah`, CF `8218748`) | MR + CF | n/a |
|
||||
| FTB Quests | quest book (Phase 8) | 2101.1.37 (CF `9298629`) | **CF only** | n/a |
|
||||
| FTB Library | FTB Quests dependency | 2101.1.39 (CF `9350706`) | **CF only** | n/a |
|
||||
| FTB Teams | FTB Quests dependency | 2101.1.11 (CF `8724782`) | **CF only** | n/a |
|
||||
| Architectury API | FTB + Fight or Flight dependency | 13.0.11 (MR `1IiqEQGl`, CF `8492726`) | MR + CF | n/a |
|
||||
| WorldGen Editor | island world generation (Phase 1) | 0.3.0 (MR `fIu1vr7j`, CF `8269080`) | MR + CF | n/a (no Cobblemon dependency) |
|
||||
| Just Enough Items (JEI) | QOL: recipe and item viewer | `jei-1.21.1-neoforge-19.64.0.455.jar` (MR `iv3KiVkE`) | MR + CF | n/a (no Cobblemon dependency); side: both |
|
||||
| MezzConfig | QOL: JEI dependency | `mezz_config-1.21.1-neoforge-0.6.9-standalone.jar` (MR `RdGonQpr`) | MR + CF | n/a (no Cobblemon dependency); side: both |
|
||||
| Jade | QOL: shows the block/entity you look at and its mod | `Jade-1.21.1-NeoForge-15.10.6.jar` (MR `eYz2YBGT`) | MR + CF | n/a (no Cobblemon dependency); side: both |
|
||||
| Inventory Profiles Next | QOL: inventory sorting, auto-refill (Inventory Tweaks successor) | `InventoryProfilesNext-neoforge-1.21.1-2.2.5.jar` (MR `vjuNnHLv`) | MR (CF link not resolved yet) | n/a (no Cobblemon dependency); side: client |
|
||||
| libIPN | QOL: Inventory Profiles Next dependency | `libIPN-neoforge-1.21.1-6.6.3.jar` (MR `BGe4KMlE`) | MR (CF link not resolved yet) | n/a (no Cobblemon dependency); side: client |
|
||||
| Mouse Tweaks | QOL: drag/scroll item moving | `MouseTweaks-neoforge-mc1.21-2.26.1.jar` (MR `9I21YYxf`) | MR + CF | n/a (no Cobblemon dependency); side: client |
|
||||
| AppleSkin | QOL: food and saturation display | `appleskin-neoforge-mc1.21-3.0.9.jar` (MR `uAKA6Laj`) | MR + CF | n/a (no Cobblemon dependency); side: both |
|
||||
| Controlling | QOL: keybind search | `Controlling-neoforge-1.21.1-19.0.5.jar` (MR `FaNppCJJ`) | MR + CF | n/a (no Cobblemon dependency); side: client |
|
||||
| Searchables | QOL: Controlling dependency | `Searchables-neoforge-1.21.1-1.0.2.jar` (MR `iEE85X0w`) | MR + CF | n/a (no Cobblemon dependency); side: client |
|
||||
| Xaero's Minimap | QOL: minimap | `xaerominimap-neoforge-1.21.1-26.6.0.jar` (MR `irjR7dHk`) | MR + CF | n/a (no Cobblemon dependency); side: both |
|
||||
| Xaero's World Map | QOL: world map | `xaeroworldmap-neoforge-1.21.1-1.47.0.jar` (MR `SnQ4SoDe`) | MR + CF | n/a (no Cobblemon dependency); side: both |
|
||||
| Sodium | QOL: rendering performance | `sodium-neoforge-0.8.13+mc1.21.1.jar` (MR `uMOpc5uV`) | MR + CF | n/a (no Cobblemon dependency); side: client |
|
||||
| FerriteCore | QOL: memory use | `ferritecore-7.0.3-neoforge.jar` (MR `x7kQWVju`) | MR (CF link not resolved yet) | n/a (no Cobblemon dependency); side: both |
|
||||
| ModernFix | QOL: load time and memory | `modernfix-neoforge-5.27.27+mc1.21.1.jar` (MR `ZDZENbHH`) | MR + CF | n/a (no Cobblemon dependency); side: both |
|
||||
| ImmediatelyFast | QOL: rendering performance | `ImmediatelyFast-NeoForge-1.6.15+1.21.1.jar` (MR `EJzmEPZV`) | MR + CF | n/a (no Cobblemon dependency); side: client |
|
||||
| Entity Culling | QOL: skips rendering hidden entities | `entityculling-neoforge-1.11.3-mc1.21.1.jar` (MR `eieYbWYb`) | MR (CF link not resolved yet) | n/a (no Cobblemon dependency); side: client |
|
||||
| Default Options | QOL: ships conflict-free default keybinds | `defaultoptions-neoforge-1.21.1-21.1.8.jar` (MR `1zt17WsC`) | MR | n/a (no Cobblemon dependency); side: client |
|
||||
| Balm | QOL: Default Options dependency | `balm-neoforge-1.21.1-21.0.66.jar` (MR `CquiaiDj`) | MR | n/a (no Cobblemon dependency); side: both |
|
||||
| CobbleHardcoreMon | permadeath (Phase 2) | `cobblehardcoremon-neoforge-1.1.1.jar` (MR `etRfYiu9`) | MR only | ✅ Declares `[1.8.2,)`; loads and runs on 1.8.4 (quick check). Totem item = Revival Charm |
|
||||
| Matthiesen Core | CobbleHardcoreMon dependency | `matthiesen-core-neoforge-1.3.5.jar` (MR `U24fxwu6`) | MR only | n/a. Sends usage statistics (FastStats) unless disabled; the pack ships `config/matthiesen_core/metrics.properties` with `enabled=false` |
|
||||
| Cobblemon Fight or Flight Reborn | wild Pokémon flee or fight back (Phase 2) | `fightorflight-neoforge-0.11.1.jar` (MR `OD7X9rYz`, CF `9156010`) | MR + CF | ✅ Declares `[1.8.2,)` |
|
||||
| Cobblemon TP-Pastures | pastured Pokémon teleported back, not recalled (Phase 2) | `cobblemon_tp_pastures-1.21.1-1.3.0.jar` (MR `so0hyqC2`) | MR + CF | ⚠️ Declares `[1.7.1,)`; loads on 1.8.4, behaviour still to be checked in-game |
|
||||
| Lootr | loot containers refill 1 hour after first opened, loot per player (Phase 2) | `lootr-neoforge-1.21.1-1.11.38.127.jar` (MR `SPOrIzX8`, CF `8968561`) | MR + CF | n/a (no Cobblemon dependency); converts Cobblemon's loot chests too |
|
||||
| Better Advanced Tooltips | none: ships *inside* KubeJS as jar-in-jar | — | — | Modrinth marks it as a required KubeJS dependency, but KubeJS declares it optional and embeds it. Not referenced separately |
|
||||
|
||||
JEI declares Minecraft `[1.21, 1.21.1)` in every 1.21.1 build, which a strict reading excludes; NeoForge 21.1.265 loads it anyway (server boot checked 2026-10-28).
|
||||
|
||||
## Planned for later phases (not yet in the pack)
|
||||
|
||||
| Mod | Phase | Latest 1.21.1 NeoForge file | Platforms | Cobblemon 1.8 status |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| Ore Generation Configuration | 1 (not needed) | 1.3.0 (CF `8153928`) | CF only | n/a. Natural ore is removed with data instead (see `world/README.md`) |
|
||||
| Chunky | 1 (build tool only, not in the pack) | 1.4.23 (MR `LuFhm4eU`, CF project `485681`) | MR + CF | n/a. `tools/make_world.py` adds it to the test server only while pregenerating |
|
||||
| Cold Sweat | 3 | 2.4.4 (MR `UGoodVYD`, CF `9215368`) | MR + CF | **In the pack** (2026-10-29); same jar on both platforms |
|
||||
| Regenerating Ore Veins | 4 | 1.4.0 (CF `8066055`) | CF only | n/a |
|
||||
| Cobblebase | 4 | 2.0.1+1.8.0 (MR `pFYNQ6W2`) | MR has the 1.8 build; **CF only has 2.0.0+1.7.0** | ✅ 2.0.1 requires ≥ 1.8.0 and fixes a startup crash on 1.8. Modrinth lists Xaero's Minimap, Cobbreeding and Cloth Config as required, but the jar declares only Cobblemon and Kotlin for Forge; verify when adding |
|
||||
| Cobblemon Poke Power | 4 (or own generator, Phase 6) | 1.3.1 (MR `vGpaTxmN`) | **MR only** | ✅ Declares `[1.8.0,)`. Needs Matthiesen Core |
|
||||
| Cobblemon Quests (FTB Quests integration) | 8 | 1.2.0 (MR `8KeptEg2`; CF project `922979`) | MR + CF | ❌ Targets 1.7. Its own changelog says it does not work with FTB Quests ≥ 2101.1.19; the pack has 2101.1.37. Blocked until updated |
|
||||
| Quests & Teams Fixes (flexible-mode soft-lock fix) | 8 | — | MR | ❌ Only 1.20.1 builds exist. Test the soft-lock on FTB Quests 2101.1.37 ourselves |
|
||||
| spark | 9 | 1.10.124 (MR `v5qtqRQi`, CF `6225208`) | MR + CF | n/a |
|
||||
|
||||
## Prior art and references (study only, never installed)
|
||||
|
||||
| Mod | Used for | Status found |
|
||||
| --- | --- | --- |
|
||||
| Cobblemon Field Survival | Phase 5 | 0.19.2-beta on CF (`9141831`), MIT. Now pins Cobblemon `[1.8.2+1.21.1]` exactly (the roadmap listed 1.7.3) |
|
||||
| Cobblemon Environment Interactions | Phase 5 | 3.1.0 on MR + CF, Apache-2.0. Declares `[1.7.3,)`, no 1.8 statement |
|
||||
| SceneBlocks | Phase 5 | 0.2.5 on CF (`9261939`), CobbleKanto custom license. Declares `[1.8.0,)` |
|
||||
| CobbleStrike | Phase 5 | 0.4.0 for NeoForge 1.21.1 released 2026-10-28, All Rights Reserved. Declares `[1.7.0,)`. The roadmap's "built for 1.5.2" is out of date |
|
||||
| Cobblemon Auto-Battle | Phase 7 (flee-distance note) | MR builds for 1.21.10/1.21.11 only. Reference only |
|
||||
| Cobblemon Box Link | — | **Must not be installed** (remote PC access breaks pillar 5) |
|
||||
|
||||
## Platform split
|
||||
|
||||
No single platform hosts everything the roadmap names:
|
||||
|
||||
- **CurseForge only:** FTB Quests, FTB Library, FTB Teams, Ore Generation Configuration, Regenerating Ore Veins (and the 1.8 build of Cobblebase is Modrinth only).
|
||||
- **Modrinth only:** CobbleHardcoreMon, Matthiesen Core, Cobblemon Poke Power, Cobblebase 2.0.1.
|
||||
|
||||
`tools/build.py` leaves each mod out of the export for the platform that doesn't host it and lists what it left out. Today the `.mrpack` lacks the three FTB mods. Once Phases 1–4 land, the CurseForge zip will lack permadeath, and the Modrinth pack will lack quests and ore veins. This needs a decision (see `docs/design.md`, open decisions).
|
||||
@@ -0,0 +1,34 @@
|
||||
# Balance values
|
||||
|
||||
Every tunable lives in a config file or in this table. **Placeholder** means guessed and not yet approved by Adrian; never treat a placeholder as decided.
|
||||
|
||||
| Value | Current | Status | Where it is applied | Notes |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| Island radius | 1,500 blocks | Placeholder | `tools/pokeball_preset.py --radius` | Test value from the roadmap; final size after Phase 1 review |
|
||||
| Poké Ball band | 160 blocks wide channel across the middle | Placeholder | `tools/pokeball_preset.py --band` | |
|
||||
| Poké Ball button | centre island r 280, ring channel 120 wide | Placeholder | `tools/pokeball_preset.py --button --ring` | The world spawn lands on the button |
|
||||
| Coastline roughness | 0.03 (smooth, so the ball reads as a circle) | Placeholder | `tools/pokeball_preset.py` | |
|
||||
| Raw ore blocks in structures | raw iron → tuff, raw copper → terracotta, raw gold → yellow terracotta | Placeholder | `tools/clean_structures.py` (`RAW`) | Look-alikes only; ores in structures become stone/deepslate/netherrack |
|
||||
| World seed | chosen by `tools/seed_search.py` | Placeholder | `world/world.json` | Decides where each biome lands on the island |
|
||||
| Seed-search targets | ≥5% land share per surface biome (3% for cherry grove, mangrove swamp, windswept hills, jagged peaks); no biome above 35%; gentle land within 350 blocks of 0,0 | Placeholder | `tools/seed_search.py` | Scoring weights, not gameplay values |
|
||||
| Revival Charm recipe | 2 gold ingots, 2 Revives, 1 Max Revive (shaped) | Decided (Adrian, 2026-10-29) | `kubejs/server_scripts/revival_charm.js` | Meant to be expensive; gold comes from veins (Phase 4) and loot chests |
|
||||
| Healing Machine recipe | 3 gold ingots, 4 iron ingots, 1 Max Revive, 1 diamond (shaped; Cobblemon: 3 copper, 4 iron, Max Revive, redstone) | Decided (Adrian, 2026-10-29) | `kubejs/server_scripts/healing_machine.js` | Roadmap: make Healing Machines expensive |
|
||||
| Healing Machine recharge | 3,600 s from empty to full (6 charge, one per full Pokémon heal; Cobblemon: 900 s) | Decided (Adrian, 2026-10-29) | `config/cobblemon/main.json` → `secondsToChargeHealingMachine` | So a machine heals a full party about once an hour of play |
|
||||
| Fainted Pokémon auto-recovery | never (`defaultFaintTimer` 1e9 s) | Decided (permadeath) | `config/cobblemon/main.json` | |
|
||||
| Zone level bands | Button Isle 2–10, Southwold 8–18, Westmarch 15–25, Verdant Jungle 18–30, Highland Meadows 25–35, Mangrove Mire 25–38, Sunscorch 30–45, Frostpeak 40–55, Shallows 5–20, Deep Sea 30–50, Lush Caves 12–28, Dripstone 22–38, Deep Dark 45–60, Basalt Furnace 55–70 | Placeholder | `world/zones.json` → `levels`, then `tools/zone_layout.py` and `tools/zone_spawns.py` | Zone shapes approved (Adrian, 2026-10-29) |
|
||||
| Evolution lines per zone (targets) | 15–35 per zone, scaled to the 377 lines available | Placeholder | `world/zones.json` → `lines` | Result per zone in `docs/zone-species.md` |
|
||||
| Lines pinned to a zone | Durant, Torkoal, Heatmor → Basalt Furnace | Placeholder | `world/zones.json` → `species` | Basalt's own lines were all too big for its caves |
|
||||
| Comfortable temperature range | 0.25–1.51 (Cold Sweat units; Cold Sweat: 0.4–1.51) | Placeholder | `config/coldsweat/main.toml` | Keeps the lowlands' nights livable without gear |
|
||||
| Windswept hills temperature | 45–72 °F (Cold Sweat: 24–58 °F) | Placeholder | `config/coldsweat/world.toml` | They lie in the starter lowlands too |
|
||||
| Insulating armour | fur set (cold 10/14/12/10), hide set (heat 10/14/12/10), as Cold Sweat; leather armour none (Cold Sweat: 5/7/6/5 both) | Placeholder | `config/coldsweat/item.toml` | Frostpeak at noon: about 1 min bare, 14 min in fur; Sunscorch at noon: about 2 min bare, 25 min in hide |
|
||||
| Sewn-in insulation | goat fur 2 cold, hoglin hide 2 heat, wool 0.5 cold, leather 0.5/0.5 (Cold Sweat: wool 1.5, leather 1/1, rabbit hide 1.5 heat) | Placeholder | `config/coldsweat/item.toml` | |
|
||||
| Goat Fur / Hoglin Hide recipes | 8 wool + 1 Heat Rock → 4 Goat Fur; 8 leather + 1 Icy Rock → 4 Hoglin Hide | Placeholder | `kubejs/server_scripts/insulation.js` | Heat and Icy Rocks come from the guardians before Frostpeak and Sunscorch (archaeology finds too) |
|
||||
| Healing while sleeping | off (`healPercent` 0) | Decided (roadmap) | `config/cobblemon/main.json` | |
|
||||
| Loot container refresh | 1 hour (72,000 ticks of game time) after first opened, all containers | Decided (Adrian, 2026-10-29) | `config/lootr-common.toml` | Tiering by structure/biome later |
|
||||
| Gamerules in the template | `doMobSpawning false` | Decided (Adrian, 2026-10-28; may be reverted later) | `world/world.json` → `gamerules` | Pokémon spawning is Cobblemon's own `doPokemonSpawning` |
|
||||
| Border margin | 96 blocks of sea past the outermost coast | Placeholder | `world/world.json` | |
|
||||
| Pregeneration circle | radius 1,700 around 0,0 | Tooling | `world/world.json` | Must cover the land plus `border_margin`; `make_world.py` stops if it doesn't |
|
||||
| Server heap for smoke test | 4 GB | Tooling | `tools/smoke_test.py` | Not a gameplay value |
|
||||
| Dev client heap (Prism) | 6 GB | Tooling | `tools/prism_instance.py --memory` | Not a gameplay value |
|
||||
|
||||
Sections to fill as phases land: zone level bands (Phase 3), drop rates and drop → consumer list (Phase 4), vein regeneration timers (Phase 4), pasture job cooldowns (Phase 4), hazard damage (Phase 3), field-move cooldowns and caps (Phase 5), machine output (Phase 6), boss attack damage and telegraph times (Phase 7).
|
||||
@@ -0,0 +1,29 @@
|
||||
# Phase 0 – checks for Adrian
|
||||
|
||||
The agent could not run these: they need the game client, or accepting the Minecraft EULA.
|
||||
|
||||
## Server (closes the "CI boots the server cleanly" check)
|
||||
|
||||
- [x] `python3 tools/smoke_test.py --accept-eula` passed on 2026-10-28 (EULA accepted by Adrian). Server started in 20 s, all 6 RCON checks passed (companion live, 1,025 species, core data pack enabled), no ERROR lines in the log. The 9 WARN lines are expected: offline mode set by the test, Cobblemon's optional Adorn mixin, and a KubeJS client-only plugin.
|
||||
- [ ] If the repo goes to GitHub and you accept the EULA for CI too, set the repository variable `MINECRAFT_EULA_ACCEPTED=true`.
|
||||
|
||||
## Prism instance "Cobblemon Survival Pack (dev)"
|
||||
|
||||
- [ ] The instance shows up in Prism (restart Prism if it was open while the instance was created).
|
||||
- [ ] It launches to the title screen without a mod-loading error screen.
|
||||
- [ ] The Mods list contains Cobblemon 1.8.4, Cobblemon Survival Pack Companion 0.0.1, KubeJS, FTB Quests, FTB Library, FTB Teams, Architectury, Kotlin for Forge, Rhino.
|
||||
- [ ] `logs/latest.log` in the instance contains `Cobblemon Survival companion 0.0.1 loaded (Cobblemon 1.8.4…)`.
|
||||
- [ ] In a new creative test world: `/cobblesurvival status` prints `cobblesurvival 0.0.1 ok; cobblemon 1.8.4…; species …`.
|
||||
- [ ] `/datapack list enabled` lists the Cobblemon Survival core data pack.
|
||||
- [ ] A Pokémon spawns from `/spawnpokemon pikachu`, and the FTB Quests book opens from its button in the inventory screen (it's empty for now).
|
||||
|
||||
## Exports (closes the "both exports install in a launcher" check)
|
||||
|
||||
- [ ] Import `build/cobblemon-survival-pack-0.0.1.mrpack` into Prism (Add Instance → Import). It installs, but **without the FTB mods**, by design (they're CurseForge-only).
|
||||
- [ ] Import `build/cobblemon-survival-pack-0.0.1-curseforge.zip` the same way. It installs every mod.
|
||||
|
||||
## Decisions (see `docs/design.md`, open decisions)
|
||||
|
||||
- [x] Platform split: not publishing for now (decided 2026-10-28); revisit before a public release.
|
||||
- [ ] Confirm NeoForge 1.21.1 as the loader.
|
||||
- [ ] License for the companion mod and pack content; pack name and mod id.
|
||||
@@ -0,0 +1,35 @@
|
||||
# Phase 1 – checks for Adrian
|
||||
|
||||
## Ask Adrian: approve the island before Phase 3
|
||||
|
||||
**Approved 2026-10-28.** Structures stay with only their ore and vanilla mobs removed; End portals stay openable (the dragon becomes a Pokémon boss later); the minimap stays.
|
||||
|
||||
Look at `build/island-map.png` (the generated island) and `build/seed-search/candidates-pokeball.png` (the 8 best of 151 seeds for the Poké Ball shape).
|
||||
|
||||
- [x] **Shape and size.** Poké Ball, radius 1,500 blocks: a 160-block channel across the middle, a 120-block ring channel around a centre island of radius 280 (where you spawn). All placeholders, change them with `tools/pokeball_preset.py`. Bigger, smaller, wider channels?
|
||||
- [x] **Seed / layout.** `isle-26` approved (2026-10-28).
|
||||
- [x] **Biome list.** "Mountain edge" was mapped to windswept hills (it was removed from the game in 1.18). Ocean, deep ocean, lukewarm/warm ocean, river and beach were kept for the sea and coast. OK?
|
||||
- [x] **Biome mapping.** Forest also covers taiga, dark/birch forest and groves, so it takes about 40% of the land. Plains also covers sunflower plains, snowy plains, ice spikes and mushroom fields. Savanna became desert, savanna plateaus became badlands, meadow became cherry grove, swamp became mangrove swamp. Change anything in `world/biomes.json`?
|
||||
- [x] **Border.** Square vanilla border 96 blocks past the outermost coast.
|
||||
- [x] **Ore in structures.** Cobblemon habitats/ruins and fossils keep their shape, but their ore becomes stone and their raw ore blocks become tuff/terracotta/yellow terracotta. OK, or should such structures be removed instead?
|
||||
|
||||
## In-game (Prism save "Cobblemon Survival Island")
|
||||
|
||||
- [ ] The save loads; you spawn on the centre island in plains or forest.
|
||||
- [ ] From the air (creative flight, or Xaero's World Map) the island reads as a Poké Ball; the coast and channels look natural, and the world border sits out at sea all around.
|
||||
- [ ] Biomes match the map (F3 shows the biome). No snowy plains, taiga, savanna, meadow, swamp or other unlisted biome anywhere.
|
||||
- [ ] Caves: you can find lush caves, dripstone caves, deep dark and basalt deltas underground. **Basalt deltas look right in the overworld** (basalt columns, magma and lava deltas, ash particles; no broken terrain or missing textures).
|
||||
- [ ] No natural ore anywhere, including Cobblemon's evolution-stone ores and ore inside structures (mine around a bit, or use a spectator x-ray resource pack).
|
||||
- [ ] No Nether: lighting an obsidian frame does nothing (no portal forms); no ruined portals anywhere.
|
||||
- [ ] No vanilla mobs: no animals, monsters, fish, squid or bats appear, only Pokémon. Structures generate (villages, ruins, monuments, strongholds, mineshafts, trial chambers, ancient cities) but without vanilla mobs or spawners; shriekers in the Deep Dark don't summon the Warden; mining stone or stone bricks never releases silverfish.
|
||||
- [ ] The world type "Cobblemon Survival Island" appears under World Type when creating a new world.
|
||||
|
||||
## QOL mods (in-game)
|
||||
|
||||
- [ ] Keybinds: in your existing instance, press **Controls → Key Binds → Reset Keys** once (keys already saved in `options.txt` keep their old value; fresh installs get the new defaults). Afterwards nothing in the list is red except JEI's mouse-click actions.
|
||||
- [ ] JEI: the item list shows on the right of the inventory; **G**/U show recipes and uses (R is Cobblemon's send-out key), including Cobblemon items.
|
||||
- [ ] Jade: looking at a block or a Pokémon shows its name and mod; hold **V** for details.
|
||||
- [ ] Inventory Profiles Next: sorting buttons on chests and the inventory; tools refill from the inventory.
|
||||
- [ ] Mouse Tweaks, AppleSkin, Controlling (search box in Controls), Xaero's Minimap and World Map all work.
|
||||
- [ ] Performance feels fine with Sodium, FerriteCore, ModernFix, ImmediatelyFast and Entity Culling; Cobblemon models render correctly with Sodium.
|
||||
- [x] Keep the minimap and world map (decided 2026-10-28).
|
||||
@@ -0,0 +1,25 @@
|
||||
# Phase 2 – checks for Adrian
|
||||
|
||||
## Ask Adrian: approve Phase 2 before Phase 3
|
||||
|
||||
**Approved 2026-10-29**, placeholders as listed below.
|
||||
|
||||
Every roadmap item of Phase 2 is in and the roadmap's "done when" holds in the tests: the permadeath matrix passes, sleeping doesn't heal, and there is no remote PC access. Placeholders that were up for approval (`docs/balance.md`):
|
||||
|
||||
- **Revival Charm recipe:** 2 gold ingots, 2 Revives, 1 Max Revive.
|
||||
- **Healing Machine recipe:** 3 gold ingots, 4 iron ingots, 1 Max Revive, 1 diamond (Cobblemon: copper, iron, Max Revive, redstone).
|
||||
- **Healing Machine recharge:** a full party heal about once an hour (Cobblemon: every 15 minutes).
|
||||
|
||||
Automated (`tools/quick_check.py`): the mods load, vanilla mobs can't join, Lootr converts the loot chests of a sampled village, and the permadeath matrix runs as in-game tests (`tools/selftest.py`): a Pokémon faints outside a battle, from a fall, in lava, from poison, in a wild battle with and without a Revival Charm, in a trainer battle, after being revived during a battle, and in the PC; the party doesn't heal or revive by itself. Also tested: the Healing Machine uses the pack's recipe and recharges slower, `/pc` needs cheats and a PC stops working once you walk away from it, and breaking, placing or walking during a battle doesn't end it. The checks below are what a test can't judge: how it looks and feels.
|
||||
|
||||
## In-game
|
||||
|
||||
- [ ] **Permadeath:** a Pokémon that faints is gone with a red chat message: right away outside a battle (fall, fire/lava, poison), or when the battle ends (wild or trainer). A Revive used during the battle doesn't save it.
|
||||
- [ ] **Revival Charm:** craft one (gold ingot top and bottom, Revive left and right, Max Revive in the middle), give it to a Pokémon to hold; when it faints it stays, and the charm is used up.
|
||||
- [ ] **No auto-revive:** a fainted Pokémon doesn't wake up on its own, even after a long battle.
|
||||
- [ ] **No sleep healing:** sleeping through the night doesn't heal the party.
|
||||
- [ ] **Healing Machine:** JEI shows the pack's recipe (gold ingots on top, iron, Max Revive, diamond); after healing a full party, the machine takes about an hour to fill up again.
|
||||
- [ ] **PC:** the PC only opens at a placed PC block.
|
||||
- [ ] **Wild Pokémon** sometimes flee or fight back (Fight or Flight Reborn); pastured Pokémon get teleported back instead of recalled (TP-Pastures).
|
||||
- [ ] **Loot chests:** a chest in a village/ruin shows Lootr's look; after looting it, it refills about an hour of play later with different items. Each player sees their own loot.
|
||||
- [ ] **Free movement in battle:** during a battle you can leave the battle screen, walk around and build (needed for the Phase 7 boss fights).
|
||||
@@ -0,0 +1,29 @@
|
||||
# Phase 3 – checks for Adrian
|
||||
|
||||
## Ask Adrian: approve the zone table before building zones
|
||||
|
||||
**Approved 2026-10-29** with one change: items that help with a zone drop from the boss fight of the zone before it. Zones decide both the species and the levels that spawn.
|
||||
|
||||
Open `build/zone-map.png` (the island coloured by zone) and read the draft in `docs/design.md` → "Phase 3 zone plan". Every value is a placeholder; change anything.
|
||||
|
||||
1. **Zone model:** zones follow the island's biome clusters (hazard biomes are their own zones wherever they lie; forest and plains are split into regions by position; caves by cave biome under the whole island). Or plain sectors/rings that ignore biomes?
|
||||
2. **Sunscorch next to the start:** its biggest pocket is just across the ring channel north of spawn, and the desert specks on Button Isle are hot too. Keep as an early taste of heat, or reshape?
|
||||
3. **Deep Dark everywhere:** caves under the start island are as dangerous as anywhere (Lv 45–60). OK?
|
||||
4. **Level bands, hazards, signature drops, Alpha guardians** in the table.
|
||||
|
||||
## Built so far
|
||||
|
||||
- **Zones and their spawns** (step 2). Cobblemon's own spawn lists are off; each zone spawns its own evolution lines (`docs/zone-species.md`) at its levels. Automated: `spawn_pools_are_zoned` and the `spawn_survey` across all 14 zones in `tools/quick_check.py`.
|
||||
|
||||
- **Heat and cold** (step 5, Cold Sweat). Automated: `cold_needs_fur`, `heat_needs_hide` and `lowlands_are_mild` on the island in `tools/quick_check.py`.
|
||||
|
||||
Still to come: Alpha guardians with the boss drops that help the next zone (including the Heat and Icy Rocks), the Mire's poison, soft level pressure, flyers.
|
||||
|
||||
## In-game
|
||||
|
||||
- [ ] **Where am I:** `/cobblesurvival zone` (needs operator) names the zone and its levels; walk from Button Isle into Southwold and the Jungle.
|
||||
- [ ] **Who lives here:** the Pokémon you meet in a zone are the ones listed for it in `docs/zone-species.md`, at its levels. Any line in the wrong zone can be pinned elsewhere in `world/zones.json` → `species`.
|
||||
- [ ] **Caves:** Lush Caves, Dripstone, Deep Dark and Basalt Furnace each have their own Pokémon, whatever surface zone is above them.
|
||||
- [ ] **Frostpeak cold:** walk onto the jagged peaks without gear: Cold Sweat's thermometer drops and after a minute or so you take damage (not during the first 5 minutes of a new world: grace period). In the fur set (Goat Fur from 8 wool + 1 Heat Rock) you last many minutes.
|
||||
- [ ] **Sunscorch heat:** the desert at noon overheats you in a couple of minutes; at night it's fine. The hide set (Hoglin Hide from 8 leather + 1 Icy Rock) or a Fire Resistance potion keeps you going.
|
||||
- [ ] **Lowlands:** a night in Southwold or on Button Isle without gear never gets dangerous.
|
||||
+131
@@ -0,0 +1,131 @@
|
||||
# Design notes
|
||||
|
||||
The roadmap (design pillars, phases, open decisions) is the source of truth for *what* to build. This file records *how* it was built and every decision taken on the way.
|
||||
|
||||
## Decisions taken in Phase 0
|
||||
|
||||
| Decision | Why |
|
||||
| --- | --- |
|
||||
| Loader NeoForge 21.1.265 (latest 21.1 build on 2026-10-28) | The roadmap's default. Not yet confirmed by Adrian |
|
||||
| Cobblemon 1.8.4 instead of 1.8.3 | 1.8.4 came out 2026-10-27 (bug-fix release); every 1.8-aware addon accepts it |
|
||||
| Companion mod builds with Cobblemon's official MDK (Architectury Loom), not the plain NeoForge MDK | The roadmap says to take Cobblemon's coordinates from its official docs or addon template. That template is Loom-based and the coordinates (`com.cobblemon:neoforge` on `artefacts.cobblemon.com`) come from it |
|
||||
| Kotlin 2.4.0 instead of the MDK's 2.2.20 | Kotlin for Forge 5.12.0 ships stdlib 2.4.0, which the older compiler can't read |
|
||||
| `datapacks/core` ships *inside* the companion mod as an always-on built-in data pack (top priority) | Works in every world and on every server without copying files around. Its `pack.mcmeta` filter can later blank Cobblemon's base spawns (Phase 3). The data stays plain JSON in `datapacks/core` |
|
||||
| Every mod `.pw.toml` carries both a Modrinth URL and CurseForge IDs where both exist (`tools/crosslink.py`) | packwiz only records one source. Without the second one, an export to the other platform copies the jar into `overrides/`, which bundles a third-party jar |
|
||||
| Mods hosted on one platform only are left out of the other platform's export | Same rule: no bundling. See the platform split in `docs/addon-status.md` |
|
||||
| Dev instance in Prism is synced with packwiz-installer from `build/stage/full` | Gets every mod from both platforms, and re-syncing removes mods that left the pack. Prism is a Flatpak that can't read the repo folder, so the sync runs on the host |
|
||||
| Companion mod id `cobblesurvival`, package `dev.cobblesurvival` | Placeholder names, easy to rename while the mod is empty |
|
||||
| No publishing for now (Adrian, 2026-10-28) | The target is the Prism instance and a private server, which both get every mod. The platform split below only matters again for a public release (Phase 9). Mods may be chosen regardless of which platform hosts them |
|
||||
|
||||
## Decisions taken in Phase 1
|
||||
|
||||
| Decision | Why |
|
||||
| --- | --- |
|
||||
| World type `cobblesurvival:island` (our data pack) points WorldGen Editor at our own preset `cobblesurvival_island` | Our preset is never confused with WorldGen Editor's bundled examples. Servers set `level-type=cobblesurvival:island`; the type is also listed in the singleplayer world-type button |
|
||||
| Biome set = Adrian's list (2026-10-28): plains, forest, cherry grove, mangrove swamp, jungle, desert, badlands, "mountain edge", jagged peaks; caves: lush caves, dripstone caves, deep dark, basalt deltas | Set in `world/biomes.json`. Ocean, deep ocean, lukewarm/warm ocean, river and beach stay, because an island needs a sea and a coast |
|
||||
| The biome list is enforced by remapping vanilla's overworld biome table (from Minecraft's data generator) onto the list, written into the world type by `tools/biome_layout.py` | Keeps vanilla's terrain–biome fit (peaks on peaks, swamps in lowlands) while only listed biomes can appear. Pure data. WorldGen Editor's own climate/exclusion options were rejected: they replace cave biomes with surface fallbacks such as snowy plains, and leak unlisted biomes |
|
||||
| "Mountain edge" → `windswept_hills` (with snowy slopes and stony shore folded in) | Mountain Edge was removed in 1.18; windswept hills is its successor. **Flagged** in case another biome was meant |
|
||||
| Basalt deltas is an overworld cave biome under the hottest, driest land (where desert and badlands are), at cave depth like lush and dripstone caves | Adrian's request. It keeps its own features (basalt columns, magma, lava deltas) and particles; its nether ores are removed with the rest |
|
||||
| No Nether: the world type `cobblesurvival:island` defines only the overworld and the End | Adrian's request. Portals can still be lit but lead nowhere. The smoke test checks that `minecraft:the_nether` is an unknown dimension |
|
||||
| Island shaped like a Poké Ball (Adrian, 2026-10-28): a round island cut into top and bottom halves by a channel across the middle, with a ring channel around a round centre island where the spawn is. Written by `tools/pokeball_preset.py` (ball r 1,500, band 160, button r 280, ring 120 — placeholders) | WorldGen Editor makes the round island; two flat-ended ocean entries cut the band and 36 overlapping ocean circles cut the ring. Entries have no climate or exclusions; biomes come from the remapped table |
|
||||
| The seed is chosen by `tools/seed_search.py`, which scores many seeds with the op-only dev command `/cobblesurvival biomepreview` (samples the generator without generating chunks) | With vanilla climate noise, which biomes land on a 1,500-block island depends on the seed. The search wants every listed biome at a useful share, few large patches, a gentle start area and all four cave biomes |
|
||||
| Natural ore removed with data only, no extra mod: a NeoForge `remove_features` biome modifier for vanilla ores, zero-placement overrides for Cobblemon's evolution-stone ores, `ore_veins_enabled: false` in WorldGen Editor's noise settings | Pillar 7 (data before code). Ore Generation Configuration was not needed. Cobblemon adds its ores from code as direct holders, which the biome modifier can't match, hence the overrides (found by the ore scan) |
|
||||
| Structures and fossils place no ore either: `tools/clean_structures.py` appends a rule processor that turns ore into stone (raw ore blocks into tuff/terracotta, placeholders) to every processor list that places an ore-containing template or outputs ore | Found by the ore scan of the first template: Cobblemon habitats/ruins have ore and raw ore blocks built into their templates, vanilla fossils have coal/diamond ore. Overriding the processor lists keeps the structures and only swaps those blocks |
|
||||
| Nether fortresses and Nether ruined portals are kept out of the overworld: their biome tags list the Nether biomes except basalt deltas | Basalt deltas is now an overworld cave biome, and these structures go wherever a Nether biome is. The first template had fortress pieces underground |
|
||||
| Standard QOL mods (Adrian, 2026-10-28): JEI, Jade, Inventory Profiles Next, Mouse Tweaks, AppleSkin, Controlling, Xaero's Minimap + World Map; performance: Sodium, FerriteCore, ModernFix, ImmediatelyFast, Entity Culling | JEI as the NEI successor, Jade as the block/mod probe, Inventory Profiles Next as the Inventory Tweaks successor. **Flagged:** a minimap and world map make exploring the island easier; drop them if exploration should stay harder. Xaero's radar can show mobs; restrict it in its config if that feels like cheating |
|
||||
| The world template is generated by `tools/make_world.py` from `world/world.json` and kept out of git | The world is several hundred MB. Seed + preset + mod versions reproduce it. Prism and the test server get it from `build/world-template` |
|
||||
| Two test speeds (Adrian, 2026-10-28: 10 minutes was too long): `tools/quick_check.py` (one boot, smoke checks, `/locate` for removed structures, a sampled world around spawn and sample structures; about 75 s) for everyday changes, and `tools/make_world.py` (whole island, about 6 min) only when the island changes | The template build pregenerates a circle that just covers the island instead of the whole square, and sets the border in the same server session |
|
||||
| Chunky is used only while building the template; it is not in the pack | It is a build tool. Pinned by URL and SHA-1 in `world/world.json` |
|
||||
| **Seed `isle-26` approved** (Adrian, 2026-10-28) | Poké Ball, radius 1,500 |
|
||||
| No vanilla mobs, only Pokémon (Adrian, 2026-10-28): the companion mod (`world/OnlyPokemon.kt`) never lets a vanilla mob join a world unless it is loaded from a save (since Phase 3 any mob that isn't Cobblemon's, e.g. Cold Sweat's chameleons); exceptions go in the entity type tag `cobblesurvival:allowed_vanilla_mobs` (only the Ender Dragon for now). On top, every biome's vanilla spawn list is emptied (`no_vanilla_spawns.json`), infested stone doesn't generate (`no_infested_stone.json`) and the template has `doMobSpawning false` | One rule covers mobs placed by structures during world generation (villagers, guardians, drowned, shulkers, ...), natural spawns, spawners and commands. Cobblemon spawns through its own spawner and isn't a vanilla mob, so Pokémon are unaffected. The data-pack and gamerule layers save the work of creating mobs only to block them. **To undo:** remove the listener, the two modifier files and the gamerule entry. A side effect: player-built golems and the Wither can't be summoned either |
|
||||
| All structures stay, only their ore and vanilla mobs go (Adrian, 2026-10-28) | Villages, ocean ruins, monuments, mineshafts, strongholds, trial chambers, ancient cities, Gimmighoul towers etc. generate as designed (igloos, witch huts and mansions can't, because their biomes are remapped away). Exception: ruined portals stay off, because Nether portals shouldn't generate at all |
|
||||
| Mob sources in structures go when a chunk has just been generated (`world/OnlyPokemon.kt`): blocks in the tag `cobblesurvival:removed_on_generation` (spawner, trial spawner) become air, sculk shriekers can't summon the Warden, infested blocks become normal stone/bricks | Stronghold, mineshaft and dungeon spawners and stronghold infested bricks are placed by game code, so data can't reach them. Chunks loaded from disk are never touched. The Deep Dark's own sculk patches can summon the Warden too, not only ancient cities. Trial chamber vaults stay but can't be opened, since trial keys come from trial spawners. `tools/world_report.py` fails a world that still has a spawner, trial spawner, infested block, summoning shrieker or vanilla mob |
|
||||
| Nether portals don't form: the companion mod cancels portal creation while the server has no Nether dimension; ruined portals don't generate (their biome tags are empty) | Adrian: portals formed but led nowhere. The check is on the dimension, so if the Nether ever comes back, portals work again. The smoke test lights an obsidian frame and expects no portal |
|
||||
| Default keybinds without conflicts, shipped with Default Options (`pack/config/defaultoptions/keybindings.txt`) | NeoForge's Controls screen flags any two keybinds on the same key, even a GUI-only one next to an in-game one. Changes: Cobblemon summary M→N and hide party O→Y; Xaero waypoints U→J, minimap settings unbound; Jade details Shift→V; JEI recipe R→G, bookmark A→K, search Ctrl+F→Ctrl+H, pause cycling Shift→Right Ctrl, search history unbound; KubeJS Kubedex unbound; FTB Quests: recenter Home, chapters `.`/`,`, search Ctrl+I, panning up/down and player prefs unbound, **all quest-editor shortcuts unbound** (pack authors rebind them in Controls → FTB Quests). JEI's mouse-click actions still share mouse buttons with attack/use by design. Check with `tools/check_keybinds.py` after adding a mod |
|
||||
| Square vanilla world border around the land's bounding box, 96 blocks of sea margin (placeholder) | The vanilla border can only be a square. On the island's shorter axis the gap to the coast is larger than 96 blocks. The border is measured from the large land masses only; icebergs, sea stacks and wrecks out at sea don't count |
|
||||
|
||||
## Decisions taken in Phase 2
|
||||
|
||||
| Decision | Why |
|
||||
| --- | --- |
|
||||
| Permadeath: CobbleHardcoreMon removes Pokémon that fainted in a battle when the battle ends; holding a Revival Charm (`cobblesurvival:revival_charm`, a KubeJS item) saves it once instead | Roadmap pillar 2. The charm replaces the Totem of Undying (`defaultconfigs/cobblehardcoremon/server.toml`). Health Link off; Soul Link is opt-in per player and not used |
|
||||
| The companion mod closes CobbleHardcoreMon's gaps (`permadeath/Permadeath.kt`): a Pokémon that faints outside a battle is settled at the end of the same tick; one that fainted in a battle and was revived before it ended is fainted again just before CobbleHardcoreMon looks; every second each online player's party and PC are swept for fainted Pokémon. A charm is any item in `#cobblesurvival:revival_charms` | Found while writing the permadeath tests: CobbleHardcoreMon only looks once a second outside battles (time to heal a Pokémon or put it in the PC), waits 60 s for a Pokémon whose charm already saved it once, never looks at the PC, and skips a Pokémon that isn't fainted when the battle ends. With the companion mod's part switched off, `charm_saves_once`, `fainted_in_pc` and `revived_during_battle` fail (2026-10-29). Out-of-battle poison can knock a Pokémon out too (5 % HP now and then, no floor). Both mods use the same chat messages |
|
||||
| A Revive used during a battle doesn't save a Pokémon that fainted in it (Adrian, 2026-10-29): it is gone when the battle ends | Roadmap: a fainted Pokémon is deleted. Revives, Max Revives and Revival Blessing only help within that battle; Revives are mainly Revival Charm material. Adrian may later disable revive items in battles completely |
|
||||
| No remote PC access: Cobblemon's `/pc` needs cheats (operator level 2) and is left as an admin tool; a PC opened at a block closes once the player is more than 10 blocks from it. No remote-PC mod is installed | Roadmap Phase 2. Checked by the self-test `no_remote_pc`. Players on a server never have level 2; single-player worlds only with cheats on |
|
||||
| Free movement in battle stays: nothing in the pack stops breaking, placing or walking during a battle | Phase 7 boss fights need it. The self-test `free_movement_in_battle` checks the server side; Cobblemon's own key for leaving the battle screen is a manual check. A wild battle still ends if the player gets too far from the wild Pokémon (Cobblemon's flee distance) |
|
||||
| In-game self-tests (`/cobblesurvival selftest`, `tools/selftest.py`, also run by `tools/quick_check.py`) on Minecraft's GameTest framework | NeoForge only runs GameTests in a development environment, so the companion mod starts and ticks them itself on the real pack server. Fake players get a connection that accepts every mod channel. The command only exists with `-Dcobblesurvival.selftest=true`. Tests run in barrier-walled boxes 15×12×15 on a platform at y 200 above spawn; a wild Pokémon must have ticked once before a battle with it starts, or its side never picks a move |
|
||||
| Cobblemon's faint timer is effectively infinite (`defaultFaintTimer` 1,000,000,000 s) | Otherwise a fainted Pokémon wakes up on its own after 5 minutes, and staying in a battle that long would let it escape permadeath |
|
||||
| No healing while sleeping: Cobblemon `healPercent` 0 | Cobblemon only uses `healPercent`/`healTimer` while the player sleeps |
|
||||
| Healing Machines are expensive (roadmap): a dearer recipe (gold, iron, a Max Revive and a diamond) and a four times slower recharge; values in `docs/balance.md` | With loot chests handing out ingots (Adrian, 2026-10-29), Cobblemon's copper-and-iron recipe would be cheap early on. The recipe is replaced by KubeJS under the id `cobblesurvival:healing_machine` |
|
||||
| Fight or Flight Reborn and TP-Pastures installed with default settings | Tuning comes with the zones (Phase 3) and pastures (Phase 4) |
|
||||
| Chest loot keeps its ore and ingots; every loot container refills with a new roll 1 hour after it was first opened (Adrian, 2026-10-29). Tiering loot by structure/biome comes later (lower priority) | Done with Lootr (`config/lootr-common.toml`: `refresh_all`, `refresh_value` 72,000 ticks of game time). Lootr also makes loot per player. This changes the roadmap's Phase 2 item "remove loot tables that hand out ore or ingots": chests are a second, renewable ore source next to the veins (pillar 3) |
|
||||
| Lootr converts a vanilla loot chest once the 5×5 chunks around it are loaded, i.e. when a player is near, not during pregeneration | So the template keeps vanilla loot chests until then. `tools/quick_check.py` force-loads the area around a sampled village and checks that its chests became Lootr chests |
|
||||
| Matthiesen Core's usage statistics are off by default | A pack shouldn't send data for its players without asking; players can switch it on in `config/matthiesen_core/metrics.properties` |
|
||||
|
||||
## Phase 3 zone plan (approved by Adrian, 2026-10-29)
|
||||
|
||||
Source of truth: `world/zones.json`; `tools/zone_layout.py` lays it onto the island and draws `build/zone-map.png`. The model is decided; levels, drops and guardians below are still placeholders (`docs/balance.md`).
|
||||
|
||||
A zone decides **which Pokémon spawn** and **at what levels**: Cobblemon's own spawn lists are switched off and each zone gets its own list, drawn from Cobblemon's spawn data for the zone's biomes.
|
||||
|
||||
**Model.** Zones are regions that follow the island's biome clusters. A biome with a hazard (jagged peaks, desert/badlands, mangrove swamp) or its own character (jungle) is its own zone wherever it lies, with small specks dropped. The forest and plains that fill the rest (65 % of the land) are split into regions by position. Rivers belong to the zone they run through; only the coast and the open sea are sea zones. Caves are zones by cave biome, everywhere under the island. Cold Sweat's heat and cold follow the biome anyway, so hazards and zones line up. Cobblemon spawn files can't express these shapes, so the companion mod will add a spawn condition `"zone": "<id>"` (Cobblemon's appendage API) that looks up a grid generated from this plan.
|
||||
|
||||
| Zone | Where | Biomes | Levels | Hazard (gate) | Signature drops (examples) | Alpha guardian (example) |
|
||||
| --- | --- | --- | --- | --- | --- | --- |
|
||||
| Button Isle | the start island inside the ring channel (3.6 % of land) | forest, plains, a little cherry grove and desert | 2–10 | none | feathers, berries (Pidgey, Sentret, Bidoof) | Pidgeotto, Lv 14 |
|
||||
| Southwold | south half, west of the jungle and swamp (30 %) | forest, plains, windswept hills | 8–18 | none | **wool** (Wooloo, Mareep) for cold insulation later; bones, honey | Dubwool, Lv 22 |
|
||||
| Westmarch | north-west (18 %) | forest, windswept hills | 15–25 | none | raw copper (Cufant), charcoal (Vulpix) | Ursaring, Lv 30 |
|
||||
| Verdant Jungle | east, both sides of the band (9 %) | jungle | 18–30 | none (warm and humid, below Cold Sweat's damage) | vines, Big Root (Tangela), food (Tropius) | Tangrowth, Lv 34 |
|
||||
| Mangrove Mire | south-east (10 %) | mangrove swamp | 25–38 | **poison** while in the swamp (companion mod area effect); Pecha berries, milk and potions help | Black Sludge (Croagunk, Grimer), Pecha berries | Toxicroak, Lv 42 |
|
||||
| Highland Meadows | north-east around the peaks (20 %) | plains, forest, cherry grove | 25–35 | none | leather (Ponyta) for heat insulation, Hard Stone (Larvitar) | Rapidash, Lv 40 |
|
||||
| Sunscorch | the desert and badlands pockets: north of the ring channel, the north-east and north-west coasts (3.4 %) | desert, badlands | 30–45 | **heat** (Cold Sweat): heat insulation, Fire Resistance potions | armadillo scutes (Sandshrew), Soft Sand, magma cream (Numel) | Hippowdon, Lv 50 |
|
||||
| Frostpeak Range | the jagged peaks plus the windswept hills and cherry groves right next to them (6 %) | jagged peaks | 40–55 | **cold** (Cold Sweat): wool insulation; warming food and potions | Never-Melt Ice (Snover), Razor Claw (Sneasel) | Abomasnow, Lv 60 |
|
||||
| Shallows | coast and beaches | ocean, lukewarm and warm ocean, beach | 5–20 | none | fish, kelp | none |
|
||||
| Deep Sea | ring and band channels, outer sea | deep ocean | 30–50 | none | Heart Scale-type rarities | Lapras or Wailord, Lv 55 |
|
||||
| Lush Caves | under the whole island | lush caves | 12–28 | none | glow berries, mushrooms (Paras) | none |
|
||||
| Dripstone Depths | under the whole island | dripstone caves | 22–38 | none | Dragon Fang (Bagon, Gible) | none |
|
||||
| Deep Dark | under the whole island | deep dark | 45–60 | darkness (vanilla sculk; no Warden) | | Sableye or Spiritomb, Lv 62 |
|
||||
| Basalt Furnace | under the whole island | basalt deltas | 55–70 | heat (Cold Sweat) | **raw iron** (Durant), coal (Torkoal), blaze powder (Heatmor) | Heatran-like boss later (Phase 7) |
|
||||
|
||||
Order of play the bands suggest: Button Isle → Southwold → Westmarch or Jungle → Mire or Highlands → Sunscorch (heat) → Frostpeak (cold) → the deep caves.
|
||||
|
||||
**What helps with a zone drops from the boss fight of the zone before it** (Adrian, 2026-10-29). Wild Pokémon keep their normal drops (the "signature drops" column); the items a zone's hazard asks for come from the previous zone's Alpha guardian, so beating it is the way forward. Never a hard unlock: potions and golden apples still get a player through. Placeholder chain:
|
||||
|
||||
| Boss of | Helps with | Drops (placeholder) |
|
||||
| --- | --- | --- |
|
||||
| Button Isle | Southwold | Poké Balls, Potions |
|
||||
| Southwold | Westmarch, Verdant Jungle | Great Balls, Exp. Candy |
|
||||
| Westmarch, Verdant Jungle | Mangrove Mire (poison) | the material for wading gear that keeps the swamp's poison off, Pecha berries |
|
||||
| Mangrove Mire, Highland Meadows | Sunscorch (heat) | Cold Sweat heat-insulation material |
|
||||
| Sunscorch | Frostpeak Range (cold) | Cold Sweat cold-insulation material (the recipe also takes wool) |
|
||||
| Frostpeak Range | Deep Dark, Basalt Furnace | Night Vision potions, more heat insulation |
|
||||
|
||||
**Decided with the plan** (Adrian, 2026-10-29): the Sunscorch pocket just north of the start and the hot desert spots on Button Isle stay as an early taste of the heat; caves follow the cave biome everywhere, so the Deep Dark under the start island is Lv 45–60 too; the straight Westmarch/Highland Meadows border (x = −250) stays.
|
||||
|
||||
**How zones are built** (Phase 3, step 2):
|
||||
- `tools/zone_layout.py` writes the zone grid to `datapacks/core/data/cobblesurvival/zones/island.json` (24-block cells; caves by cave biome). The companion mod loads it (`zone/Zones.kt`) and adds the spawn-condition field `"zone"`/`"zones"` to every Cobblemon spawn condition. `/cobblesurvival zone` (operators) names the zone you stand in.
|
||||
- Cobblemon's own spawn files are switched off by a filter in `datapacks/core/pack.mcmeta`. `tools/zone_spawns.py` writes one spawn pool per zone (`datapacks/core/data/cobblesurvival/spawn_pool_world/<zone>.json`) from Cobblemon's spawn data: every evolution line that can spawn on the island gets one home zone (none is lost; legendaries, mythicals, Ultra Beasts and Paradox Pokémon stay out), and its levels are clamped into the zone's band, which picks the evolution stages. Placement weighs how much of the zone is the line's habitat, how much of the line's range the zone covers, and the line's strength (base-stat total of its strongest form) against the zone's band. Lines that Cobblemon lets spawn nearly everywhere are shared out over the land zones by strength. The result per zone is in `docs/zone-species.md`; `world/zones.json` → `species` pins a line by hand.
|
||||
- Cave zones: sky-light minimums, "can see sky" and the "natural" ground preset are dropped from their entries; otherwise the Deep Dark (fed by Cobblemon's surface "spooky" spawns) could never spawn anything, and lush caves' moss floors would barely count.
|
||||
- Basalt Furnace got Durant, Torkoal and Heatmor pinned to it: its own lines were all big (Charizard, Turtonator, Centiskorch, …) and Cobblemon only spawns a Pokémon where its body fits, so cramped basalt caves stayed empty.
|
||||
- Tested: `spawn_pools_are_zoned` (no Cobblemon default spawn is left; every entry has a zone and spawns within its band) and `spawn_survey` (a player at a point deep inside each zone is offered only that zone's spawns, and at least one), both in `tools/quick_check.py`.
|
||||
|
||||
**Hazards** (Phase 3, step 5), with Cold Sweat 2.4.4:
|
||||
- Cold and heat follow the biome: Frostpeak's jagged peaks freeze an unprotected player in about a minute even at noon, Sunscorch's desert and badlands overheat one in about two minutes at noon; deserts cool off at night. Cold Sweat's insulation doesn't move the comfortable range, it slows how fast the body drifts out of it.
|
||||
- Only Cold Sweat's fur set (cold) and hide set (heat) really insulate: about 14 minutes in Frostpeak at noon and 25 in Sunscorch, longer with extra fur or hide sewn in. Their materials need boss drops (Adrian's rule): Goat Fur from wool and a Heat Rock (Sunscorch's guardian), Hoglin Hide from leather and an Icy Rock (the Mire's and the Highlands' guardians), `kubejs/server_scripts/insulation.js`. Leather armour no longer insulates by itself; sewn-in leather and wool only a little. Fire Resistance and Cold Sweat's own potions and warm/cold food still work.
|
||||
- So the lowlands stay livable at night, the coldest comfortable temperature is lower (0.25 instead of 0.4) and windswept hills are milder (45–72 °F instead of 24–58 °F). New players keep Cold Sweat's 5-minute grace period.
|
||||
- Cold Sweat's own animals (chameleons) can't join, like vanilla mobs: the only-Pokémon rule now lets in Cobblemon's entities only.
|
||||
- Tested on the island itself (`cold_needs_fur`, `heat_needs_hide`, `lowlands_are_mild` in `tools/quick_check.py`): players stand at real spots in each zone, their body drift is turned into minutes until it hurts, and a frozen player without the grace period takes damage.
|
||||
|
||||
## Open decisions for Adrian (proceeding with the default, flagged)
|
||||
|
||||
| Decision | Default used for now |
|
||||
| --- | --- |
|
||||
| Roadmap's open decisions table (loader, island size, safety net, boss AoE, etc.) | Roadmap defaults, unchanged |
|
||||
| **Platform split** (deferred until a public release; not publishing for now) | No platform hosts the full mod list (FTB Quests is CurseForge-only; CobbleHardcoreMon is Modrinth-only). Both mods stay; the exports keep listing what they leave out. Options for release: (a) publish one platform's pack, or both with the gaps listed; (b) ask the authors to cross-post (CobbleHardcoreMon, Matthiesen Core, Regenerating Ore Veins and Ore Generation Configuration are MIT); (c) a quest mod on both platforms; (d) permadeath in the companion mod |
|
||||
| **Minecraft EULA for CI.** Adrian accepted it for the local test server on 2026-10-28 | CI still runs `--load-only` until the repository variable `MINECRAFT_EULA_ACCEPTED=true` is set |
|
||||
| License for the companion mod and pack content | MIT for the companion mod (placeholder); nothing chosen for the rest |
|
||||
| Pack name and mod id | "Cobblemon Survival Pack" / `cobblesurvival` (working titles) |
|
||||
| Basalt deltas keeps the vanilla Nether biome's mobs and features: ghasts, magma cubes and striders can spawn in those caves, glowstone generates, and Cobblemon's Nether-themed habitats appear there (found by the field guide) | Settled by Phase 2: no vanilla mob can join (`world/OnlyPokemon.kt`), so no ghasts, magma cubes or striders; glowstone and Cobblemon's Nether-themed habitats stay |
|
||||
| Items that need the Nether have no source: Choice Band, Choice Specs (Nether Quartz, Blaze Rod), Master Ball (Netherite) | Phase 4 adds sources (veins, drops or recipe changes); listed by the field guide |
|
||||
| End portals stay openable; the Ender Dragon will be replaced by a Pokémon boss fight (Adrian, 2026-10-28; Phase 7) | Eyes of ender are obtainable: ender pearls drop from Abra, Kadabra and Alakazam (and trial chamber loot), blaze powder from Magmar, Magby, Houndour and others. The dragon is on the allowed list until its replacement exists; End city shulkers are blocked like every vanilla mob |
|
||||
| End access depends on the seed: a stronghold must start inside the border | `isle-26` has two; `tools/world_report.py` now fails a world without one |
|
||||
@@ -0,0 +1,99 @@
|
||||
# Field guide
|
||||
|
||||
`tools/fieldguide/` generates a field guide from the pack's own data: where every Pokémon lives on the island, how to get every item the mods add (and whether the island can provide it at all), and what each item is for. It also exports the same knowledge in two forms the game can show. Everything it writes goes to `build/field-guide/`; nothing is installed into `pack/`.
|
||||
|
||||
```bash
|
||||
python3 tools/fieldguide/build.py # about 10 s (+ ~25 s when pack recipes changed); open build/field-guide/index.html
|
||||
python3 tools/fieldguide/build.py --no-icons # skip icon rendering
|
||||
python3 tools/fieldguide/build.py --no-server # never start Minecraft; use the last KubeJS recipe export as it is
|
||||
python3 tools/fieldguide/kubejs_export.py # only refresh the KubeJS recipe export (below)
|
||||
python3 tools/fieldguide/build.py --from-json build/field-guide/fieldguide.json # re-render only
|
||||
python3 tools/fieldguide/build.py --extra my-sources.json # add sources (below)
|
||||
```
|
||||
|
||||
It needs `tools/build.py` (for `build/stage/full/mods`) or a server under `build/server` to have run once, because it reads the downloaded jars and the vanilla data jar. The only time it starts Minecraft is to refresh the pack's KubeJS recipes (see [Pack recipes](#pack-recipes-kubejs)).
|
||||
|
||||
## Outputs
|
||||
|
||||
| Path under `build/field-guide/` | What |
|
||||
| --- | --- |
|
||||
| `fieldguide.json` | The single source. Every renderer reads only this file (schema in `tools/fieldguide/guide.py`). `meta.kubejs_export` says which KubeJS recipe export it used; `hidden_spawns` keeps the spawn entries a filter hides (below) |
|
||||
| `index.html` | Overview: counts, locations, items with no source on the island, structures, unresolved data |
|
||||
| `pokemon.html` | Pokémon by location (every island biome, caves and the End included), a page per species with the zones it lives in, and the species that are not wild here with the reason and the other ways to get them |
|
||||
| `items.html` | Every mod item with filters; the detail view shows recipe grids, all other sources with chances, and every use |
|
||||
| `icons/` | Item icons rendered from the jars' models. Third-party assets: build output only, never commit them |
|
||||
| `ingame/ftbquests/` | Three FTB Quests chapters ("Field Guide: Wild Pokémon", "Other Pokémon", "Items") and their `lang/en_us.snbt`. Install note in its `README.md` |
|
||||
| `ingame/kubejs/` | `assets/cobblemon/lang/en_us.json`: Cobblemon's Pokédex descriptions with "Found in: …" appended. Install note in its `README.md` |
|
||||
|
||||
The HTML works from disk (no server, no network) and follows the system's light or dark mode; the ◐ button switches by hand.
|
||||
|
||||
## How it reads the data
|
||||
|
||||
The data stack mirrors Minecraft's pack order: vanilla server data, NeoForge, every jar named in `pack/mods/*.pw.toml` (plus the companion mod), then `datapacks/core`, then `pack/kubejs` on top (KubeJS serves its `data/` as a data pack and its `assets/` as a resource pack; the guide reads textures and lang from there). A higher layer replaces a file, tags merge across layers, and a `pack.mcmeta` `filter` block hides the matching files of the layers below, so now that `datapacks/core` filters out Cobblemon's spawn pools and adds the zone pools, `spawns` and every page show only the zone pools. Cobblemon's own entries stay in `fieldguide.json` under `hidden_spawns`, in the same shape and resolved against the island the same way (status is what the entry would have if it were active), because `tools/zone_spawns.py` plans the zones from them; they count for nothing else. Jars are copied to `build/fieldguide-cache/jars/` first.
|
||||
|
||||
The island comes from `world/biomes.json` (`allowed` + `water`), the world preset named in `world/world.json` (which dimensions exist: overworld and the End, no Nether), structure and structure-set JSON (which structures can generate in the island's biomes), biome feature lists plus NeoForge biome modifiers (which blocks generate naturally, and which ores the pack switched off), and biome spawners plus structure spawn overrides (which vanilla mobs exist).
|
||||
|
||||
Spawns follow Cobblemon 1.8.4's rules: a spawn's conditions are alternatives, anticonditions veto, presets are merged into every condition (lists appended, single values kept), and a biome named in any anticondition never counts. A spawn that needs a structure is only listed in the biomes that structure generates in.
|
||||
|
||||
The companion mod's zone condition (`"zone": "<id>"`, or `"zones": [...]`, which wins; `mod/.../zone/Zones.kt`) is shown first in a spawn's conditions as the zone's name and level band from `world/zones.json`, e.g. "zone Southwold (Lv 8–18)". Each spawn entry in `fieldguide.json` carries its zone ids (`zones`), and each "Where to find it" row of a species names the zones (`species[*].locations[*].zones`; the FTB Quests text says "Badlands (Southwold)"). A zone id missing from `world/zones.json` is listed under unresolved data.
|
||||
|
||||
### Statuses
|
||||
|
||||
Every way to get something is a *source* that may need other things (a recipe needs its ingredients and station, a Pokémon drop needs a wild spawn, a mob drop needs the mob, archaeology needs a brush, a fossil needs the fossil and the Fossil Analyzer parts, an evolution needs the pre-evolution and its item). A fixpoint over all items, blocks, mobs, spawns and species then marks each one:
|
||||
|
||||
- **available**: obtainable on the island.
|
||||
- **conditional**: only with something that may not exist: the End (needs a stronghold portal) or strongholds themselves (their rings start 1,280 blocks out and may lie outside the world border).
|
||||
- **unavailable**: no source here. The guide says why: ore generation switched off, Nether only, a biome or structure the island lacks, or no source in the data at all.
|
||||
|
||||
## Pack recipes (KubeJS)
|
||||
|
||||
The pack adds, replaces and removes recipes in `pack/kubejs/server_scripts/` (Phase 2: the Revival Charm, and a Healing Machine that replaces Cobblemon's). Those scripts are code, so the guide does not parse them: it asks KubeJS what they did on the real server.
|
||||
|
||||
`tools/fieldguide/kubejs_export.py` prepares the test server in `build/server` like the other server tools (it syncs from `build/stage/full`), boots it on a throwaway void world, runs `/kubejs export debug` over RCON and stops it (about 25 s). KubeJS reloads the data and writes `build/server/local/kubejs/export/`; the exporter keeps three parts in `build/fieldguide-cache/kubejs-export/export.json`:
|
||||
|
||||
- every recipe that carries KubeJS's `_kubejs_changed_marker` (added or changed by a script; the final recipe JSON plus the script and line),
|
||||
- every recipe id a script removed (`removed_recipes/`), whichever jar or data pack it came from,
|
||||
- the server's item registry, so items a KubeJS startup script registers (`cobblesurvival:revival_charm`) are listed although no jar has a model for them. Their icon is the texture under `pack/kubejs/assets`, as KubeJS's default `item/generated` model would show it.
|
||||
|
||||
`build.py` applies that export after reading the data stack: removed recipes disappear (with every source and use they gave), added or changed ones replace any recipe with the same id and are labelled "(pack recipe)" in the guide and the FTB Quests chapter, with `script` in `fieldguide.json` pointing at the script line.
|
||||
|
||||
The export stores a hash of what can change the recipe set: `pack/kubejs/{server_scripts,startup_scripts,data}`, `pack/mods` and `datapacks/core`. When that no longer matches, `build.py` refreshes the export by itself before building. So after editing a recipe script:
|
||||
|
||||
1. Run `tools/build.py` (the server runs the staged copy of `pack/kubejs`; the exporter refuses to export a staged copy that differs from `pack/kubejs`).
|
||||
2. Run `tools/fieldguide/build.py`.
|
||||
|
||||
If the export cannot run (no EULA in `build/server/eula.txt`, a test server is already running there, a mod fails to load) or `--no-server` is given, the guide uses the last export, says so on the console and lists it under "unresolved data". Without any export it shows only the jars' recipes and says that too.
|
||||
|
||||
## Adding sources: `--extra`
|
||||
|
||||
Sources the data cannot show yet (Phase 4 ore veins, trades, code-only mechanics) can be fed in without touching the code:
|
||||
|
||||
```json
|
||||
{
|
||||
"sources": [
|
||||
{"item": "minecraft:raw_iron", "how": "Regenerating iron vein (forest zone)", "kind": "ore vein", "needs": []},
|
||||
{"item": "cobblemon:tasty_tail", "how": "Shear a Slowpoke", "needs": [["species:cobblemon:slowpoke"], ["item:minecraft:shears"]]}
|
||||
],
|
||||
"remove_recipes": ["cobblemon:poke_ball"]
|
||||
}
|
||||
```
|
||||
|
||||
`needs` is a list of groups; each group is met by any one of its keys (`item:`, `block:`, `mob:`, `species:`). `remove_recipes` drops recipes by id. Recipes from data (`datapacks/core`, `pack/kubejs/data`) and from KubeJS scripts are read without this file. A later runtime exporter can instead write `fieldguide.json` itself and render it with `--from-json`.
|
||||
|
||||
## Known limits
|
||||
|
||||
- Mechanics that live only in code are not in the data: villager trades (only emeralds are entered by hand), Poké Puffs, Slowpoke tail shearing (Tasty Tail), Oricorio's flowers, Gimmighoul chests, budding Tumblestone. Those items show "no source in the data". Hand-entered vanilla mechanics are in `tools/fieldguide/manual_sources.json`.
|
||||
- Code tables to re-check after a Cobblemon or Minecraft update: `COBBLEMON_CODED_FEATURES`, `CODE_FEATURE_BLOCKS`, `CODE_LOOT`, `CODE_STRUCTURE_BLOCKS` and `SPECIAL_MOBS` in `tools/fieldguide/world.py`, `STATIONS` and `TECHNICAL` in `model.py`. Each says where it comes from.
|
||||
- Loot chances are estimates (expected rolls × weight share × random-chance conditions). Spawn chances are Cobblemon's bucket chance plus the weight; the real rate also depends on what else can spawn at that spot.
|
||||
- A spawn that needs particular blocks nearby (concrete, pyramid blocks) is listed in every biome its tag allows, because players can build those blocks anywhere; the guide lists those spawns last and marks them.
|
||||
- The guide names a spawn's zone but does not know where the zones lie (that is the zone map the companion mod reads at runtime), so a zone pool entry is listed in every island biome its biome condition allows, also where its zone has none of that biome, and its status ignores the zone.
|
||||
- Mod item lists come from item models that have a name or appear in data, plus the server's item registry from the KubeJS export; a few creative-only items are marked as such.
|
||||
- What a KubeJS startup script sets in code (`.displayName`, `.tooltip`) is not in the export: such items are named from `pack/kubejs/assets/*/lang` if present, else from their id ("Revival Charm"), and have no tooltip in the guide.
|
||||
|
||||
## In-game checks still needed
|
||||
|
||||
The exports follow the formats read from FTB Quests 2101.1.37's and Cobblemon 1.8.4's source, but nobody has loaded them in the game yet:
|
||||
|
||||
1. FTB Quests: the three chapters appear, titles and descriptions show (not raw keys), Pokémon icons render as models (`cobblemon:pokemon_model` with the `cobblemon:pokemon_item` component), the quest grid is readable, nothing is locked, and `&c`/`&6` colour codes in item descriptions render as colours.
|
||||
2. Pokédex override: KubeJS serves `kubejs/assets` on the client, the appended "Found in: …" sentence shows on a Pokédex page, long texts wrap or scroll inside the description box, and other languages are unaffected.
|
||||
3. Spot-check a few guide claims in a test world, e.g. Bulbasaur in jungle only, Nidoran absent (savanna is remapped to desert), Aron absent (it needs iron ore nearby), a Water Stone from a Gimmi Tower chest.
|
||||
@@ -0,0 +1,70 @@
|
||||
# Licenses and credits
|
||||
|
||||
The pack is free. It references every third-party mod through packwiz metadata, so players download each jar from Modrinth or CurseForge, the author's own host. No third-party jar is copied into this repo or into an export; `tools/build.py` fails an export that would do that.
|
||||
|
||||
Read each license before adding a mod, and add a row here in the same change.
|
||||
|
||||
## Mods in the pack
|
||||
|
||||
| Mod | Authors | License | Where it comes from | Notes |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| Cobblemon | Cobblemon team (cable-mc) | MPL-2.0 | [Modrinth](https://modrinth.com/mod/cobblemon) / [CurseForge](https://www.curseforge.com/minecraft/mc-mods/cobblemon) | Also the compile dependency of the companion mod (official maven `artefacts.cobblemon.com`) |
|
||||
| Kotlin for Forge | thedarkcolour | LGPL-2.1-only | [Modrinth](https://modrinth.com/mod/kotlin-for-forge) / [CurseForge](https://www.curseforge.com/minecraft/mc-mods/kotlin-for-forge) | |
|
||||
| KubeJS | LatvianModder (latvian.dev) | LGPL-3.0-only | [Modrinth](https://modrinth.com/mod/kubejs) / [CurseForge](https://www.curseforge.com/minecraft/mc-mods/kubejs) | Embeds Better Advanced Tooltips (MIT) |
|
||||
| Rhino | LatvianModder (latvian.dev) | MPL-2.0 | [Modrinth](https://modrinth.com/mod/rhino) / [CurseForge](https://www.curseforge.com/minecraft/mc-mods/rhino) | |
|
||||
| FTB Quests | FTB Team | All Rights Reserved (jar metadata) | [CurseForge](https://www.curseforge.com/minecraft/mc-mods/ftb-quests-forge) | Referenced by project/file ID only. Not on Modrinth |
|
||||
| FTB Library | FTB Team | All Rights Reserved (jar metadata) | [CurseForge](https://www.curseforge.com/minecraft/mc-mods/ftb-library-forge) | Same |
|
||||
| FTB Teams | FTB Team | All Rights Reserved (jar metadata) | [CurseForge](https://www.curseforge.com/minecraft/mc-mods/ftb-teams-forge) | Same |
|
||||
| Architectury API | shedaniel | LGPL-3.0-only | [Modrinth](https://modrinth.com/mod/architectury-api) / [CurseForge](https://www.curseforge.com/minecraft/mc-mods/architectury-api) | |
|
||||
| Just Enough Items (JEI) | mezz | MIT | [Modrinth](https://modrinth.com/mod/jei) | QOL: recipe and item viewer (both) |
|
||||
| MezzConfig | mezz | MIT | [Modrinth](https://modrinth.com/mod/mezzconfig) | QOL: JEI dependency (both) |
|
||||
| Jade | Snownee | CC BY-NC-SA 4.0 | [Modrinth](https://modrinth.com/mod/jade) | QOL: shows the block/entity you look at and its mod (both) |
|
||||
| Inventory Profiles Next | blackd | AGPL-3.0-or-later | [Modrinth](https://modrinth.com/mod/inventory-profiles-next) | QOL: inventory sorting, auto-refill (Inventory Tweaks successor) (client) |
|
||||
| libIPN | blackd | AGPL-3.0-or-later | [Modrinth](https://modrinth.com/mod/libipn) | QOL: Inventory Profiles Next dependency (client) |
|
||||
| Mouse Tweaks | YaLTeR | BSD-3-Clause | [Modrinth](https://modrinth.com/mod/mouse-tweaks) | QOL: drag/scroll item moving (client) |
|
||||
| AppleSkin | squeek502 | Unlicense | [Modrinth](https://modrinth.com/mod/appleskin) | QOL: food and saturation display (both) |
|
||||
| Controlling | jaredlll08 | MIT | [Modrinth](https://modrinth.com/mod/controlling) | QOL: keybind search (client) |
|
||||
| Searchables | jaredlll08 | MIT | [Modrinth](https://modrinth.com/mod/searchables) | QOL: Controlling dependency (client) |
|
||||
| Xaero's Minimap | thexaero | All Rights Reserved | [Modrinth](https://modrinth.com/mod/xaeros-minimap) | QOL: minimap (both) |
|
||||
| Xaero's World Map | thexaero | All Rights Reserved | [Modrinth](https://modrinth.com/mod/xaeros-world-map) | QOL: world map (both) |
|
||||
| Sodium | CaffeineMC (jellysquid3, IMS, douira) | Polyform Shield 1.0.0 | [Modrinth](https://modrinth.com/mod/sodium) | QOL: rendering performance (client) |
|
||||
| FerriteCore | malte0811 | MIT | [Modrinth](https://modrinth.com/mod/ferrite-core) | QOL: memory use (both) |
|
||||
| ModernFix | embeddedt | LGPL-3.0-only | [Modrinth](https://modrinth.com/mod/modernfix) | QOL: load time and memory (both) |
|
||||
| ImmediatelyFast | RaphiMC | LGPL-3.0-or-later | [Modrinth](https://modrinth.com/mod/immediatelyfast) | QOL: rendering performance (client) |
|
||||
| Entity Culling | tr7zw | tr7zw Protective License | [Modrinth](https://modrinth.com/mod/entityculling) | QOL: skips rendering hidden entities (client) |
|
||||
| Default Options | BlayTheNinth | All Rights Reserved | [Modrinth](https://modrinth.com/mod/default-options) | QOL: ships conflict-free default keybinds (client) |
|
||||
| Balm | BlayTheNinth | All Rights Reserved | [Modrinth](https://modrinth.com/mod/balm) | QOL: Default Options dependency (both) |
|
||||
| CobbleHardcoreMon | Matthiesen-dev (Adammatthiesen) | MIT | [Modrinth](https://modrinth.com/mod/cobblehardcoremon) | Phase 2 |
|
||||
| Matthiesen Core | Matthiesen-dev (Adammatthiesen) | MIT | [Modrinth](https://modrinth.com/mod/matthiesen-core) | Phase 2 |
|
||||
| Cobblemon Fight or Flight Reborn | see Modrinth page | MIT | [Modrinth](https://modrinth.com/mod/cobblemon-fight-or-flight-reborn) | Phase 2 |
|
||||
| Cobblemon TP-Pastures | see Modrinth page | All Rights Reserved | [Modrinth](https://modrinth.com/mod/cobblemon_tp_pastures) | Phase 2 |
|
||||
| Lootr | noobanidus | MIT | [Modrinth](https://modrinth.com/mod/lootr) | Phase 2 |
|
||||
| Cold Sweat | Momo Softworks (Mikul) | GPL-3.0-or-later | [Modrinth](https://modrinth.com/mod/cold-sweat) / [CurseForge](https://www.curseforge.com/minecraft/mc-mods/cold-sweat) | Phase 3: heat and cold as zone hazards (both) |
|
||||
| WorldGen Editor | waterflane | CC BY-NC-SA 4.0 | [Modrinth](https://modrinth.com/mod/worldgen-editor) / [CurseForge](https://www.curseforge.com/minecraft/mc-mods/worldgen-editor), [source](https://github.com/waterflane/WorldGen-Editor) | Non-commercial, share-alike. See the derived files below |
|
||||
|
||||
Licenses of mods planned for later phases are in `docs/addon-status.md` and move here when the mod is added. **Cobblemon TP-Pastures**, **CobbleStrike** and the **FTB** mods are All Rights Reserved: reference only, never redistribute or modify.
|
||||
|
||||
### Files derived from third-party data
|
||||
|
||||
| File | Derived from | License of the derived file |
|
||||
| --- | --- | --- |
|
||||
| `datapacks/core/data/worldgen_editor/worldgen/noise_settings/island_overworld.json` | WorldGen Editor's `island_overworld` noise settings, with only `ore_veins_enabled` set to `false` | CC BY-NC-SA 4.0, © waterflane (share-alike) |
|
||||
| `datapacks/core/data/cobblesurvival/worldgen/world_preset/island.json` | Structure of WorldGen Editor's bundled world presets; the biome table is vanilla's overworld parameters (Mojang, from the game's own data generator) with biomes renamed | CC BY-NC-SA 4.0 for the WorldGen Editor part; the vanilla data stays Mojang's, shipped in a data pack as data packs commonly do |
|
||||
| `pack/config/worldgen_editor/presets/cobblesurvival_island.json` | Field format of WorldGen Editor presets; our own values | CC BY-NC-SA 4.0 to be safe |
|
||||
| `datapacks/core/data/cobblemon/worldgen/placed_feature/ore/*.json` | Cobblemon's placed features (feature id kept, placement replaced) | MPL-2.0, like Cobblemon |
|
||||
| `datapacks/core/data/cobblemon/worldgen/processor_list/**`, `.../template_pool/**` | Cobblemon's processor lists with an ore-stripping rule appended, and Gimmighoul tower pools without their mob pieces (`tools/clean_structures.py`) | MPL-2.0, like Cobblemon |
|
||||
| `datapacks/core/data/cobblesurvival/spawn_pool_world/*.json`, `docs/zone-species.md` | Cobblemon's spawn pool entries, regrouped by zone with levels clamped (`tools/zone_spawns.py`) | MPL-2.0, like Cobblemon |
|
||||
| `datapacks/core/data/minecraft/worldgen/processor_list/fossil_*.json`, `datapacks/core/data/minecraft/tags/worldgen/biome/has_structure/*.json` | Vanilla fossil processor lists (ore rule appended) and structure biome tags (basalt deltas removed) | Mojang's data, adapted as data packs commonly do |
|
||||
|
||||
## Our own work
|
||||
|
||||
| Part | License |
|
||||
| --- | --- |
|
||||
| Companion mod (`mod/`) | MIT **(placeholder, see open decisions in `docs/design.md`)** |
|
||||
| Datapack, KubeJS scripts, configs, quests, tools | not chosen yet (same open decision) |
|
||||
|
||||
Build tooling, not shipped in the pack: the companion mod's Gradle setup follows Cobblemon's official [NeoForge Kotlin MDK](https://gitlab.com/cable-mc/cobblemon-mdks); Gradle wrapper (Apache-2.0); [packwiz](https://github.com/packwiz/packwiz) and [packwiz-installer](https://github.com/packwiz/packwiz-installer) (MIT); [Chunky](https://modrinth.com/mod/chunky) by pop4959 (GPL-3.0), used only to pregenerate the world template.
|
||||
|
||||
## Disclaimer
|
||||
|
||||
This is an unofficial, fan-made modpack. It is not affiliated with, endorsed, sponsored or approved by Nintendo, Game Freak, Creatures Inc., The Pokémon Company, the Cobblemon team, Mojang Studios or Microsoft. Pokémon and Pokémon character names are trademarks of Nintendo. Minecraft is a trademark of Mojang Studios. The pack is free, has no monetization, and will never be sold.
|
||||
+231
@@ -0,0 +1,231 @@
|
||||
# Cobblemon Survival Pack – Agent Roadmap
|
||||
|
||||
Oct 28, 2026 · @Adrian
|
||||
|
||||
## Brief for the agent
|
||||
|
||||
Build a free NeoForge 1.21.1 modpack on Cobblemon 1.8.x: one large preset island with Palworld/ARK-style progression, plus a single companion mod for the mechanics no addon covers. Work phase by phase; every phase ends with "Done when" checks, and some end with a checkpoint where you stop and report to Adrian.
|
||||
|
||||
### Design pillars (do not trade these away)
|
||||
|
||||
1. **Soft gates only.** Nothing is hard-locked. Progress is steered by hostile environments, harder Pokémon and recipe chains. A player who pushes ahead with potions or golden apples is allowed to.
|
||||
2. **Pokémon permadeath.** A fainted Pokémon is deleted. The player does not die when the team wipes.
|
||||
3. **Controlled resources.** No natural ore anywhere. Ore comes only from surface veins that regenerate on a timer.
|
||||
4. **Pokémon are part of the world.** Their drops are crafting inputs, they work at bases, their moves change blocks (fire, ice, digging), and machines run on Pokémon that are visibly inside them.
|
||||
5. **Base-bound storage.** The PC works only at a placed PC block; pastured Pokémon are physically present.
|
||||
6. **Zones by level.** Each biome region of the island has its own level band and Pokémon.
|
||||
7. **Data before code.** Config, datapack or KubeJS first; an existing addon second; the companion mod third.
|
||||
|
||||
### Working rules
|
||||
|
||||
- Never bundle third-party jars. Reference every mod through packwiz metadata, read its license first, and log it in `docs/licenses.md`.
|
||||
- Pin every version. Record each addon's Cobblemon 1.8 status in `docs/addon-status.md`; many addons still target 1.7.
|
||||
- Keep every tunable (levels, drop rates, timers, damage) in config or `docs/balance.md`. Mark guessed values as placeholders instead of presenting them as decided.
|
||||
- You cannot judge visuals or feel. At the end of each phase, list exactly what Adrian should check in-game.
|
||||
- Stop at each **Ask Adrian** checkpoint and wait for an answer before continuing.
|
||||
- The pack stays free: no monetization, credit every author, include a non-affiliation disclaimer.
|
||||
|
||||
## Technical baseline
|
||||
|
||||
NeoForge 1.21.1 is assumed because Cold Sweat and Regenerating Ore Veins only ship for NeoForge on 1.21.1; Adrian has not confirmed it yet.
|
||||
|
||||
| Component | Choice | Notes |
|
||||
| --- | --- | --- |
|
||||
| Game + loader | Minecraft 1.21.1, NeoForge 21.1.x | Pin one NeoForge build |
|
||||
| Core | [Cobblemon](https://modrinth.com/mod/cobblemon/version/gBW3vLC7) 1.8.x | 1.8.3 is current as of Oct 2026 |
|
||||
| Pack definition | packwiz | Exports to Modrinth and CurseForge formats |
|
||||
| Companion mod | Kotlin, NeoForge MDK + Kotlin for Forge | Take Cobblemon's maven coordinates from its official docs or addon template; don't guess them |
|
||||
| Recipes, tags, item tweaks | KubeJS | Keeps recipe chains out of Java/Kotlin |
|
||||
| Quests | FTB Quests | See Phase 8 |
|
||||
| Map | WorldGen Editor + shipped world template | See Phase 1 |
|
||||
|
||||
### Repo layout
|
||||
|
||||
```
|
||||
pack/ packwiz definition: mods/*.pw.toml, config/, kubejs/, defaultconfigs/
|
||||
datapacks/core/ spawn pools, species drops, ride settings, habitat pools
|
||||
mod/ companion mod (Kotlin)
|
||||
world/ shipped world template
|
||||
docs/ design.md, balance.md, licenses.md, addon-status.md, quests source
|
||||
tools/ build, server smoke test, quest generator, worldgen helpers
|
||||
```
|
||||
|
||||
### Test loop
|
||||
|
||||
1. `packwiz refresh`, then export both pack formats.
|
||||
2. Server smoke test in CI: boot a dedicated NeoForge server with the pack and the world template, wait for startup, run a command script over RCON (key commands exist, datapacks loaded, no errors or missing-mod warnings in the log), then stop.
|
||||
3. Companion mod: unit tests for pure logic, NeoForge GameTests for anything that touches blocks or entities.
|
||||
4. A written in-game checklist for Adrian at the end of each phase.
|
||||
|
||||
## Phase map
|
||||
|
||||
[embedded content: phase dependencies · 10 phases\]
|
||||
|
||||
Phases in the same column can run in parallel. Not drawn: boss battles (Phase 7) also reuse the field-move effects from Phase 5.
|
||||
|
||||
## Phase 0 – Repo and pack skeleton
|
||||
|
||||
Goal: a pack that boots on a dedicated server with Cobblemon 1.8.x and an empty companion mod.
|
||||
|
||||
- Create the repo layout above, the packwiz pack, and the companion mod scaffold (mod id, Kotlin for Forge, Cobblemon as a compile dependency).
|
||||
- Add the CI smoke test from the test loop.
|
||||
- Start `docs/addon-status.md` with every addon named in this roadmap and its 1.8 status.
|
||||
|
||||
**Done when:** CI boots the server cleanly, the companion mod logs that it loaded, and both pack exports install in a launcher.
|
||||
|
||||
## Phase 1 – Island map
|
||||
|
||||
Goal: a generated, natural-looking large island that Adrian can tweak later.
|
||||
|
||||
**Approach.** Use [WorldGen Editor](https://www.mado-hosting.com/en/minecraft-mods/worldgen-editor) (NeoForge 1.21.1, v0.3.0). It generates islands from JSON presets with position, radius, coastline roughness, temperature, biome patch size and per-island biome exclusions, keeps vanilla-style terrain, and has a separate previewer for layouts. It is licensed CC BY-NC-SA 4.0, which fits a free pack with attribution. The fallback is the desktop editor WorldPainter.
|
||||
|
||||
1. Write one preset: a single large island inside an outer ocean. Use biome exclusions so the biome set matches the zone plan from Phase 3.
|
||||
2. Remove natural ore: [Ore Generation Configuration](https://www.curseforge.com/minecraft/mc-mods/regenerating-ore-veins) (linked via its author's vein-mod page; a server-side mod that reduces, denies or replaces ore generation in new chunks) or a datapack that blanks the ore placed features.
|
||||
3. Generate a test world, pregenerate the island area with a pregenerator such as Chunky, and set a world border just outside the coast.
|
||||
4. Ship the result as the pack's world template. Document how to edit it (WorldPainter on the exported world, or in-game editing tools).
|
||||
5. Render a top-down biome map image for review.
|
||||
|
||||
**Ask Adrian:** approve the island size and layout before Phase 3. The radius is undecided; start around 1,500 blocks for testing (a placeholder, not a design value).
|
||||
|
||||
**Done when:** the template loads, contains no natural ore blocks in a scripted scan of sample chunks, and the border matches the coast.
|
||||
|
||||
## Phase 2 – Core survival rules
|
||||
|
||||
Goal: the survival ruleset works before any zone content exists.
|
||||
|
||||
- **Permadeath.** Install [CobbleHardcoreMon](https://modrinth.com/project/VqvNhP9x) (MIT, NeoForge, Cobblemon 1.8.x). A Pokémon that faints without holding the configured totem item is removed permanently. Point that item at a costly crafted "revival charm" (soft safety net) instead of the default Totem of Undying. Leave its Health Link and Soul Link options off. Do not install any whiteout mod.
|
||||
- **Verify permadeath edge cases** with GameTests or scripted tests: faint in a wild battle, a trainer battle, and outside battle (poison, fall, fire). Close any gap in the companion mod.
|
||||
- **Healing friction.** Turn off party healing on sleep and make Healing Machines expensive.
|
||||
- **Storage.** PC only at placed PC blocks; add no remote-PC addons such as Cobblemon Box Link. Install [TP-Pastures](https://www.curseforge.com/minecraft/mc-mods/cobblemon-tp-pastures) so pastured Pokémon are teleported back instead of recalled.
|
||||
- **Dangerous wilds.** Install Fight or Flight Reborn so wild Pokémon flee or fight back.
|
||||
- **Free movement in battle.** Cobblemon lets players toggle free movement during battles (build, mine, fight mobs). Confirm it stays available; Phase 7 depends on it.
|
||||
- **Vanilla clean-up.** Remove or replace vanilla hostile mobs, villages and loot tables that hand out ore or ingots.
|
||||
|
||||
**Done when:** the permadeath test matrix passes, a party can no longer be healed by sleeping, and no remote PC access exists.
|
||||
|
||||
## Phase 3 – Zones, spawns and soft gates
|
||||
|
||||
Goal: each region of the island has its own Pokémon, level band and hazard.
|
||||
|
||||
1. Draft a zone table in `docs/design.md`: zone, biomes, level band, hazard, signature drops, Alpha guardian. **Ask Adrian** to approve it.
|
||||
2. Nullify Cobblemon's base spawns from your datapack's `pack.mcmeta` and write `spawn_pool_world` entries per zone with narrow level ranges ([custom spawns tutorial](https://wiki.cobblemon.com/index.php/Tutorials/Creating_Custom_Spawns)). Keep ranges tight, because the spawner also considers the party's level.
|
||||
3. Use [Habitat Blocks](https://wiki.cobblemon.com/index.php/Habitat_Block) for set pieces: each sets its own pool, level range, spawn range, max spawns and whether it replaces natural spawns.
|
||||
4. Place one Alpha guardian per zone. Its drops should make the next zone easier, never unlock it.
|
||||
5. **Hazards as gates.** Cold and heat through [Cold Sweat](https://www.curseforge.com/minecraft/mc-mods/cold-sweat): without insulation the player keeps taking damage. Make insulation recipes (KubeJS) need Pokémon drops, e.g. wool for the cold zone. Other hazards (a poison swamp) go in the companion mod as area effects. Potions and golden apples must remain a valid way to push through.
|
||||
6. **Soft level pressure** (companion mod): reduced XP, or a disobedience chance, for Pokémon far above a zone's band. No hard level caps.
|
||||
7. **Flyers.** Tune stamina and speed per species in `ride_settings`; strong flyers only spawn in high-level zones. Nothing blocks mounting.
|
||||
|
||||
**Done when:** a scripted spawn survey per zone shows only that zone's species and levels, and the cold zone damages an unprotected player but not one in wool armour.
|
||||
|
||||
## Phase 4 – Resources and jobs
|
||||
|
||||
Goal: ore, Pokémon drops and base production form the economy.
|
||||
|
||||
- **Ore veins.** [Regenerating Ore Veins](https://www.curseforge.com/minecraft/mc-mods/regenerating-ore-veins): one `areas.json` box per zone, `veins.json` entries per ore tier restricted to their zone, regeneration intervals with jitter, and hand-placed showcase veins. Higher-tier ores sit in higher-level zones.
|
||||
- **Unique drops.** Species drop tables in the datapack for every crafting-relevant drop. List each drop and what consumes it in `docs/balance.md`.
|
||||
- **Base jobs.** [Cobblebase](https://modrinth.com/project/cobblebase) for pasture jobs; check it on 1.8 first. Tune Producer loot and cooldowns per species.
|
||||
- **Power.** Either [Cobblemon Poke Power](https://modrinth.com/project/lIn7oRFm) (Electric types output Forge Energy) or your own generator from Phase 6, not both.
|
||||
|
||||
**Done when:** every ore tier has veins in exactly one zone, veins regenerate after restart and chunk unload, and every recipe input that comes from a Pokémon has at least one obtainable source.
|
||||
|
||||
## Phase 5 – Field moves and party passives (companion mod)
|
||||
|
||||
Goal: moves a Pokémon knows act on the world, HM-style. Flamethrower sets blocks on fire.
|
||||
|
||||
**Prior art to study, not depend on.** None is confirmed on Cobblemon 1.8:
|
||||
|
||||
- [Cobblemon Field Survival](https://www.modpackindex.com/mod/173947/cobblemon-field-survival) (NeoForge 1.21.1, Cobblemon 1.7.3): mining, digging, water utilities, Fire types cooking food.
|
||||
- [Cobblemon Environment Interactions](https://www.modpackindex.com/mod/122894/cobblemon-environment-interactions): type-based mining and utilities while riding or commanding one companion.
|
||||
- [SceneBlocks](https://www.modpackindex.com/mod/151464/sceneblocks) (from CobbleKanto): Cut, Rock Smash, Strength and Flash interacting with special blocks, checked against the party's moves.
|
||||
- [CobbleStrike](https://modrinth.com/project/cobblestrike): Dig, Cut, Rock Smash, fire and ice field moves, but built for Cobblemon 1.5.2.
|
||||
|
||||
**Spec.**
|
||||
|
||||
- Data-driven: `data/<modid>/field_moves/*.json` maps move ids to an action (ignite, freeze water, break blocks by tag with a hardness cap, extinguish, grow crops, light area), range, shape (line, cone, sphere), cooldown and optional cost.
|
||||
- Trigger with a keybind while the Pokémon is sent out or ridden. The server checks that the Pokémon really knows the move.
|
||||
- Respect game rules and protection: fire spread follows `doFireTick`, block changes go through normal break/place events so claim mods can cancel them.
|
||||
- First set: Flamethrower/Ember (ignite, light campfires and furnaces), Ice Beam (freeze water), Dig/Rock Smash (break stone and ore within cap), Cut (fell trees), Water Gun (extinguish, fill cauldrons).
|
||||
- **Party passives**, also data-driven: e.g. Haste while a Rock or Ground type is in the party, warmth in the cold zone from Fire types.
|
||||
|
||||
**Done when:** GameTests cover every action, a missing move is rejected server-side, and fire behaves correctly with `doFireTick` on and off.
|
||||
|
||||
## Phase 6 – Pokémon machines (companion mod)
|
||||
|
||||
Goal: multiblock machines powered by a Pokémon that is visibly inside them, e.g. a Fire type fuelling a large furnace.
|
||||
|
||||
- **Structure.** Pattern-checked multiblocks with a controller block; first machines: Large Furnace (Fire) and Generator (Electric, outputs Forge Energy so other mods' cables work).
|
||||
- **Inserting a Pokémon.** From the party or a ball item at the controller. The Pokémon keeps its identity and data while inside.
|
||||
- **Rendering.** Preferred: spawn a real Cobblemon Pokémon entity anchored in the machine's cavity with movement disabled, so Cobblemon's own models and animations are reused. Study how Pasture Blocks tether their entities and copy that pattern. Fallback: a block-entity renderer that draws the model directly (more fragile across versions).
|
||||
- **Behaviour.** Output scales with type, level and a relevant stat. The Pokémon never faints or dies from machine work.
|
||||
- **Safety.** Breaking or invalidating the structure returns the Pokémon to the owner (party, else PC). State survives chunk unload and restart. No duplication through break/insert races.
|
||||
|
||||
**Done when:** GameTests cover insert, remove, structure break, unload/reload and server restart without loss or duplication, and Adrian confirms the in-machine rendering looks right.
|
||||
|
||||
## Phase 7 – Boss battles with area attacks (companion mod)
|
||||
|
||||
Goal: during a boss battle, the boss spawns area attacks that the player must physically dodge.
|
||||
|
||||
- **Why this works.** Cobblemon supports free movement during battles ([official modpack feature list](https://www.modpackindex.com/modpack/70659/cobblemon-official-modpack-fabric)). A third-party addon notes that Cobblemon only checks flee distance when a battle starts ([Auto-Battle changelog](https://www.curseforge.com/minecraft/mc-mods/cobblemon-auto-battle/files/7999259)); verify this, and add your own arena radius so players can't walk away from a boss.
|
||||
- **Boss definition JSON.** Which Pokémon (an Alpha or a custom aspect), arena radius, and attack patterns: circle, line, cone, ring. Each pattern has a telegraph time, damage, and trigger (every N turns, on a timer, or at HP thresholds).
|
||||
- **Runtime.** While the boss's battle is active, the server runs patterns: telegraph with ground particles, then damage entities in the area. Everything stops when the battle ends. Reuse Phase 5 effects (fire, ice) where they fit.
|
||||
- **Rules to confirm** (see open decisions): AoE hits the player only, and a player death mid-battle ends the battle as a loss.
|
||||
|
||||
**Done when:** a test boss telegraphs and lands each pattern type, attacks stop on battle end, and leaving the arena radius forfeits the battle.
|
||||
|
||||
## Phase 8 – Questbook as a research tree
|
||||
|
||||
Goal: a quest book that points players onward, laid out like a research tree whose dependencies are visible but never block.
|
||||
|
||||
- **Tool.** FTB Quests, which has current NeoForge 1.21.1 builds ([files](https://www.curseforge.com/minecraft/mc-mods/ftb-quests-forge/files/all)) and draws quests as nodes connected in dependency trees.
|
||||
- **Soft dependencies.** Use FTB Quests' Flexible progression mode, where a quest's tasks can be completed before its dependencies. A community fix mod reports a [soft-lock in that mode](https://modrinth.com/project/SWZGEk5x) when tasks finish first; test for it and add the fix if needed. Hide the per-quest lock icon ("Hide Lock Icon") so nothing looks locked, and keep dependency lines visible.
|
||||
- **Layout.** One chapter per zone plus chapters for base building, Pokémon jobs and machines. Each chapter reads left to right, from basics to advanced.
|
||||
- **Content.** Tasks: catch a species, obtain a drop, visit a biome, build a machine, beat a guardian. Rewards stay small and never unlock anything. Cobblemon-specific task types come from a Cobblemon–FTB Quests integration addon; check its 1.8 support.
|
||||
- **Source of truth.** Write quests in `docs/quests.yaml` (id, title, description, tasks, soft dependencies, grid position) and generate FTB Quests SNBT with a script in `tools/`. Adrian can then rearrange nodes in the in-game editor; note which file wins on regeneration.
|
||||
|
||||
**Done when:** every zone has a chapter, every quest is completable in any order, and the generator round-trips without losing Adrian's manual position edits.
|
||||
|
||||
## Phase 9 – Balancing and release
|
||||
|
||||
- **Balance pass** on levels, drop rates, vein timers, job cooldowns, hazard damage and machine output, all from `docs/balance.md`.
|
||||
- **Performance.** Profile with spark on a server with realistic pen and machine counts; cap entity density through pasture config if needed.
|
||||
- **Multiplayer test** with Adrian's group.
|
||||
- **Release.** Final `docs/licenses.md`, credits and non-affiliation disclaimer; publish client and server packs on Modrinth and CurseForge as dependency-based packs.
|
||||
|
||||
**Done when:** a full playthrough from spawn to the last zone is possible without commands, and a server runs a multi-hour session without tick-time spikes from Pokémon entities.
|
||||
|
||||
## Open decisions for Adrian
|
||||
|
||||
The agent should proceed with the default in each row and flag it, rather than block.
|
||||
|
||||
| Decision | Default to assume |
|
||||
| --- | --- |
|
||||
| Loader | NeoForge 1.21.1 |
|
||||
| Island size | Radius around 1,500 blocks for testing; final size after Phase 1 review |
|
||||
| Permadeath safety net | One costly crafted revival charm replaces the Totem of Undying as the protective held item |
|
||||
| Do boss area attacks hit party Pokémon? | No, player only |
|
||||
| Player dies during a battle | The battle ends as a loss; Pokémon that had not fainted survive |
|
||||
| Separate storage per base | No; all PC blocks share one storage |
|
||||
| Roster size for v1 | Curated 150–250 species |
|
||||
| Pen footprint rule | Lower pasture limits only; no size-based rule in v1 |
|
||||
| Multiplayer target | Small private server group |
|
||||
|
||||
## Sources
|
||||
|
||||
- [Cobblemon 1.8.1 (Modrinth)](https://modrinth.com/mod/cobblemon/version/gBW3vLC7)
|
||||
- [Cobblemon Official Modpack feature list (Modpack Index)](https://www.modpackindex.com/modpack/70659/cobblemon-official-modpack-fabric)
|
||||
- [Creating Custom Spawns (Cobblemon Wiki)](https://wiki.cobblemon.com/index.php/Tutorials/Creating_Custom_Spawns)
|
||||
- [Habitat Block (Cobblemon Wiki)](https://wiki.cobblemon.com/index.php/Habitat_Block)
|
||||
- [WorldGen Editor (Mado Hosting listing)](https://www.mado-hosting.com/en/minecraft-mods/worldgen-editor)
|
||||
- [Regenerating Ore Veins (CurseForge)](https://www.curseforge.com/minecraft/mc-mods/regenerating-ore-veins)
|
||||
- [CobbleHardcoreMon (Modrinth)](https://modrinth.com/project/VqvNhP9x)
|
||||
- [Cobblemon TP-Pastures (CurseForge)](https://www.curseforge.com/minecraft/mc-mods/cobblemon-tp-pastures)
|
||||
- [Cold Sweat (CurseForge)](https://www.curseforge.com/minecraft/mc-mods/cold-sweat)
|
||||
- [Cobblebase (Modrinth)](https://modrinth.com/project/cobblebase)
|
||||
- [Cobblemon Poke Power (Modrinth)](https://modrinth.com/project/lIn7oRFm)
|
||||
- [Cobblemon Field Survival (Modpack Index)](https://www.modpackindex.com/mod/173947/cobblemon-field-survival)
|
||||
- [Cobblemon Environment Interactions (Modpack Index)](https://www.modpackindex.com/mod/122894/cobblemon-environment-interactions)
|
||||
- [SceneBlocks (Modpack Index)](https://www.modpackindex.com/mod/151464/sceneblocks)
|
||||
- [CobbleStrike (Modrinth)](https://modrinth.com/project/cobblestrike)
|
||||
- [Cobblemon Auto-Battle changelog (CurseForge)](https://www.curseforge.com/minecraft/mc-mods/cobblemon-auto-battle/files/7999259)
|
||||
- [FTB Quests NeoForge files (CurseForge)](https://www.curseforge.com/minecraft/mc-mods/ftb-quests-forge/files/all)
|
||||
- [FTB Quests flexible-mode fix (Modrinth)](https://modrinth.com/project/SWZGEk5x)
|
||||
@@ -0,0 +1,59 @@
|
||||
# Pokémon per zone
|
||||
|
||||
Generated by `tools/zone_spawns.py` from Cobblemon's spawn data and `world/zones.json`; do not edit by hand. Each evolution line spawns in one zone; the stages listed are the ones whose levels reach the zone's band. Pin a line to another zone in `world/zones.json` → `species`.
|
||||
|
||||
## Button Isle (Lv 2–10, 26 lines)
|
||||
|
||||
Bidoof, Bonsly, Caterpie (Butterfree, Caterpie, Metapod), Combee, Diglett, Ditto, Gimmighoul, Hoothoot, Kricketot (Kricketot, Kricketune), Ledyba, Mawile, Meditite, Nincada, Pachirisu, Rattata, Sableye, Scatterbug (Scatterbug, Spewpa), Skitty, Smeargle, Spinarak, Sunkern, Tarountula, Weedle (Beedrill, Kakuna, Weedle), Wooper, Wurmple (Beautifly, Cascoon, Dustox, Silcoon, Wurmple), Wynaut
|
||||
|
||||
## Frostpeak Range (Lv 40–55, 43 lines)
|
||||
|
||||
Axew (Fraxure, Haxorus), Basculin (Basculegion, Basculin), Budew (Roselia, Roserade), Cherubi (Cherrim), Chespin (Chesnaught, Quilladin), Chikorita (Bayleef, Meganium), Chimchar (Infernape, Monferno), Cryogonal, Cufant (Copperajah), Delibird, Duraludon (Archaludon, Duraludon), Elekid (Electabuzz, Electivire), Gossifleur (Eldegoss), Larvitar (Pupitar, Tyranitar), Machop (Machamp, Machoke), Makuhita (Hariyama), Mankey (Annihilape, Primeape), Mienfoo (Mienshao), Minior, Rhyhorn (Rhydon, Rhyperior), Riolu (Lucario), Rockruff (Lycanroc), Rowlet (Dartrix, Decidueye), Rufflet (Braviary), Salandit, Sawk, Skiddo (Gogoat), Smoochum (Jynx), Sneasel (Sneasel, Sneasler), Snom (Frosmoth), Snorunt (Froslass, Glalie), Snover (Abomasnow), Spinda, Spoink (Grumpig), Sprigatito (Floragato, Meowscarada), Spritzee (Aromatisse), Starly (Staraptor), Throh, Togedemaru, Togepi (Togekiss, Togetic), Tyrogue (Hitmonchan, Hitmonlee, Hitmontop), Vanillite (Vanillish, Vanilluxe), Wooloo (Dubwool)
|
||||
|
||||
## Sunscorch (Lv 30–45, 32 lines)
|
||||
|
||||
Bramblin (Brambleghast), Cacnea (Cacnea, Cacturne), Capsakid (Capsakid, Scovillain), Cubone (Cubone, Marowak), Dwebble (Crustle, Dwebble), Ekans (Arbok), Falinks, Fennekin (Braixen, Delphox, Fennekin), Flittle (Espathra), Fuecoco (Crocalor, Fuecoco, Skeledirge), Helioptile (Heliolisk), Hippopotas (Hippopotas, Hippowdon), Klawf, Larvesta, Maractus, Nacli (Garganacl, Naclstack), Numel (Camerupt, Numel), Pawniard, Phanpy (Donphan, Phanpy), Poltchageist (Poltchageist, Sinistcha), Rellor (Rabsca), Sandile (Krokorok, Krookodile), Sandshrew (Sandshrew, Sandslash), Scraggy (Scrafty, Scraggy), Shinx (Luxio, Luxray), Silicobra (Sandaconda, Silicobra), Skarmory, Skorupi (Drapion, Skorupi), Spearow (Fearow), Totodile (Croconaw, Feraligatr, Totodile), Trapinch (Flygon, Vibrava), Tympole (Palpitoad, Seismitoad)
|
||||
|
||||
## Mangrove Mire (Lv 25–38, 29 lines)
|
||||
|
||||
Applin (Appletun, Applin, Dipplin, Flapple, Hydrapple), Arrokuda (Arrokuda, Barraskewda), Croagunk (Croagunk, Toxicroak), Deino, Dondozo, Dratini (Dragonair, Dratini), Ducklett (Ducklett, Swanna), Flabébé (Flabébé, Floette, Florges), Flamigo, Froakie (Froakie, Frogadier, Greninja), Gible (Gabite, Gible), Goomy, Growlithe (Arcanine, Growlithe), Happiny (Chansey), Illumise, Karrablast (Escavalier, Karrablast), Magikarp (Gyarados), Misdreavus, Mudkip (Marshtomp, Mudkip, Swampert), Munchlax (Munchlax, Snorlax), Shelmet (Accelgor, Shelmet), Slowpoke, Sobble (Drizzile, Inteleon, Sobble), Surskit (Masquerain, Surskit), Tadbulb (Bellibolt, Tadbulb), Tatsugiri, Teddiursa (Teddiursa, Ursaring), Volbeat, Yanma (Yanma, Yanmega)
|
||||
|
||||
## Verdant Jungle (Lv 18–30, 34 lines)
|
||||
|
||||
Aipom, Bellsprout (Bellsprout, Weepinbell), Bounsweet (Bounsweet, Steenee, Tsareena), Bulbasaur (Bulbasaur, Ivysaur), Chatot, Darumaka, Exeggcute (Exeggcute, Exeggutor), Fomantis, Glimmet, Grookey (Grookey, Thwackey), Jangmo-o, Kecleon, Litten (Litten, Torracat), Magnemite (Magnemite, Magneton), Natu (Natu, Xatu), Noibat, Nosepass, Panpour (Panpour, Simipour), Pansage (Pansage, Simisage), Pansear (Pansear, Simisear), Pikipek (Pikipek, Toucannon, Trumbeak), Porygon, Shroodle (Grafaiai, Shroodle), Slakoth (Slakoth, Vigoroth), Snivy (Servine, Snivy), Stunfisk, Tangela (Tangela, Tangrowth), Treecko (Grovyle, Treecko), Tropius, Unown, Venipede (Scolipede, Venipede, Whirlipede), Wimpod (Golisopod, Wimpod), Woobat (Swoobat, Woobat), Zubat (Golbat, Zubat)
|
||||
|
||||
## Highland Meadows (Lv 25–35, 39 lines)
|
||||
|
||||
Abra (Abra, Alakazam, Kadabra), Bouffalant, Buizel (Buizel, Floatzel), Chewtle (Chewtle, Drednaw), Cottonee (Cottonee, Whimsicott), Cyclizar, Cyndaquil (Cyndaquil, Quilava), Electrike (Electrike, Manectric), Golett, Hoppip (Hoppip, Jumpluff, Skiploom), Igglybuff (Jigglypuff, Wigglytuff), Lechonk (Lechonk, Oinkologne), Lickitung (Lickilicky, Lickitung), Mareep (Ampharos, Flaaffy, Mareep), Miltank, Mudbray (Mudbray, Mudsdale), Nymble (Lokix), Oddish (Bellossom, Gloom, Oddish, Vileplume), Pidgey (Pidgeotto, Pidgey), Poliwag (Politoed, Poliwag, Poliwhirl, Poliwrath), Ponyta, Poochyena (Mightyena), Psyduck (Golduck, Psyduck), Quaxly (Quaxly, Quaxwell), Scorbunny (Cinderace, Raboot, Scorbunny), Seviper, Sewaddle (Leavanny, Sewaddle, Swadloon), Sinistea (Polteageist, Sinistea), Spiritomb, Squirtle (Squirtle, Wartortle), Stonjourner, Tauros, Tepig (Pignite, Tepig), Tinkatink (Tinkatink, Tinkatuff), Torchic (Combusken, Torchic), Turtwig (Grotle, Torterra, Turtwig), Vulpix (Ninetales, Vulpix), Zangoose, Zorua (Zoroark, Zorua)
|
||||
|
||||
## Westmarch (Lv 15–25, 49 lines)
|
||||
|
||||
Baltoy, Bronzor, Buneary, Carbink, Corphish, Corsola, Deerling, Dewpider (Araquanid, Dewpider), Drifloon, Drilbur, Dunsparce, Eevee, Farfetch'd, Fletchling (Fletchinder, Fletchling), Gastly (Gastly, Haunter), Geodude (Geodude, Graveler), Grimer, Grubbin (Charjabug, Grubbin), Hawlucha, Heracross, Honedge, Klink, Lillipup (Herdier, Lillipup), Maschiff, Milcery (Alcremie, Milcery), Mime Jr., Nickit (Nickit, Thievul), Onix, Petilil (Lilligant, Petilil), Phantump, Pichu (Pichu, Pikachu), Pinsir, Pumpkaboo, Ralts (Kirlia, Ralts), Roggenrola (Boldore, Roggenrola), Rolycoly (Carkol, Rolycoly), Scyther, Seedot (Nuzleaf, Seedot), Shroomish (Breloom, Shroomish), Skwovet (Greedent, Skwovet), Solosis, Stunky, Tandemaus (Maushold, Tandemaus), Tentacool, Timburr (Gurdurr, Timburr), Toxel, Tynamo, Varoom, Yamper (Boltund, Yamper)
|
||||
|
||||
## Southwold (Lv 8–18, 50 lines)
|
||||
|
||||
Absol, Audino, Azurill (Azumarill, Azurill, Marill), Barboach, Bunnelby, Burmy, Chingling, Comfey, Cutiefly, Drampa, Drowzee, Druddigon, Elgyem, Espurr, Fidough, Furfrou, Glameow, Goldeen, Indeedee, Joltik, Klefki, Koffing, Lotad (Lombre, Lotad), Meowth, Minccino, Minun, Morpeko, Munna, Orthworm, Patrat, Pidove, Plusle, Purrloin, Relicanth, Sentret (Furret, Sentret), Shuppet, Sigilyph, Slugma, Snubbull, Squawkabilly, Swablu, Swirlix, Taillow, Trubbish, Venonat, Voltorb, Whismur, Yamask, Yungoos, Zigzagoon
|
||||
|
||||
## Shallows (Lv 5–20, 21 lines)
|
||||
|
||||
Alomomola, Bruxish, Carvanha, Chinchou, Clobbopus, Crabrawler, Cramorant, Finizen, Finneon, Inkay, Krabby, Luvdisc, Mareanie, Pincurchin, Pyukumuku, Qwilfish, Sandygast, Shellos, Wiglett, Wingull, Wishiwashi
|
||||
|
||||
## Deep Sea (Lv 30–50, 18 lines)
|
||||
|
||||
Binacle (Barbaracle, Binacle), Clamperl (Clamperl, Gorebyss, Huntail), Clauncher (Clauncher, Clawitzer), Dhelmise, Dreepy (Drakloak), Frillish (Frillish, Jellicent), Horsea (Horsea, Kingdra, Seadra), Lapras, Mantyke (Mantine, Mantyke), Oshawott (Dewott, Oshawott, Samurott), Popplio (Brionne, Popplio, Primarina), Remoraid (Octillery, Remoraid), Shellder (Cloyster, Shellder), Skrelp (Dragalge, Skrelp), Staryu (Starmie, Staryu), Veluza, Wailmer (Wailmer, Wailord), Wattrel (Kilowattrel)
|
||||
|
||||
## Lush Caves (Lv 12–28, 16 lines)
|
||||
|
||||
Aerodactyl, Amaura, Anorith, Archen, Carnivine, Cranidos, Ferroseed, Kabuto, Lileep, Morelull (Morelull, Shiinotic), Omanyte, Paras (Paras, Parasect), Shieldon, Shuckle, Tirtouga, Tyrunt
|
||||
|
||||
## Dripstone Depths (Lv 22–38, 5 lines)
|
||||
|
||||
Bagon (Bagon, Shelgon), Beldum (Beldum, Metang), Cleffa (Clefable, Clefairy, Cleffa), Lunatone, Solrock
|
||||
|
||||
## Deep Dark (Lv 45–60, 6 lines)
|
||||
|
||||
Duskull (Dusclops, Dusknoir), Feebas (Milotic), Greavard (Houndstone), Mimikyu, Murkrow (Honchkrow), Rookidee (Corviknight)
|
||||
|
||||
## Basalt Furnace (Lv 55–70, 9 lines)
|
||||
|
||||
Charmander (Charizard), Durant, Gligar (Gliscor), Heatmor, Houndour (Houndoom), Magby (Magmortar), Sizzlipede (Centiskorch), Torkoal, Turtonator
|
||||
Reference in new issue
Block a user