Phase 9: safe start island, better quest book, every useful item obtainable

- Button Isle is peaceful: wild Pokémon only fight a player who hit them first
  (tuning/server.json peaceful_zones); its apricorns and coal make Poké Balls
  (4 apricorns + coal or charcoal), and the world report checks it has enough.
- Quest book: no boilerplate; each zone page says what is particular to it, and
  every zone that needs gear or a field move to be safe has its own quest. New
  page on the bigger mods (Cold Sweat, Fight or Flight, Cobblebase, breeding,
  veins, shared loot, maps and info).
- The Mire's poison stops 10 blocks below the surface.
- Player battles never cost a Pokémon (CobbleHardcoreMon config, mixins, and the
  companion mod's own permadeath).
- tools/item_audit.py: every item with a use has a source on the island; new
  sources for the gaps it found (species additions, three recipes).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
claudeandClaude Opus 5.5 committed 2026-11-10 15:04:09 +01:00
1 parent 6ace26e012
commit d29e177f9d
65 files changed
+1920 -364

No files matched your search

+14
View File
@@ -341,6 +341,20 @@ Self-tests: `every_implemented_pokemon_is_obtainable` (every implemented species
**The respawn block** (Regenerating Ore Veins' regenerator, the placeholder where a mined vein block grows back) no longer stops the player's aim, so the ore behind it can be mined; it never had collision. While sneaking the player can still target it, which is how its info opens. A mixin returns an empty outline shape (`RegeneratorBlockMixin.java`, the mod's only one, targeting the class by name). Its model and glass come from `pack/kubejs/assets/regenerating_ore_veins/`, much fainter than the stained glass it had. Self-test `regenerator_lets_the_aim_through` casts a real ray at it.
### Start island and quest pages (Adrian, 2026-11-10)
- **Button Isle is safe ground.** A player who lost everything, with no tools, armour or Pokémon, can start over there. A wild Pokémon in a peaceful zone (`tuning/server.json` → `peaceful_zones`) only fights a player who has just hit it: the hunting of weaker trainers and the anger after a failed catch don't happen there, and any other attack on a player there is cancelled (`zone/PeacefulZones.kt`). Only the surface counts: the caves under Button Isle are their own zones.
- **Button Isle makes Poké Balls.** Every Cobblemon ball needs copper, which only Southwold has. The isle has about 250 apricorns on its trees and 11,600 coal ore, so four apricorns of any colour around coal or charcoal make one Poké Ball (`recipe/poke_ball_from_coal.json`); Cobblemon's four red apricorns and a copper ingot still make four. `tools/world_report.py` fails a world with fewer than 100 apricorns or 500 coal ore there.
- **No boilerplate in the quest book.** Each zone page says what is particular to it (`about`, example `locals` that the generator checks against the zone's spawns, and a `guardian_note` on what its drops are for). What a zone needs to be safe is a quest of its own, as the Mire's waders were: Hoglin Hide armour for Sunscorch and the Basalt Furnace, Goat Fur armour for Frostpeak, Dive for the Deep Sea, Flash for the Deep Dark, Lava Plume for the Basalt Furnace. Rules that hold everywhere (guardian fights, zone levels) are said once, on the first page.
### Every item with a use is obtainable (Adrian, 2026-11-10)
The field guide already worked out what the island can provide; `tools/item_audit.py` now fails on any item without a source unless `NO_USE` gives the reason it needs none. Of 484 mod items flagged at first, most weren't gaps: Cobbreeding's 326 eggs come from breeding, and guardian drops, altar rewards, the Trainer Ditto's HM Case, the Vein Locator's recipe in the vein mod's config, filled Waterskins and Silk-Touched vein ores are given in code, so they are now in `tools/fieldguide/manual_sources.json`. Real gaps got sources (`docs/balance.md`). What stays without one: the 78 HM items Cobblemon HMs 4.x no longer uses, containers and blocks the game places itself, decoration, Kubfu's scrolls (no Kubfu in Cobblemon 1.8.4) and the Poké Puffs and Shalour Sable that Cobblemon 1.8.4 has no way to make yet.
**Player battles never cost a Pokémon** (Adrian, 2026-11-10). CobbleHardcoreMon's `trackPlayerBattles` is off in new worlds' server config, a mixin holds to it in older ones, and the companion mod's permadeath marks a Pokémon that fainted in a player battle so it stays fainted, not removed, until healed.
**The Mire's poison stays near the surface** (Adrian, 2026-11-10): `max_depth` 10 in its hazard file; leaves don't count as surface, so the mangrove canopy doesn't shelter.
### Drop chances on the JEI pages (Adrian, 2026-11-09)
The pages first showed each table's raw percentage, which isn't what a player gets. Cobblemon's `DropTable.getDrops` makes `amount` picks; in each it walks the table in order and takes the first entry that passes its percentage, so later entries are rarer than written. A count of 0 gives nothing. `tools/jei_sources.py` now works out the real chance of getting at least one, and the self-test `drop_chances_match_cobblemon` rolls Cobblemon's own code 4,000 times for every Pokémon and compares. The Pokémon in a page's corner is Cobblemon Info's own JEI ingredient, so clicking it opens that mod's pages.