Guide
Game motion input and special move systems explained
Harbor Brawl's fireball character looked fine in the lab: quarter-circle forward plus punch mapped to a 12-frame startup projectile. Frame data checked out. Yet ranked telemetry showed pad players landing the special on intent only 38% of the time while hitbox players cleared 71%. Support tickets clustered around “my DP never comes out” and “I got fireball when I wanted uppercut.” The bug was not damage or hitboxes — it was motion parsing. The engine stored only four frames of directional history, rejected diagonals unless both cardinals registered on separate ticks, and resolved motion conflicts by array order instead of specificity. After publishing scrub windows, diagonal leniency tables, and a motion-priority matrix, special confirm rate rose 29%, accidental opposite specials fell 44%, and dragon-punch whiff punishes in neutral dropped 18%.
Motion inputs are the directional sequences that gate special moves: quarter circles, dragon punches, half circles, full circles, and charge motions. They sit upstream of input buffering and plink priority — buffering forgives early buttons; plinking resolves simultaneous attacks; motion parsing decides whether a sequence counts as 236, 623, or nothing at all. This guide covers command notation, input history buffers, diagonal and SOCD cleaning, negative edge, shortcut rules, charge-back partition, motion conflict resolution, modern vs classic control schemes, rollback determinism, the Harbor Brawl refactor, a technique decision table versus buffer-only leniency, pitfalls, and a production checklist.
Command notation and motion families
Designers and wiki writers use numpad notation so motions read
the same regardless of character facing. 2 is down,
6 is forward (toward opponent), 4 is back,
8 is up. Diagonals combine cardinals: 3 is
down-forward, 1 is down-back.
| Motion | Notation | Typical move | Design role |
|---|---|---|---|
| Quarter circle forward | 236 + punch |
Fireball, low special | Neutral spacing, zoning |
| Quarter circle back | 214 + kick |
Spin kick, invuln reversal | Anti-air, escape |
| Dragon punch | 623 + punch |
Uppercut, vertical invuln | Anti-air, combo ender |
| Half circle forward | 41236 + punch |
Command grab, super | High commitment payoff |
| Full circle | 360 + punch |
Command grab | Point-blank mix, execution tax |
| Charge back then forward | [4]6 + punch |
Sonic boom, flash kick | Defensive charge archetype |
Each motion family needs explicit rules for whether diagonals satisfy both
cardinals, whether neutral (5) frames break the chain, and
whether the final button must arrive within N frames of the last direction.
Without documented rules, two engineers implement different leniency and
balance patches silently change what players can execute.
Input history buffer and scrub windows
Players rarely input a clean 2 then 3 then
6 on consecutive frames. Hardware polls, stick gates, and
human timing smear directions across a window. Fighting games store a
directional input history — a ring buffer of recent
numpad states with timestamps or frame indices.
When the player presses an attack button, the matcher walks backward through history looking for a valid motion template. The scrub window (often 8–12 frames in modern titles) defines how far back directions count. Too short and pad players lose specials; too long and ambiguous crouch-block histories accidentally complete fireballs during fuzzy defense.
Production practice: expose scrub length per motion class in data. Charge characters may need longer back-hold accumulation separate from the scrub ring. Document whether the matcher consumes history entries after a successful special (preventing double-fireball from one input) or leaves them for special cancels.
Diagonal leniency and SOCD cleaning
Stick and pad players often hit diagonals without registering pure cardinals.
Diagonal leniency rules define when 3 counts as
both 2 and 6 for matching purposes. Common approaches:
- Simultaneous cardinal injection — on diagonal frame, push both cardinals into history as if pressed that frame.
- Cardinal requirement relaxed —
236accepts2then3without a standalone6if forward appears in the diagonal. - Strict cardinals — tournament-authentic but punishes common hardware; usually paired with longer scrub windows.
SOCD cleaning (simultaneous opposite cardinal directions) resolves left+right or up+down when hitbox and pad report impossible states. Neutral, last-win, and first-win policies change whether charge-back holds break during stance switches. SOCD must match between local and rollback sessions or replays desync on motion recognition.
Negative edge, shortcuts, and charge partition
Negative edge
Negative edge triggers a move on button release instead of press. Charge characters historically used release timing for flash kicks so holding back then tapping forward up cleanly separates charge completion from attack activation. If both press and release fire specials, players get accidental doubles; if only press counts, charge routes feel stiff on pad.
Shortcut rules
Motion shortcuts let sloppier paths satisfy strict notation.
A 623 dragon punch may accept 3 then 6
without a discrete 2 when the matcher sees a forward rising
arc — the classic “DP shortcut.” Shortcuts raise execution
consistency but increase collision risk with 236 if priority is
undefined. Publish which shortcuts are intentional in patch notes.
Charge partition and back-hold
Charge motions track continuous back or down holds, often 40–60 frames. Charge partition allows brief forward taps without resetting back charge if the tap stays under a frame threshold — essential for walking backward while charging. Down-charge for slide-type moves shares the same accumulator with different release buttons. Do not conflate this system with unrelated hold-to-release charge attacks in action games; charge-back is a directional motion family, not a damage tier.
Motion conflict resolution and priority
One directional history can match multiple motions at button press. When the
player inputs 2 3 6 + punch, both
236 fireball and 623 uppercut may parse. Engines
need a motion priority table, not first-match-wins iteration
order.
| Priority strategy | Behavior | When to use |
|---|---|---|
| Longest match wins | 41236 beats 236 when both fit |
Supers and command grabs over normals |
| Most recent cardinal wins | Forward-heavy path favors 623 over 236 |
Reduce accidental fireballs during DP intent |
| Per-button binding | LP always maps to 236, MP to 623 if ambiguous |
Explicit design, easy to document |
| Character-specific override | Grappler 360 wins over 236 at point blank |
Archetype tuning without global rule changes |
Log unresolved conflicts in telemetry. High rates of “wrong special” reports usually mean priority table gaps, not player error.
Modern vs classic control schemes
Classic controls require full motions for each special. Modern controls (one-button specials, simplified inputs) map specials to single button presses or abbreviated motions to lower execution barrier. See assist and modern control modes for accessibility framing.
If your title ships both schemes, motion parsing must be a pluggable layer: classic mode runs full history matching; modern mode may bypass history but should still respect facing, charge state, and meter costs. Ranked playlists often split queues so classic players are not competing against simplified execution unless balance teams prove parity.
Rollback netcode and determinism
Motion matching must be deterministic from the same input stream. Rollback frames replay stored inputs; if diagonal leniency depends on floating timing or hardware-specific dead zones, resimulation produces different specials and desyncs the match.
- Quantize stick vectors to numpad sectors before history insert.
- Run SOCD and diagonal expansion on the quantized stream, not raw analog.
- Match motions only on button events present in the network input log.
- Unit-test ambiguous histories with golden expected outputs per patch.
Technique decision table
| Approach | Strength | Weakness | Best for |
|---|---|---|---|
| Strict motions only | High skill ceiling, authentic feel | Pad and stick players locked out of design | Legacy ports, explicit classic ranked |
| Long scrub + diagonal leniency | Broad hardware support without one-button specials | Accidental specials if priority weak | Cross-platform fighters |
| Buffer-only (no motion tuning) | Simple implementation | Does not fix sloppy direction paths | Games with few motion characters |
| Modern one-button specials | Lowest execution barrier | Balance and ranked split complexity | Casual-first or hybrid titles |
| Published priority matrix + telemetry | Debuggable, patch-stable | Up-front design cost | Live-service competitive games |
Harbor Brawl refactor
The input audit shipped these changes:
- Directional history expanded from 4 to 10 frames with per-motion scrub
overrides (
623uses 8f,41236uses 12f). - Diagonal leniency injects cardinals on
1/3/7/9frames into history. - Motion priority table: longest match, then per-button binding on ties.
- DP shortcut enabled with cap — requires at least one
2or3frame in history. - Training mode overlay: live numpad history strip and last matched motion label on special attempt.
- Telemetry:
special_intent_rate,motion_conflict_wrong_move,scrub_miss_rateper character per week.
Post-patch, fireball and DP confirm rates converged within 9pp across input devices without changing startup frames — evidence the problem was parsing, not frame data.
Pitfalls
- Undocumented scrub length. Balance patches change effective special speed when history depth shifts silently.
- First-match iteration order. Array order creates character-specific bugs that look like intentional balance.
- No SOCD policy online. Hitbox left+right desyncs from pad neutral on rollback.
- Charge and scrub shared buffer. Back-hold resets when diagonal cleaning injects forward cardinals.
- Negative edge on every move. Double specials and unintended release confirms in combos.
- Modern mode in classic ranked. Execution parity arguments without queue separation erode trust.
Production checklist
- Document numpad notation and motion list per character in design wiki.
- Implement ring-buffer input history with configurable scrub per motion class.
- Define diagonal leniency and SOCD cleaning on quantized numpad stream.
- Publish motion priority table; longest-match before first-match-wins.
- Specify negative edge scope (charge releases only vs global).
- Document intentional shortcuts; test collision with adjacent motions.
- Separate charge-back accumulator from generic scrub consumption rules.
- Add training mode input history and last-match overlay.
- Unit-test ambiguous histories for rollback determinism.
- Instrument special intent, conflict wrong-move, and scrub miss rates.
Key takeaways
- Motion parsing is a design system, not an afterthought — scrub windows and priority tables shape who can play your roster.
- Diagonal leniency and SOCD cleaning must be deterministic for rollback netcode.
- Motion conflicts need explicit priority, not array iteration order.
- Charge-back motions are a separate accumulator from action-game hold-to-release charges.
- Harbor Brawl raised special confirm rate 29% by fixing history depth and conflict resolution, not frame data.
Related reading
- Game input buffering explained — early button forgiveness that pairs with motion scrub
- Game plink and input priority systems explained — simultaneous button resolution after motion matches
- Game special cancel combat systems explained — spending motion history on cancels
- Game reversal attack systems explained — DP and invuln special design context