Guide
Game coyote time and jump grace leniency systems explained
Harbor Peaks' precision gauntlet chapter measured “edge jump success” on its first vertical shaft: players who pressed jump within three frames of leaving a ledge succeeded only 41% of the time. Playtesters blamed “tight hitboxes” and asked for wider platforms. Telemetry showed the opposite — most failures happened when jump input arrived before the character left the ground (early press) or one frame after ground contact ended (late press). The collision was correct; human reaction and display latency were not aligned with a single-frame grounded check.
The team added two timers: coyote time (a short post-ledge window where jump still counts as grounded) and a jump buffer (queue jump input before landing). Edge-jump success rose to 78% with unchanged geometry. Optional-path completion in the same chapter climbed from 32% to 71% when combined with one-way platform routing. This guide covers coyote and buffer semantics, ground-probe coupling, tuning bands by genre, interactions with aerial verbs, networked determinism, the Harbor Peaks refactor, a technique decision table, pitfalls, and a production checklist. It pairs with general input buffering and jump arc physics.
Coyote time vs jump buffer vs action buffer
These three leniency systems are often conflated in design docs. They solve different timing mismatches:
| System | When input happens | What it fixes | Typical window |
|---|---|---|---|
| Coyote time | Jump pressed after leaving ground | Late reaction at ledge edge; animation already in fall state | 80–150 ms (5–9 frames at 60 fps) |
| Jump buffer (jump grace) | Jump pressed before landing | Early mash before ground contact; rhythm jumps onto moving platforms | 100–200 ms |
| Action buffer (general queue) | Any action pressed during recovery or wrong state | Combat links, dodge on wake-up, special-move plinks | Per-action; often 3–12 frames |
Coyote time is named after the cartoon trope: the character runs off a cliff, hangs in the air, then falls. Jump buffer is sometimes called “jump grace” or “jump input memory.” General action buffers can include jump, but platformers usually implement jump buffer as a dedicated path because jump has unique ground/air state rules and consumes the buffer on first valid grounded frame.
Ground detection and the coyote timer
Coyote time starts when the character transitions from grounded to airborne without an intentional jump. Implementation details matter:
Ground probes vs collision callbacks
Raycasts or overlap shapes below the feet (often slightly wider than the collider)
detect ground one frame before the physics engine reports separation. When the probe
misses for the first frame, start coyoteTimer = COYOTE_DURATION and
decrement each update. If jump is pressed while coyoteTimer > 0,
execute a grounded jump (full height, correct animation) and zero the timer.
What should reset coyote time
- Walking off a ledge — start coyote timer (classic case).
- Intentional jump — do not start coyote; player already used aerial budget.
- Knockback / hitstun launch — usually disable coyote; otherwise players double-jump out of hit reactions unfairly.
- Drop-through input — disable coyote for that fall; see drop-through systems.
- Wall slide / wall cling — optional wall coyote variant; separate timer from ledge coyote.
- Re-touching ground — reset coyote and refresh jump count per your double-jump rules.
Coyote time applies to the first jump only after leaving ground without jumping. If the player already jumped, coyote is irrelevant until they land again.
Jump buffer implementation
On jump press while airborne (and not in coyote window), set
jumpBufferTimer = BUFFER_DURATION. Each frame while airborne, decrement.
On the frame ground contact becomes true, if jumpBufferTimer > 0,
fire jump immediately — typically on the same frame as landing, before walk
animation blends in.
Buffer consumption rules
- Single consume — one buffered jump per press; holding jump should not queue infinite hops on landing unless that is an explicit design (charge jumps use different logic).
- Priority vs coyote — if both timers active on landing, execute one jump, not two.
- Buffer during jump squat — if jump has startup frames, decide whether buffer extends into squat or only applies from freefall.
- Moving platforms — buffer greatly improves feel when landing on elevators; parent velocity before jump impulse.
For variable-height jumps, buffer should respect the same hold-to-apex rules as immediate jumps — record press time on buffer consume, not on original input, or carry held-state through the buffer window.
Tuning windows by genre and difficulty
Windows are feel knobs, not cheat codes. Too much leniency makes jumps feel mushy and breaks challenge gauntlets; too little reads as input lag or broken collision.
| Genre / mode | Coyote (ms) | Jump buffer (ms) | Notes |
|---|---|---|---|
| Tight precision platformer | 80–100 | 100–120 | Celeste-style; assist modes can add +50 ms each |
| Adventure / action platformer | 100–130 | 120–180 | Default commercial feel band |
| Fighting-game movement | 0–50 | 50–100 | Often coyote disabled; jump buffer only for super-jump links |
| Mobile touch | +20–40 vs desktop | +20–40 | Fat-finger timing and variable frame pacing |
| Accessibility assist tier | 150–200 | 180–250 | Expose as slider; log usage for balance |
Measure in milliseconds internally, convert to frames at your simulation rate. Fixed-timestep games should decrement timers in fixed update so coyote duration stays consistent across frame rates.
Interactions with other movement systems
Coyote and buffer sit at the boundary between grounded and aerial state machines. Downstream systems must agree on what “grounded jump” means:
- Double jump — coyote jump counts as the first aerial jump; refresh air jumps on true landing. See double jump systems.
- Variable jump height — coyote jumps use the same gravity curve as normal jumps; cut jump short on button release.
- Fast fall — do not cancel coyote timer early unless design requires it; some games reset coyote on fast-fall press.
- Wall jump — separate wall-jump buffer from ground jump buffer to avoid accidental wall kicks when landing near corners.
- Dash / air dash — clarify whether buffered jump after dash landing consumes buffer or dash takes priority.
Document state precedence in a single table shared by gameplay programmers and animators. Ambiguity here produces bugs that QA describes as “sometimes my jump doesn't work.”
Networking and rollback
Coyote and buffer timers are input-side state and must be deterministic in
rollback netcode. Store timer decrements in fixed steps, seed from the same input
history used for
rollback resimulation.
Do not use wall-clock Time.deltaTime in networked modes unless all
peers share the same fixed timestep.
For client-authoritative casual platformers, coyote leniency on the local player only is acceptable; do not widen timers for remote ghosts or replays or leaderboard validation will disagree with live feel.
Harbor Peaks: edge jumps without wider ledges
Before the refactor, Harbor Peaks used a strict isGrounded bool from
physics contacts with no leniency. Failure modes from 2,400 logged attempts on
the Wind Shrine shaft:
- 52% of failures: jump input 1–3 frames before ground contact on the next platform (buffer would fix).
- 38%: jump 1–2 frames after leaving the departure ledge (coyote would fix).
- 10%: genuine mis-timing or wrong line (skill failures).
Patch settings: coyote 6 frames (100 ms at 60 fps), jump buffer 7 frames (117 ms), both disabled during dash and drop-through. Edge-jump success 41% → 78%. Chapter optional-path completion 32% → 71% when paired with one-way platform fixes shipped the same sprint. Players reported the game felt “more responsive” despite no input lag changes — a common outcome when leniency matches human timing instead of physics edges.
Technique decision table
| Approach | Best when | Strengths | Trade-offs |
|---|---|---|---|
| Coyote + jump buffer | Platformers, adventure traversal, mobile | High feel ROI; fixes majority of edge timing failures | Must tune per mode; can trivialize ultra-tight gauntlets |
| Frame-perfect only | Hardcore speedrun categories, some puzzle hops | Precise skill expression; simple state machine | Feels broken on consumer displays and controllers |
| General action buffer only | Fighters, action games with few ledge jumps | Unified queue for attacks and movement | Jump-specific ground rules often need special cases anyway |
| Wider collision / bigger ledges | Children's titles, very early prototypes | No timer code | Changes level design and challenge geometry |
| Assist sliders (coyote/buffer tiers) | Accessibility-first platformers | Preserves base difficulty for purists | More QA matrix; leaderboard segregation needed |
Common pitfalls
- Coyote after intentional jump — enables double-height off ledges or infinite hover at cliffs.
- Buffer without consume — holding jump auto-hops forever on every landing.
- Wall-clock timers in fixed sim — coyote shrinks on high fps and grows on stutter frames.
- Coyote during knockback — players escape combos or hazards unintentionally.
- Drop-through + coyote — accidental full jumps when trying to fall through one-way tiles.
- Ignoring moving platforms — buffered jump fires with wrong parent velocity; player falls through elevator.
- One global buffer for all actions — jump eats dodge buffer or vice versa.
- No telemetry — tuning by gut when early/late failure split is measurable.
Production checklist
- Implement separate coyote timer (post-ledge) and jump buffer (pre-land) with explicit consume rules.
- Disable coyote on intentional jump, drop-through, and knockback unless design doc says otherwise.
- Decrement timers in fixed update; express tuning targets in milliseconds.
- Log early-press vs late-press failure rates on critical gauntlet sections.
- Verify variable-height and double-jump rules on coyote and buffered jumps.
- Test on 60 fps, 120 fps, and frame-paced mobile; confirm window duration in frames.
- Wire assist-mode sliders that add fixed ms to coyote and buffer independently.
- Document state precedence with wall jump, dash, and attack buffers.
- In networked builds, resimulate timers deterministically from input history.
- Playtest moving-platform landings with buffer enabled before shipping vertical chapters.
Key takeaways
- Coyote time forgives late jump presses after leaving a ledge; jump buffer forgives early presses before landing.
- Most platformer “unfair” ledges are timing alignment problems, not bad level art.
- Harbor Peaks doubled edge-jump success with ~100 ms coyote and ~117 ms buffer — no wider platforms.
- Disable coyote on drop-through and knockback to avoid accidental jump escapes.
- Pair leniency tuning with telemetry that splits early vs late failures, not just aggregate death counts.
Related reading
- Game input buffering explained — general action queues, combat leniency, and rollback determinism
- One-way platform and drop-through systems explained — vertical routing that pairs with ledge leniency
- Double jump movement systems explained — aerial budget after coyote and buffered first jumps
- Jump arc and gravity systems explained — physics after a lenient jump successfully fires