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:
@@ -0,0 +1,62 @@
|
||||
# 2026-07-20 (B) — Melee feel forks 1–6 implemented (guidelines G2/G5/G7)
|
||||
|
||||
**Operator approved forks 1–6** 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 29–31
|
||||
(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.
|
||||
Reference in New Issue
Block a user