Guide

Game counter-strafe and movement accuracy penalty systems explained

Harbor Vanguard shipped rifle duels where wide peeks felt like coin flips. Players strafed out, tapped fire, and watched tracers miss heads by a full body width despite centered crosshairs. The root cause was not recoil or bloom alone — it was a movement accuracy penalty that scaled with horizontal velocity while counter-strafe deceleration took 0.28 s to reach “accurate” speed. Skilled players counter-strafed into a window where spread was still wide but the reticle looked stable. 52% of ranked rifle engagements at mid range ended with the peeker missing the first two shots and dying before spread recovered.

After engineering unified velocity bands, a 0.12 s settle gate, and server- authoritative accuracy state synced with prediction reconciliation, wide-peek first-shot miss rate fell to 14% while time-to-kill on committed duels stayed flat. This guide covers movement state machines, velocity-to-spread curves, counter-strafe deceleration tuning, modifier stacks (crouch, ADS, air), Harbor Vanguard’s refactor, a technique decision table, pitfalls, and a production checklist alongside locomotion and tactical shooter design.

Movement accuracy is not the same as recoil

Three systems stack in every shot, and conflating them produces the “centered crosshair, wide miss” bug Harbor Vanguard hit:

Layer Driver Player skill
Recoil / kick Per-shot camera offset while firing Pull-down compensation, burst length
Bloom / spread Shots fired, recovery delay Tap fire, pause between bursts
Movement penalty Horizontal and vertical velocity, airborne state Counter-strafe, stop before shot, crouch peek

Movement accuracy penalty widens the hit cone based on how fast the character is moving relative to a weapon-specific threshold. Recoil moves where you aim; movement penalty widens where bullets can land even if aim is perfect. Both must be readable in the reticle — dynamic crosshair expansion is the standard telegraph — and both must agree between client prediction and server hit validation.

Movement state machine

Accuracy modifiers attach to a locomotion FSM, not raw velocity alone:

  • Idle / planted — minimum spread multiplier (often 1.0× base).
  • Walking — linear velocity penalty; slow walk may be exempt in stealth modes.
  • Running / sprinting — hard floor on accuracy; many tactical shooters block ADS fire while sprinting.
  • Crouch walking — reduced penalty vs stand walk; rewards tight peek paths.
  • Airborne — separate curve; jump-peek accuracy is a deliberate skill ceiling.
  • Slide / dash — temporary max penalty; exit must gate recovery.

Transitions matter: entering planted from run requires both velocity below threshold and a short settle timer so players cannot frame-perfect shoot on the exact decel frame.

Velocity-to-spread curves

Most tactical shooters map scalar speed to a spread multiplier with a clamped curve rather than a binary moving/still flag:

speed     = length(velocity.xz)
t         = clamp(speed / max_run_speed, 0, 1)
move_mult = lerp(1.0, max_move_inaccuracy, ease_in_quad(t))
final_spread = base_spread * move_mult * stance_mult * ads_mult

Design knobs per weapon class:

  • max_move_inaccuracy — SMGs often 2.5–3.5×; rifles 4–6×; snipers may hard-block fire above walk speed.
  • Accuracy threshold speed — speed below which move_mult is 1.0; typically 15–30% of run speed to forgive micro-adjustments.
  • Settle time — 0.08–0.15 s after crossing threshold before planted accuracy applies; prevents counter-strafe exploits that fire on decel frame zero.
  • Vertical velocity — falling and rising often add independent penalties so jump-peeks cost accuracy even at zero horizontal speed.

Pair curves with ADS spread multipliers: hip-fire may tolerate light strafe while ADS demands near-full stop on rifles.

Counter-strafe deceleration

Counter-strafing is the player technique of tapping the opposite movement key to cancel horizontal momentum before firing. The game system that makes it work is aggressive ground friction when input opposes velocity:

if dot(input_dir, velocity.xz) < -0.1:
    decel = counter_strafe_friction  // 3–8× normal friction
else:
    decel = ground_friction

Tuning counter-strafe feel:

  • Counter-strafe friction multiplier — too low and stops feel mushy; too high and taps overshoot into reverse drift.
  • Input deadzone on release — brief zero-input window after key release prevents diagonal residue from keeping velocity above accuracy threshold.
  • Acceleration cap on direction flip — instant velocity zero (CS-style) vs blended decel (Valorant-style) changes peek meta and lag-compensation windows.
  • Telemetry — log time-from-peek to first shot, velocity at fire tick, and hit/miss; separates aim skill from system mismatch.

Server authority and prediction

Clients predict movement instantly but the server validates hits against authoritative velocity at fire tick. If the client applies planted accuracy one frame before the server, players see blood decals on misses. Harbor Vanguard fixed this by computing accuracy state on the server and replicating a compact accuracy_band enum (planted / moving / air / sprint) each tick rather than re-deriving spread only on the client.

