HOLLOWREACH — spawn.json notes
==============================
In Control REJECTS unknown keys (it prints "Invalid keywords for spawn.json:
..." in chat and drops the rule). JSON has no comments and __comment is not a
valid key, so ALL documentation lives here, never in spawn.json.

SCHEMA (verified by decompiling incontrol-1.20-9.4.6.jar -> RuleKeys.class):
  The key is  mob  (SINGULAR), not "mobs". "mobs" is invalid and was the bug
  that made every rule fail. `mob` accepts one id or a list of ids.
  Valid keys include: mob, mod, result, minspawndist, maxspawndist (distance
  from WORLD SPAWN), mindist, maxdist (from player), dimension, biome,
  biometags, structure, minlight, maxlight, mintime, maxtime, mindifficulty,
  maxdifficulty, hostile, passive, baby, mincount, maxcount, seesky, cave,
  weather, random, spawner, plus per-mob action keys (healthmultiply, etc.).
  result = allow | deny | default.

EVALUATION: rules run top-to-bottom, FIRST MATCH WINS, then evaluation stops.
Every mob below appears in exactly ONE rule so ordering never conflicts.

THE GRADIENT (radii from the design doc):
  Tier 0 "The Hollow"  0-1500    world kills you, monsters don't
  Tier 1 "The Verge"   1500-5000 Lycanite's begins, dragons appear
  Tier 2 "The Reach"   5000+      full bestiary, apex demons, arenas

  Rule 1  Lycanite's APEX demons      deny < 5000  (Tier 2+ only)
  Rule 2  Ice&Fire APEX megafauna     deny < 5000  (Tier 2+ only)
  Rule 3  Cataclysm hostiles + bosses deny < 5000  (Tier 2+ only)
  Rule 4  Ice&Fire dragons/megafauna  deny < 1500  (Tier 1+ only)
  Rule 5  Lycanite's mid-tier         deny < 1500  (Tier 1+ only)

  Everything NOT listed (Lycanite's low-tier, vanilla, Alex's, Mowzie's, small
  Ice&Fire) still spawns at Tier 0. Tier 0 is LESS dangerous, never SAFE — that
  was the fix for the "boring start" playtest.

IDS: all verified against the installed jars' lang/creature files, NOT guessed.
  Ice&Fire uses underscores: fire_dragon, ice_dragon, lightning_dragon (the old
  file's "firedragon" without an underscore silently never matched).
  Lycanite's bosses in 0.1.0-alpha are enabled for natural spawn (unlike classic
  altar-summon), which is exactly why Rule 1 exists.

TUNING:
  - Too dangerous at spawn -> move a mob from Rule 5 up into Rule 1/2/3, or add
    it to a new deny rule with a bigger maxspawndist.
  - Cataclysm mobs are mostly placed by their STRUCTURES, not natural spawn;
    to keep an arena out of Tier 0 you also need its structure spacing/biome
    config, not just this file.
  - After editing: /reload does NOT reload In Control. Use  /incontrol reload
    then check chat for "Invalid keywords" errors.

================================================================
DISTANCE GATING REMOVED (2026-08-05) — deliberate design change
================================================================
spawn.json is now empty. Nothing is denied by distance; dragons,
Cataclysm bosses and Lycanites demon lords can spawn anywhere the
game would otherwise put them.

WHY: the pack's danger is meant to be unconditional — "no caps, it's
what makes it exciting". This also matches the source material:
RLCraft's own config/incontrol/spawn.json contains ZERO rules, and
its potentialspawn.json is empty too. RLCraft never gated by distance;
a dragon over your starter hut on night three is part of its identity.

This pairs with Scaling Health being held flat (see
kubejs/data/scalinghealth/sh_mechanics/). Neither system now escalates
with distance or time. Danger comes from the bestiary itself and from
the survival tax (no natural regen, thirst, temperature, First Aid
limb damage), not from hidden multipliers.

The old gradient is preserved at spawn.json.distance_gradient_backup
(5 rules: apex/bosses denied within 5000, dragons+megafauna within
1500). Restore by copying it back over spawn.json if the pack ever
wants a safer starting radius again.
