git:20260912.f425bd3 to git:20260912.aeb2977

16 added, 34 removed. Audit A to A.

---
name: hitbox-hurtbox
- description: >
- Engine-neutral strike and receive volumes. Use when hits miss the eye,
- when the mesh is the collider, or when a cinematic frame has a secret
- box. Stacks on action-feel. Ask the column first.
+ description: Attack boxes and vulnerable boxes are data on the move, not the mesh. Ask 2d-boxes vs 3d-capsules vs projectile-volume. query_hits reads these. Use when the user talks about 判定盒, clash, or trade.
---
- # Hitbox / hurtbox
-
- Ask the column.
-
- | Column | Strike volume | Receive volume |
- |---|---|---|
- | sprite-box | 2D boxes on frames | 2D boxes on frames |
- | capsule-3d | capsules / spheres per limb | body capsule + head |
- | melee-arc | swept volume this frame | same receive |
- | projectile-orb | small sphere + lifetime | same receive |
- | grab-range | throw box, not strike | throw-hurt distinct |
-
- Render mesh is never the combat collider.
-
- ## Clock
-
- Boxes exist on the **logic tick**. A strike box is on for N frames published in the move row.
- Hitstop freezes both actors' boxes; it does not spawn a new box on a render frame.
- Clash / trade: if two strike boxes overlap and both hurtboxes are valid, both hit, unless the column is single-winner (first tick wins).
+ # Hitbox and hurtbox
- ## Readability
+ Ask the column:
- - Active frames that kill must be visible as motion, not only as a box in debug.
- - Debug draw is a develop toggle. Players see silhouette and juice, not the box.
- - Whiff: strike on, hurtbox of target not overlapped. Cancel rules live in combo-design.
- - Grab box is a different color in debug and a different job in kb-mouse-map. It does not hit-confirm into a punch.
+ | Column | Shape |
+ |---|---|
+ | 2d-boxes | AABB / OBB on a plane |
+ | 3d-capsules | body + limb capsules |
+ | projectile-volume | spawned volume with lifetime |
- ## Iron rules
+ ## Rules
- - No unseen box on a cinematic freeze unless boss-design published the freeze.
- - Hurtbox may shrink on dodge / block. It may not vanish for 20 frames without a pose.
- - Projectiles inherit the same clock. They do not hit on interpolation frames only.
- - Throw invuln and strike invuln are separate flags.
+ 1. Boxes live on move frames. A pretty mesh is not a hit.
+ 2. Active frames publish a box. Recovery has no box unless the data says so.
+ 3. Throw / grab is a different box class, not a bigger punch.
+ 4. Clash / trade is a column. Default: both hurtboxes can be hit the same frame.
+ 5. query_hits runs on the logic step. Render interpolation must not widen a box.
## Accept
- A poke that looks short is short. A spectator can tell a whiff from a hit without the debug overlay. A grab does not connect from a punch box.
+ - Turning off meshes still lets two actors trade
+ - A 2-hit confirm uses the published boxes, not magnet