Docs: melee feel forks 1-6 implementation log + guidelines fork table marked shipped

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-20 20:53:08 -07:00
parent 7081869306
commit 2c187a17a9
2 changed files with 70 additions and 6 deletions
@@ -0,0 +1,62 @@
# 2026-07-20 (B) — Melee feel forks 16 implemented (guidelines G2/G5/G7)
**Operator approved forks 16** of [[Combat_Attack_Feel_Guidelines]]. Feature-track netcode slice → ★ pre-code
adversarial review (`wf_000bc247`, 3 lenses + per-finding refutation critics: **19 confirmed / 5 refuted**), then
serial implementation of the review-hardened plan.
## What shipped
**Fork 1 — damage at the contact tick (G2.1).** The server cleave now resolves when the blade LANDS, not at the
swing press: `MeleeCleavePending` (server-only, baked zeroed on the player) is the AttackWindup schedule-and-consume
idiom — stamped `SwingStartTick + MeleeTiming.ContactTicks(step, knob)`, fired on a wrap-safe elapsed compare
(tick-batch-proof), consumed by zeroing, **flushed early if a chained swing would overwrite it** (review C0/C12: no
knob combination can lose a cleave). Payload builds from LIVE state at fire time (`BuildCleave`) — the cast-turn
steers the cone until contact. Per-step contacts: 16/10/20t (base knob `MeleeContactTicks` 16, **0 = legacy
immediate** — the sentinel the mechanics tests pin).
- Review kills incorporated: the original hashmap latch design (throws on first swing C2/C5; loses chained cleaves
C0/C3) was replaced wholesale by the entity-local idiom (C11).
**Fork 2 — reach honesty (G2.2).** `MeleeRange` 2.6 → **2.2 m**; new `MeleeFinisherRangeMult` (**1.25**, knob 30)
scales finisher REACH only — `MeleeFinisherMult` (1.5) keeps damage/recover/knockback. Arcs (local + remote) use it.
**Fork 3 — weapon + smear (G2.3).** Axe rebaked at **×1.25**; a **blade-smear ribbon** (thin elevated band riding
the arc's leading edge, `BuildSlashInto` angular-window mode — review C18: one shared builder) plus the ground arc
whose **sweep-reveal now completes AT the live contact tick** (life derives from the knob per step — review C13;
remote arcs too).
**Fork 4 — impact ladder (G5), vibrate CUT.** `TryHold(frames)` parameterized (review C17: one hold path);
finisher-connect holds `FeelConfig.FinisherHoldFrames` (5). **Victim-vibrate was cut**: review C8 verified Rukhanka
folds the SMR render child's `LocalTransform` INVERSE into the skin matrices — offsetting it does nothing on
skinned enemies. Follow-up channel: an additive anim layer or bone-space offset.
**Fork 5 — input buffer (G7).** `[GhostField] MeleeCombo.BufferedAttackTick` (predicted, rollback-restored —
review C9 verified sound): a press in the lock's last `MeleeBufferTicks` (8, knob 29, 0 = off) fires the chain at
unlock. **Validity anchors to the UNLOCK edge with `MeleeTiming.BatchSlackTicks` (4)** — press-anchored validity
drops edge presses under the server's default tick-batch of 4 (review C1).
**Fork 6 — the Bathynaut commits (G7).** DashSystem refuses a dash start while a swing is PRE-contact
(`TickWindowMath.SwingActive` over the contact window — review C15 reuse); post-contact recovery dash-cancel stays.
Implemented as a **ComponentLookup, not a query add** — a query add would have silently emptied three existing
dash test suites (review C4).
**Connect-cue honesty (review C14):** the client's melee connect package (bite burst/thunk/FOV kick/rumble/finisher
hold/arc brighten) moved from the swing edge to the **contact tick** (`EvaluateMeleeConnect`, aim recomputed live).
## Validation
- L1 console error-free. **L2: 414/414** (411 legacy through the pins + 3 new: contact-tick-exactly-once,
buffered-chain-at-unlock, dash-law pre/post-contact).
- **Live server proof** (guardian sampling, injected real attack): SwingStartTick 5968 → pending stamped **5984
(= +16)** → enemy HP 200 → 164 **exactly at tick 5984**, pending consumed same tick, no refire; damage 36 = base
30 × the Warrior melee seed (live stat folding at resolve ✔). Under observed tick-batching (~4/frame).
- L3 captures: ×1.25 axe reads; arc + smear track the sweep. Smear re-toned post-capture (thinner band 0.25 rad,
innerFrac 0.7, alpha 0.7) — reads as a streak, not a pane; operator eyes-on will fine-tune.
## Wire/bake churn (accepted)
`BufferedAttackTick` GhostField + 3 `DebugTuningReport` fields = ghost + RpcCollection hash change (dev peers
rebuild together, MPPM same-build); `MeleeCleavePending` baked on Player.prefab (non-replicated); knobs 2931
(Count 32); pinned-legacy contract in `MeleeComboTests` (contact 0 / buffer 0 / finRange 1.8).
**Next:** operator eyes/ears-on — cadence (`MeleeContactTicks`/`MeleeRecoverTicks`/`MeleeBufferTicks` knobs),
smear look, finisher hold weight. DebugOverlay rows for the 3 new knobs = a 5-minute add on request.