Modifier stacks and peek archetypes

Competitive peek patterns map to intentional modifier stacks:

Technique Movement state Typical outcome
Wide swing Run → counter-strafe → planted High risk; rewards fast decel + first-shot accuracy
Jiggle peek Tap strafe, never below walk threshold Info only; rifle fire intentionally inaccurate
Crouch peek Crouch walk → planted crouch Smaller hitbox + faster accuracy recovery
Jump peek Airborne + horizontal carry Max penalty; used for info or surprise, rarely for duel win
Shoulder bait Brief moving state, no fire intent Spread irrelevant; animation sync with lean hitboxes

Stance modifiers multiply into the same pipeline: crouch often 0.6–0.8× movement penalty, ADS 0.5–0.7× on rifles, sprint 2.0× or hard block. Document the stack order — multiplicative vs additive — in weapon data so designers do not double-penalize by accident.

Harbor Vanguard refactor

The ranked rifle meta before refactor:

  • Accuracy threshold at 12% run speed but decel to that speed averaged 0.28 s.
  • Settle timer 0.04 s — players fired while move_mult still 3.2×.
  • Client spread preview used instantaneous velocity; server used averaged velocity over 3 ticks.
  • Dynamic crosshair expanded but center dot stayed tight, hiding bloom.

Changes shipped in a single combat tuning pass:

  1. Raised accuracy threshold to 22% run speed; added 0.12 s settle after crossing.
  2. Counter-strafe friction 5.2× (was 2.8×) with 40 ms input deadzone on release.
  3. Unified server/client accuracy_band replication; removed client-only spread shortcut.
  4. Dynamic crosshair center gap now scales with final_spread so telegraph matches hits.
  5. Rifle max_move_inaccuracy lowered 5.5× → 4.8× after playtest TTK validation.

Result: wide-peek first-shot miss 52% → 14%; player surveys citing “random misses” dropped 38% → 9%; average duel duration unchanged at 0.9 s median.

Technique decision table

Approach Best for Tradeoff
Velocity curve + counter-strafe Tactical shooters, skill expression High tuning cost; must sync netcode
Binary moving / still flag Arcade, mobile, co-op horde Shallow peek skill; simple to ship
Spread-only (no move penalty) Arena, hero shooters with high TTK Run-and-gun; less stop-and-shoot tension
Hard block fire while moving (snipers) Long-range power roles Frustrating if threshold too sticky
Movement increases recoil instead of spread Extraction, sim-adjacent Harder to telegraph; reticle stays tight

For tactical 5v5 modes, velocity curve + counter-strafe is the industry default because it creates a readable skill loop: move for position, stop to shoot, punish enemies who fail to settle. Spread-only works when movement itself is the primary defense and TTK is high enough to absorb tracking fire.

Common pitfalls

  • Settle shorter than decel — players shoot during deceleration while UI implies accuracy. Match settle to 80th percentile decel time.
  • Client/server velocity mismatch — blood on miss, trust collapse. Replicate accuracy band or server-validated spread seed.
  • Hidden center dot — crosshair arms expand but dot stays precise. Scale gap or opacity with final spread.
  • Diagonal speed ignored — only checking forward axis lets strafe-only peekers get rifle accuracy at full run speed sideways.
  • Air penalty forgotten on jump peek — horizontal stop with vertical velocity still airborne; players learn broken meta.
  • Weapon class copy-paste — SMG and rifle share threshold; SMGs feel broken or rifles feel unusable. Author per-class curves.
  • Counter-strafe without friction boost — realistic decel feels unresponsive; players blame netcode instead of tuning.

Production checklist

  • Define movement FSM states and which allow accurate fire per weapon class.
  • Author velocity-to-spread curve with max_move_inaccuracy and threshold speed.
  • Add settle timer after velocity drops below threshold before planted accuracy.
  • Implement counter-strafe friction multiplier and input-release deadzone.
  • Stack crouch, ADS, air, and sprint modifiers with documented order.
  • Sync accuracy_band (or equivalent) between client prediction and server validation.
  • Bind dynamic crosshair expansion to final_spread, not bloom alone.
  • Telemetry: velocity at fire tick, accuracy_band, first-shot hit rate by peek type.
  • Playtest wide peek, jiggle, crouch peek, and jump peek at 40–80 ms simulated latency.
  • Validate TTK unchanged after penalty tuning on representative duel distances.
  • Document per-weapon curves in data tables for live balance iteration.

Key takeaways

  • Movement penalty is a third accuracy layer distinct from recoil and shot bloom.
  • Counter-strafe is a friction system, not just a player technique.
  • Settle time must exceed decel time or wide peeks feel random.
  • Server-authoritative accuracy state prevents client-only spread lies.
  • Harbor Vanguard cut wide-peek misses 52% → 14% with velocity bands, settle gate, and unified replication.

Related reading