HOLLOWREACH — Reskillable (skill tree) notes
============================================
Mod: Reskillable Reimagined 4.7.0. Eight skills, same as RLCraft:
  attack  defense  mining  gathering  farming  building  agility  magic
JSON must stay clean — no comment keys (the mod may warn). Notes live here.

FILES
  skill_locks.json        gates EQUIPPING / USING an item   {"id":["skill:lvl"]}
  attack_skill_locks.json gates DAMAGING a creature         {"entity":["skill:lvl"]}
  craft_skill_locks.json  gates CRAFTING an item            (left empty for now)
  custom_skills.json      up to 8 extra skills (off unless enableSecondSkillPage)
  ../reskillable-common.toml   globals + skill_level_gates

THE RLCRAFT GATING (what the numbers mean)
  Tiers, from stock RLCraft's reskillable.cfg:
    iron 8   diamond 16   gold = 2 physical + magic 4   shield defense 12
    ender pearl magic 8   fishing rod UNOBTAINABLE
  We extended the metal ladder to modern items:
    chainmail 5 (defense) · turtle helmet 10 · netherite 24 · elytra agility 20
    bow attack 5 · crossbow attack 8 · trident attack 12 · ender eye magic 12
  Gold is the "magic metal": low physical requirement, but needs Magic 4 — this
  is why gold gear is early-but-special in RLCraft, not just weak iron.
  Fishing rod is locked at magic:99. maximumLevel is 32, so 99 = can never be
  USED. It stays craftable as a component (see the "Ancient Fishing Rod" rename
  in kubejs progression), exactly as RLCraft demoted it.

ATTACK LOCKS
  "You can't hurt what you're not ready to fight." Starter mobs = attack 2 so a
  fresh player can defend themselves; the ladder climbs to bosses/dragons at
  16-20. Modded apex (Ice&Fire dragons, Cataclysm bosses, Lycanite demon lords)
  are gated high AND spawn-gated by distance (see config/incontrol/spawn.json),
  so a Tier 0 player never meets them.

skill_level_gates (in reskillable-common.toml) — RLCraft prerequisite feel:
  Format  SKILL:AT_LEVEL:REQS   tokens TOTAL=<n>, <SKILL>=<n>, ADV=<id>
  Current:
    *:16:TOTAL=40   -> can't push attack/defense/mining/gathering past 16 until
                       you have 40 total skill levels (forces breadth, blocks
                       tunnelling one skill to diamond tier turn one).
    attack/defense 24:ADV=minecraft:nether/root -> can't reach netherite-tier
                       combat skill until you've entered the Nether.
  This is where the STATUS doc's idea lives: gate high tiers behind an
  advancement only earnable "out there."

