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_multis 1.0; typically 15–30% of run speed to forgive micro-adjustments. - Settle time — 0.08–0.15 s after crossing
threshold before
plantedaccuracy 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_multstill 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:
- Raised accuracy threshold to 22% run speed; added 0.12 s settle after crossing.
- Counter-strafe friction 5.2× (was 2.8×) with 40 ms input deadzone on release.
- Unified server/client
accuracy_bandreplication; removed client-only spread shortcut. - Dynamic crosshair center gap now scales with
final_spreadso telegraph matches hits. - 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
- Game recoil and spread systems explained — bloom, recovery curves, and first-shot accuracy
- Game locomotion explained — acceleration, friction, and character controllers
- Game aim down sights and hip fire systems explained — ADS spread multipliers and engagement bands
- Game tactical shooter design explained — stop-and-shoot tension and round macro