{
 "note": "Authoritative reaction + state contract. The server decides reactions from (hit impact, special, target weight, poise). Clients only play the matching animation/VFX/SFX. Numbers are proposed tuning.",
 "impactClasses": [
  {
   "id": "light",
   "value": 1,
   "poiseDamage": 6,
   "hitstopMs": 35,
   "shake": 0.05,
   "examples": "daggers, claws, wand bolts, basic chain hits 1–2"
  },
  {
   "id": "medium",
   "value": 2,
   "poiseDamage": 14,
   "hitstopMs": 55,
   "shake": 0.12,
   "examples": "sword/glaive skills, arrows, chain finishers"
  },
  {
   "id": "heavy",
   "value": 3,
   "poiseDamage": 28,
   "hitstopMs": 80,
   "shake": 0.25,
   "examples": "greataxe / greatsword / hammer skills, charged shots"
  },
  {
   "id": "massive",
   "value": 4,
   "poiseDamage": 50,
   "hitstopMs": 110,
   "shake": 0.45,
   "examples": "signature finishers, leaps, boss slams"
  }
 ],
 "weightClasses": [
  {
   "id": "small",
   "value": 1,
   "poise": 30,
   "examples": "Dewhorn Hare, Reed Fox, Siltspit Gecko, Bellwhisker Jerboa",
   "displacement": "full"
  },
  {
   "id": "medium",
   "value": 2,
   "poise": 60,
   "examples": "Marsh Wolf, Duneplate Beetle, Duskfang Hyena, bandits, players",
   "displacement": "full (players: none)"
  },
  {
   "id": "large",
   "value": 3,
   "poise": 120,
   "examples": "Brineback Tortoise, Jadecrest Monitor, Kilnback Scarab, all elites (+1 class)",
   "displacement": "half distance, no launch"
  },
  {
   "id": "boss",
   "value": 4,
   "poise": 400,
   "examples": "Bellbound Regent, Kharuun",
   "displacement": "none — converts to break pressure"
  }
 ],
 "reactionRule": [
  "delta = impact.value − weight.value",
  "delta ≤ −1 → no animation, hit flash + impact VFX only (bosses always at least flash)",
  "delta = 0 → flinch_light (additive, directional)",
  "delta = 1 → flinch_heavy",
  "delta ≥ 2 → stagger (interrupts the target's interruptible windup)",
  "Poise: each hit subtracts poiseDamage; reaching 0 forces stagger regardless of delta, then poise refills over 3 s",
  "Specials (knockback / knockdown / launch / pull / stun / sleep) apply only if the target class allows them (see each reaction's allowedOn); otherwise they convert to stagger (elites) or break pressure (bosses)",
  "Players never receive displacement from other players (no PvP in MVP); monsters may apply knockdown/stun to players only when listed in that monster's ability"
 ],
 "reactions": [
  {
   "id": "flinch_light",
   "label": "Light flinch",
   "durationS": 0.2,
   "interrupts": false,
   "allowedOn": [
    "small",
    "medium",
    "large"
   ],
   "anim": "Additive upper-body recoil, 4 directions (front/back/left/right) chosen from hit direction; never stops legs.",
   "vfx": "Small spark/blood-dust puff at contact point, 6 frames.",
   "sfx": "Light flesh/carapace tick layered on weapon swish."
  },
  {
   "id": "flinch_heavy",
   "label": "Heavy flinch",
   "durationS": 0.4,
   "interrupts": false,
   "allowedOn": [
    "small",
    "medium",
    "large"
   ],
   "anim": "Full-body jolt, 0.3 m cosmetic step back along hit vector, head snap; 4 directions.",
   "vfx": "Medium impact burst + 2–4 debris chips (material-based).",
   "sfx": "Thud + material layer + target grunt/screech (pitch-randomized ±6%)."
  },
  {
   "id": "stagger",
   "label": "Stagger",
   "durationS": 0.8,
   "interrupts": true,
   "allowedOn": [
    "small",
    "medium",
    "large"
   ],
   "anim": "Stumble back 2 steps, arms/limbs flail, recovers into guard. Large: rear/rock back on legs.",
   "vfx": "Shock ring at feet + dust; white rim flash 60 ms on the target material.",
   "sfx": "Heavy impact sweetener + low boom; target pained call."
  },
  {
   "id": "knockback",
   "label": "Knockback",
   "durationS": 0.6,
   "distanceM": [
    1.5,
    3
   ],
   "interrupts": true,
   "allowedOn": [
    "small",
    "medium",
    "large(half)"
   ],
   "anim": "Driven backwards in a slide with feet dragging, ends crouched. Server moves capsule along a swept path; stops at walls.",
   "vfx": "Dust trail decals along slide path, debris kick-up.",
   "sfx": "Whoosh + ground scrape loop sized to distance."
  },
  {
   "id": "knockdown",
   "label": "Knockdown",
   "durationS": 1.2,
   "interrupts": true,
   "allowedOn": [
    "small",
    "medium"
   ],
   "anim": "Fall to side/back in place, 0.5 s down, scramble up. Quadrupeds roll on side; insects flip on back and right themselves.",
   "vfx": "Ground impact dust ring, small crack decal.",
   "sfx": "Body-fall thud by weight + scramble foley."
  },
  {
   "id": "launch",
   "label": "Launch (airborne)",
   "durationS": 0.9,
   "heightM": 1.2,
   "interrupts": true,
   "allowedOn": [
    "small",
    "medium"
   ],
   "anim": "Popped upward with body spin, apex hang 0.15 s, falls into knockdown get-up. Can be juggled once by another launch within the window (max 2 launches per 4 s).",
   "vfx": "Upward streak at launch, landing dust burst.",
   "sfx": "Upward whoosh + landing thud."
  },
  {
   "id": "pull",
   "label": "Pull",
   "durationS": 0.5,
   "distanceM": [
    2,
    4
   ],
   "interrupts": true,
   "allowedOn": [
    "small",
    "medium"
   ],
   "anim": "Yanked toward source, feet skidding, ends off-balance (counts as flinch_heavy on arrival).",
   "vfx": "Tether/vortex ribbon from source to target.",
   "sfx": "Chain/wind tension rising to snap."
  },
  {
   "id": "stun",
   "label": "Stun",
   "durationS": 1,
   "interrupts": true,
   "allowedOn": [
    "small",
    "medium",
    "large"
   ],
   "anim": "Dazed sway loop with drooped head; large monsters sag on legs.",
   "vfx": "Orbiting bronze bell-glyphs above head.",
   "sfx": "Ringing tinnitus tone (ducked under combat mix)."
  },
  {
   "id": "sleep",
   "label": "Sleep",
   "durationS": 2.5,
   "interrupts": true,
   "allowedOn": [
    "small",
    "medium",
    "large"
   ],
   "anim": "Slumps / curls; breathing loop. Any later positive damage wakes (wake anim 0.3 s).",
   "vfx": "Drifting dune-blue motes + soft 'Zz' glyphs.",
   "sfx": "Low hum; wake = sharp inhale."
  },
  {
   "id": "root",
   "label": "Root",
   "durationS": 1.5,
   "interrupts": false,
   "allowedOn": [
    "small",
    "medium",
    "large"
   ],
   "anim": "Legs locked, upper body struggles (can still attack in place).",
   "vfx": "Binding ground glyph / sparks around feet.",
   "sfx": "Crackle loop."
  }
 ],
 "ailments": [
  {
   "id": "bleed",
   "element": "physical",
   "kind": "dot",
   "durationS": 4,
   "rule": "Deals 70% of the triggering hit as physical over 4 s. Max 3 stacks; reapplying refreshes the oldest.",
   "visual": "Dark-red drip particles (low-gore, no dismemberment); blood-dust puffs.",
   "anim": "None (ambient)."
  },
  {
   "id": "burn",
   "element": "fire",
   "kind": "dot",
   "durationS": 4,
   "rule": "Deals 80% of the triggering fire hit over 4 s. Strongest instance only.",
   "visual": "Ember flicker + heat-haze on body; ground scorch on death.",
   "anim": "Additive pat/flail layer every 1.5 s."
  },
  {
   "id": "chill",
   "element": "cold",
   "kind": "slow",
   "durationS": 2.5,
   "rule": "15–30% action + move slow by hit size. No freeze baseline.",
   "visual": "Frost rim shader + breath vapour; animation playback × (1 − slow).",
   "anim": "Global playback slowdown, stiff idle."
  },
  {
   "id": "shock",
   "element": "lightning",
   "kind": "vulnerability",
   "durationS": 3,
   "rule": "Target takes 10–20% increased damage by hit size. Strongest instance only.",
   "visual": "Jagged arc crawl + periodic micro-twitch.",
   "anim": "Additive 0.08 s twitch every 0.6 s."
  },
  {
   "id": "slow",
   "element": "none",
   "kind": "slow",
   "durationS": 2,
   "rule": "Generic movement/action slow from skills (strength listed on the skill, default 20–30%). Does not stack with itself; strongest applies. Separate from chill for payoffs.",
   "visual": "Sand-coloured drag streaks at the feet.",
   "anim": "Playback × (1 − slow) on locomotion only."
  },
  {
   "id": "exposed",
   "element": "physical",
   "kind": "armour_break",
   "durationS": 5,
   "rule": "−15% armour; refreshes.",
   "visual": "Cracked-armour decal glints on target.",
   "anim": "None."
  },
  {
   "id": "marked",
   "element": "none",
   "kind": "mark",
   "durationS": 12,
   "rule": "Hunter's Mark: +15% damage taken from the marker (+8% from party).",
   "visual": "Bronze crosshair glyph above target, visible to party.",
   "anim": "None."
  }
 ],
 "resolve": {
  "rule": "After any hard control (stun, sleep, knockdown, launch) ends, target gains Resolve: immune to new hard control for 2 s (normal), 4 s (elite), 6 s (player). Displacement during Resolve converts to flinch_heavy.",
  "boss": "Bosses are immune to hard control; eligible hits add break pressure. 100 pressure → 1.0 s partial break (≤0.4 s interrupt) and 8 s break lock."
 },
 "deathStyles": [
  {
   "id": "collapse",
   "when": "default",
   "anim": "Knees buckle / legs fold, settle; fade after 6 s.",
   "vfx": "Dust puff on settle."
  },
  {
   "id": "blown_back",
   "when": "killed by heavy/massive or knockback",
   "anim": "Thrown 2–4 m along hit vector, tumbling; settles.",
   "vfx": "Dust trail + landing burst."
  },
  {
   "id": "launched",
   "when": "killed while airborne",
   "anim": "Spins up, falls limp, bounces once.",
   "vfx": "Landing burst."
  },
  {
   "id": "ash",
   "when": "killed by fire hit or while burning",
   "anim": "Collapses while dissolving into embers (dissolve shader 1.2 s).",
   "vfx": "Ember swirl, scorch decal."
  },
  {
   "id": "shatter",
   "when": "killed by cold hit while chilled ≥ 25%",
   "anim": "Freezes mid-pose 0.3 s then breaks into ice shards (non-gory).",
   "vfx": "Ice shard burst + frost decal."
  },
  {
   "id": "charred",
   "when": "killed by lightning while shocked",
   "anim": "Rigid convulse, topples stiffly, smoking.",
   "vfx": "Arc flash + smoke wisps."
  },
  {
   "id": "sliced",
   "when": "killed by bleed finisher or signature blade skill",
   "anim": "Staggers and drops in two-beat fall (no dismemberment).",
   "vfx": "Bright slash streak lingering 0.2 s."
  }
 ],
 "monsterReactionSets": [
  {
   "id": "small_quadruped",
   "members": [
    "dewhorn_hare",
    "reed_fox",
    "bellwhisker_jerboa"
   ],
   "clips": [
    "flinch_light×4",
    "flinch_heavy×2",
    "stagger",
    "knockback",
    "knockdown(roll)",
    "launch",
    "pull",
    "stun",
    "sleep",
    "death×4"
   ]
  },
  {
   "id": "medium_quadruped",
   "members": [
    "orchard_boar",
    "marsh_wolf",
    "duskfang_hyena",
    "stormquill_stalker",
    "ashroot_pangolin"
   ],
   "clips": [
    "flinch_light×4",
    "flinch_heavy×2",
    "stagger",
    "knockback",
    "knockdown(roll)",
    "launch",
    "pull",
    "stun",
    "sleep",
    "death×4"
   ]
  },
  {
   "id": "insectoid",
   "members": [
    "duneplate_beetle",
    "clayclaw_scorpion",
    "kilnback_scarab",
    "basaltsting_scorpion"
   ],
   "clips": [
    "flinch_light×2",
    "flinch_heavy×2",
    "stagger",
    "knockback",
    "knockdown(flip)",
    "launch",
    "stun",
    "sleep",
    "death×3"
   ]
  },
  {
   "id": "reptile",
   "members": [
    "reedscale_lizard",
    "siltspit_gecko",
    "emberhorn_viper",
    "jadecrest_monitor",
    "brineback_tortoise"
   ],
   "clips": [
    "flinch_light×2",
    "flinch_heavy×2",
    "stagger",
    "knockback",
    "knockdown",
    "launch(small only)",
    "stun",
    "sleep",
    "death×3"
   ]
  },
  {
   "id": "bird",
   "members": [
    "stormwing_kestrel"
   ],
   "clips": [
    "flinch_light×2",
    "flinch_heavy",
    "stagger(airborne wobble)",
    "knockback",
    "knockdown(grounded)",
    "stun",
    "sleep",
    "death×2"
   ]
  },
  {
   "id": "humanoid",
   "members": [
    "saltway_bandit",
    "ashroad_raider",
    "players",
    "npcs"
   ],
   "clips": [
    "flinch_light×4",
    "flinch_heavy×4",
    "stagger",
    "knockback",
    "knockdown",
    "launch",
    "pull",
    "stun",
    "sleep",
    "death×5"
   ]
  },
  {
   "id": "boss_tortoise",
   "members": [
    "bellbound_regent"
   ],
   "clips": [
    "hit_flash only",
    "break_partial",
    "break_full(shell slam)",
    "death"
   ]
  },
  {
   "id": "boss_beast",
   "members": [
    "kharuun"
   ],
   "clips": [
    "hit_flash only",
    "break_partial",
    "break_full(kneel)",
    "death"
   ]
  }
 ],
 "conditions": [
  {
   "id": "low_life",
   "name": "Wounded",
   "text": "Target is below 30% of maximum life (bosses: below 30% of the current phase).",
   "ui": "Red pulse on the target frame"
  }
 ]
}
