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 relaxed236 accepts 2 then 3 without a standalone 6 if 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 (623 uses 8f, 41236 uses 12f).
  • Diagonal leniency injects cardinals on 1/3/7/9 frames into history.
  • Motion priority table: longest match, then per-button binding on ties.
  • DP shortcut enabled with cap — requires at least one 2 or 3 frame 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_rate per 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