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

+4 -1
View File
@@ -531,9 +531,12 @@ class Model:
def _manual(self):
from pathlib import Path
import fnmatch
cfg = json.loads((Path(__file__).parent / "manual_sources.json").read_text())
known = self.vanilla_items | set(self.stack.ids("models/item", root="assets"))
for s in cfg["sources"]:
self.add(f"item:{s['item']}", "manual", s["how"], needs=s.get("needs", []))
for item in sorted(fnmatch.filter(known, s["pattern"])) if "pattern" in s else [s["item"]]:
self.add(f"item:{item}", "manual", s["how"], needs=s.get("needs", []))
axes = [f"item:{i}" for i in self.itags.resolve("#minecraft:axes")]
for item in sorted(self.vanilla_items | {k for k in self.stack.ids("models/item", root="assets")}):
ns, path = split_id(item)