THE SECOND TREE — ability tree (RLCraft's Level Up! 2 half) -> going to PMMO
  RLCraft ran TWO systems: Reskillable (gear gates, above) AND Level Up! 2
  (levelup2) — a 3-CLASS perk tree (Combat / Mining / Crafting) whose abilities
  are real mechanics: swordcrit, sworddamage, bowdraw, arrowspeed, naturalarmor,
  shieldblock, stealth/stealthdamage/stealthspeed, woodcutting, lumbering (chop
  whole trees), prospecting (see ores), stonecutting, sprintspeed, fallprotect,
  flintloot, treasurehunting, harvestbonus, cropgrowth, furnacespeed,
  furnacebonus, brewingspeed, fishbonus. Prereqs link them into trees.
  (Ground truth read from the RLCraft 2.9.3 install: config/levelup2/json/skills/.)

  Reskillable Reimagined's custom-skills page can ONLY grant attribute bonuses,
  so it cannot reproduce those mechanics. An attribute-perk placeholder page was
  tried and REMOVED (enableSecondSkillPage=false, custom_skills.json back to the
  stock swimming template).

  DECISION: the ability tree is being built with **Project MMO (PMMO)**, which
  does action-based skills + abilities + gear requirements in one mod. PMMO will
  own gear-gating too, so Reskillable is slated to be RETIRED once PMMO is
  configured — but keep Reskillable ENABLED until then so the pack is never left
  with no gear gates. The RLCraft numbers above (iron 8, diamond 16, gold 2+magic
  4, shield 12, ender pearl 8) carry straight over into PMMO's requirement JSON.

  STATUS: waiting on the PMMO jar to be installed so its real config schema can
  be read from the jar (never author PMMO configs blind). See the chat handoff.

TUNING / EXTENDING
  - Modded gear (Epic Fight, Ice&Fire armor, Apotheosis-affixed items still use
    the base item id) isn't gated yet. Run  /skills scanmod <modid>  in game to
    auto-generate a starting lock list, then hand-edit the numbers into
    skill_locks.json. That auto-list is placeholders only.
  - Too grindy? lower xpScalingMultiplier or the tier numbers.
  - XP-farm risk (design doc's #1 economy threat): if a spawner trivializes
    leveling, raise xpScalingMultiplier in the toml.
  - After editing these files, RELOAD by re-entering the world (Reskillable
    reads them on world load). Watch the log/chat for parse errors.


================================================================
P8 — THE WHOLE PACK BEHIND THE TREE  (added this pass)
================================================================
skill_locks.json is now 350 entries (was 49). The 49 hand-tuned vanilla
entries above are UNCHANGED and always win; the rest were generated by
scanning every mod jar's lang file for weapons/armour/tools and tiering
them by material keyword.

  Generated by:  scratchpad/build_p8.py   (re-runnable)
  Backups:       config/reskillable/backup_pre_p8/
                 config/reskillable-common.toml.bak_pre_p8

THE MATERIAL LADDER (checked strongest-first, so "dragonsteel" is not
caught by the "steel" rule)
  --  FREE, NO SKILL AT ALL: wood, flint, leather.
      Not a style choice — NoTreePunching means you need a FLINT KNIFE and
      FLINT AXE to get your first log, so a lock there softlocks a fresh
      world. Leather + wood round out the "you can always start" kit.
  2   bone, copper
  4   stone, chainmail
  2 + magic 4    ANY gold item  (RLCraft's "gold is the magic metal")
  8   iron, silver, steel, myrmex, scale, shark, croc
  12  black steel, obsidian, blaze, nether, troll, hippogryph, deathworm,
      centipede, emu, roadrunner, dropbear, skelewag, tendon
  16  diamond, dragonbone, myrmex royal, sea serpent, stymphalian,
      amphithere, cockatrice, ghostly, frostmaw, naga, ferrous
  24  netherite, ignitium, cursium, witherite, abyssal, void, ancient,
      infernal, DRAGONSTEEL, apex, elder, ender
  default 8 for anything unmatched

  weapons -> attack   (staffs/wands -> magic)
  armour  -> defense
  tools   -> pickaxe/drill = mining, hoe = farming, rest = gathering

TWO NEW SKILLS (custom_skills.json, needs enableSecondSkillPage = true)
  foraging  perk forge:block_reach  +0.15 per 5 levels
  alchemy   perk minecraft:generic.luck +0.25 per 5 levels
  Icons ship inside hollowreach-herbalism.jar under the reskillable
  namespace (assets/reskillable/textures/gui/custom_skills/).

  Foraging gates:  crop stake 1 · rope 3 · grape seeds 5 ·
                   apple/olive sapling 8 · ironwood sapling 12
  Alchemy gates:   crushing tub 1 · brewing barrel 5 · wine/cider 6 ·
                   brewing stand 8 · cocktail 8 · elixir 10 · mead 10 ·
                   iron wine 10 · golden juices 12 · refined cocktail 14 ·
                   chorus juice 16 (+magic 8) · enchanted golden juice 20

craft_skill_locks.json (was empty) now gates BUILDING the kit:
  crushing tub 1 · cauldron 3 · brewing barrel 5 · brewing stand 8 ·
  anvil / enchanting table (mining 12 / magic 12) · conduit 16 ·
  beacon 20 · netherite ingot 24

ENCHANTMENTS — Reskillable has no per-enchantment lock file, so the
enchanting axis is gated at the STATION instead: enchanting table needs
magic 12 to craft AND to place, anvil needs mining 12. That is the
closest honest equivalent without a new mod.

CURATED LOCKS (scratchpad/curated_locks.py) — 406 entries total
A name-regex can never catch gear with a proper name, so these were
hand-checked and added on top of the generated ladder:

  FISHING (re-enabled — it used to be magic:99 / unobtainable)
    minecraft:fishing_rod        gathering 16 + swimming 4
    iceandfire:fishing_spear     gathering 12 + swimming 2  (cruder, earlier)
    mowziesmobs:bluff_rod        gathering 16 + swimming 4
    apotheosis:fishing_tome      magic 12   (an enchanting tome, not a rod)

  UTILITY
    shears / flint_and_steel     gathering 8  (both iron-crafted)

  CATACLYSM named boss gear — 12 (athame, khopesh) · 16 (lionfish,
    coral_bardiche) · 20 (zweiender, soul_render, burning_ashes, lacrima,
    wrath_of_the_desert, bulwark_of_the_flame) · 24 (astrape, brontes,
    ceraunus, final_fractal, laser_gatling, monstrous_horn/helm,
    the_annihilator/immolator/incinerator, void_forge, infernal_forge,
    void_jaw, the two assault shoulder weapons)
    Trinkets: belt_of_beginner 4 · sticky_gloves 8 · amethyst_crab_shell +
    black_steel_targe 12 · amulets/necklace/ring/ankh/geomancer 16 ·
    skulls 20
  MOWZIE'S — blowgun/sand_rake 8 · elokosa moon paws 12 · geomancer set +
    ice_crystal 16 · sol_visage 20

  DELIBERATELY LEFT UNGATED: spawn eggs, boss "eyes"/keys, crafting
  materials (coral chunks, cores, effigies, bones), and ammo.

LYCANITES PASS (scratchpad/lycanites_locks.py) — 472 entries total
Lycanites was badly under-gated: the generator lumped EVERY mob-part
weapon at attack:8, which is nonsense for demon-lord gear. Re-tiered by
the creature the part came from:

  24  apollyonclaw, astarothclaw            (demon lords)
  16  reaperclaw, grueclaw, erepededrill(mining)
  12  cinderblade, clinkscythe, zephyrblade, raidrablade, geonachspear,
      geonachfist, ettinclub, argustail, lacedonhead
   8  ironaxehead, ironpaxel, ironpikejoint
   2+magic4  goldscepterhead                (gold is the magic metal)
  free  woodenpaxel                         (wood tier)

  SUMMONING STAVES  summoning 8 · stable/sturdy 12 · savage/blood 16

  CHARGES (throwable elemental projectiles — 36 of them)
    magic 20  doomfireball, demonicblast, chaosorb, devilstar, hellfireball,
              primeember, arcanelaserstorm, lobdarklings, lifedrain, spectralbolt
    magic 12  blizzard, bloodleech, boulderblast, crystalshard, frostweb,
              icefireball, poisonray, scorchfireball, tundra, venomshot,
              whirlwind, aetherwave, acidsplash, magma, quill
    magic  8  charge, acidglob, aquapulse, ember, faebolt, frostbolt,
              lightball, mudshot, poop, waterjet, throwingscythe

  SOULS  soulgazer 8 · equipment 12 · soulstones 12 (dragon/demon/angel 20)
         soulkey 16 · soulkey diamond/emerald 20

  MOWZIE'S  grant_suns_blessing  magic 20   (Barako's blessing is endgame)

  Left ungated: mob-part MATERIALS (afritlung, argustail drops, brains,
  eyes...), foods, and pet treats — those are ingredients, not gear.

LYCANITES RE-TIER FROM REAL STATS (scratchpad/lyc_retier.py) — 511 entries
The mob-tier guess was wrong in BOTH directions. Lycanites writes its own
equipment database to config/lycanitesmobs/equipment/*.json — every part
lists damageAmount, damageSweep, damageRange, effects, projectiles and
summons. Those numbers now drive the gate, not which boss dropped it.

  What that exposed:
    apollyonclaw    0 dmg (a strength buff)  was attack:24 -> magic:8
    ettinclub      11 dmg  (the hardest hit) was attack:12 -> attack:24
    geonachspear   10 dmg + resistance II    was attack:12 -> attack:24
    reiverhorns    10 dmg, 3 reach, proj.    WAS NOT GATED -> attack:24
    vapulacrystal   8 dmg, 180 sweep         WAS NOT GATED -> attack:24
    astarothclaw    2 dmg + wither           was attack:24 -> attack:16
  51 of 59 parts changed.

  SCORE = dmg*4 + sweep/45 + range*1.5 + knockback*1.5 + strongEffects*2.5
          + bestEffectLevel*1.5 + projectiles*3 + summons*4
  BANDS  >=45 -> 24 · >=30 -> 20 · >=22 -> 16 · >=14 -> 12 · >=8 -> 8 · else 4
  Parts that deal NO damage are ability pieces -> gated on MAGIC, not attack.
  Plain material parts keep the material ladder (wood free, iron 8,
  goldscepterhead 2+magic4) regardless of score.

  RE-RUN after a Lycanites update:  python lyc_rank.py && python lyc_retier.py

HONEST LIMIT — other mods
  Lycanites is the only gear mod here that publishes its stats as data.
  Ice&Fire, Cataclysm, Mowzie's and Alex's compile damage into bytecode
  (mixed with colour constants), so it cannot be read reliably without a
  real decompiler. Their tiers therefore follow MATERIAL/BOSS progression,
  which for those mods does track power (copper < iron/silver < dragonbone
  < dragonsteel; Cataclysm gear follows its boss order). If exact numbers
  are wanted there, install CFR/Fernflower and redo the same exercise.

DECOMPILED STAT PASS (scratchpad/retier_all.py) — 625 entries
CFR 0.152 was used to decompile Ice&Fire, Cataclysm, Mowzie's, Alex's Mobs,
Epic Fight and NoTreePunching. 171 weapons and 203 armour pieces now carry
requirements derived from their REAL numbers, not from guesswork.

  What the numbers showed (total attack damage attribute):
    dragonsteel axe        30.0   <- ForgeTier(4, 8000, 10.0f, 21.0f, 10)
    dragonsteel sword      25.0       i.e. +21 attack bonus vs netherite's +4
    troll weapons / dread  17.0
    ceraunus, nth greatsw. 16.0
    dragonbone sword        9.5
    netherite sword (van.)  8.0
    silver sword            5.0
  A dragonsteel sword is over 3x a netherite sword. They had been sharing a
  gate at 24; the ladder now runs to the 32 cap for that class.

  DAMAGE -> LEVEL (calibrated on the vanilla anchors)
    <=4 free · 5 -> 4 · 6 -> 8 · 7 -> 16 · 8 -> 24
    9-11 -> 26 · 12-16 -> 28 · 17-24 -> 30 · 25+ -> 32
    +2 levels if the item has a real ability (AoE, projectile, lifesteal,
    shield-disable, freeze, wither, summon, bonus-vs-type).

  MATERIAL FLOOR *and* CEILING — both matter:
    ceiling  Epic Fight's stone greatsword deals 13 but is craftable on day
             one; without a ceiling it landed at 30. Now attack:8.
    floor    a dragonsteel hoe barely swings, but it is still dragonsteel;
             without a floor it came out FREE. Now farming:28.
    bands  dragonsteel/ignitium 28-32 · netherite 24-28 · diamond/dragonbone
           16-24 · black_steel/myrmex/troll 12-20 · iron/silver 8-16 ·
           stone/copper 4-8 · wood/flint/leather 0
    NOTE the early patterns are ANCHORED (^leather_, ^flint) so that
    "forest_troll_leather_helmet" is not mistaken for vanilla leather.

  TOOLS are gated by MATERIAL, not damage — a pickaxe's worth is its harvest
  tier, not its swing. RANGED weapons (bows, gatlings, blowguns) carry no
  melee stat and are floored at 8 rather than treated as harmless.
  GOLD is never free; it always keeps the 2 + magic:4 exception.

  Hand-curated entries now only FILL GAPS — real stats win wherever we have
  them. A short OVERRIDE list keeps judgement calls the numbers cannot make
  (Sun's Blessing is magic, not armour; the fishing line; station gates).

  RE-RUN after mod updates:
    Workflow gear-stat-extraction -> scratchpad/gear_stats.json
    python retier_all.py
