action-feel · git:20260913.43ccc40 · 2026-09-13 · sha256 3d3960759f3407ef

action-feel git:20260913.43ccc40A

Immutable. This exact content never changes and is served at /api/v1/blob/3d3960759f3407ef.

---
name: action-feel
description: Use when attacks feel floaty, cancels fire illegally, hitstop freezes unrelated actors, or combat outcomes change with render rate or same-tick processing order.
---

# Action feel

Choose the project column before tuning numbers. Studio labels are examples, not rules.

| Column | Buffer | Cancel | Hitstop | Turn |
|---|---|---|---|---|
| short-special | short attack buffer | on-hit into named specials | authored per contact | snap on startup if published |
| long-cancel | longer command buffer | named on-hit/jump/ranged edges | authored rhythm/weight | optional inertia carry |
| commit-whitelist | anti-misinput buffer | named follow-ups only | authored weight | limited during commitment |
| coyote-platformer | jump buffer + coyote | only published attack/jump edges | tiny or none | published air control |

Do not combine columns implicitly. Persist the selected values in project data.

## Logical clock and phase order

Publish the logical tick rate; render FPS is never the combat clock. Engine adapters provide input, pose, contact-query and presentation hooks, but gameplay owns ordering.

A deterministic default phase is:

1. sample input into the input ring;
2. update clocks that are not frozen and resolve legal state/cancel transitions;
3. snapshot active hit/grab volumes and collect contact candidates;
4. resolve same-tick contacts using the published trade/priority rule and stable IDs;
5. apply damage, reaction, hitstop and queued launch state;
6. emit presentation events after logical results are known.

A project may choose another order, but it must publish it and regression-test same-tick cases.

Every contact carries a stable attack/hit instance identity. A target is hit at most once by one hit instance unless the move explicitly schedules separate multi-hit indices. Container iteration order must not decide who wins a trade.

Hitstop freezes only the actor clocks named by the resolved event. Input sampling, unrelated actors and the world keep running unless a different pause system explicitly owns them. Projectiles or hazards without an actor clock are not accidentally frozen because two actors touched.

## Charge and cancel ownership

Publish charge start → full → hold-cost → release → cancel. Interruption, weapon swap and focus loss must restore a legal state.

Cancels are directed edges plus windows and conditions. Motion commands are stepwise sequences with explicit timing windows, not an unordered bag of recent inputs.

## Accept

Replay the same input/contact trace at different render rates and with reversed entity iteration order. Move starts, legal cancels, contact IDs, trades, hitstop ownership and resulting states must match. Freeze A/B and verify unrelated C still advances. Record which scenarios actually ran; a timing table alone is not runtime evidence.