Guide
Game counter-hit systems explained
Harbor Brawl's neutral meta was stuck: players mashed fast lights on wake-up, ate counter-hit launchers, and blamed “random” damage spikes. Replay analysis showed the real bug — counter detection fired on recovery frames for some moves but on startup frames for others, with no consistent UI feedback. A medium punch counter-hit dealt 12% life with +4 extra hitstun; the same move on a normal hit dealt 8%. Players could not learn which pokes were safe because the game never surfaced why a hit was countering. After a unified counter state machine, standardized bonus tables, and training-mode counter flashes, intentional counter routes rose 40% in ranked play while accidental counter deaths fell 28%. That is what a deliberate counter-hit system does: it turns frame knowledge into readable, rewarding offense.
A counter-hit occurs when your attack connects while the opponent is in a vulnerable sub-state — usually move startup or recovery, sometimes dash or jump startup. The game applies bonuses: extra damage, extended hitstun, altered knockback, or special properties like crumple or floor bounce. Counter-hits are distinct from counter-attacks (moves with invincibility or auto-punish windows) and from whiff punishes (hitting empty space during recovery). This guide covers detection windows, bonus stacking, route design, implementation, the Harbor Brawl refactor, a technique decision table, pitfalls, and a production checklist.
What counter-hit detection actually checks
At the frame a hitbox overlaps a hurtbox, the defender's combat state machine must answer: was the opponent attacking or recovering when this connected? Most fighters use a bitmask on the defender at impact time.
- Startup counter — defender is in frames before active hitboxes appear. Rewards interrupting slow normals and telegraphed specials.
- Recovery counter — defender is in frames after active ends. Rewards punishing whiffed or blocked moves that lack safety.
- Counterable movement — dash, jump, or backstep startup flagged as counterable in some games (Guilty Gear, UNI). Extends counter play beyond strikes alone.
- Non-counter states — blocking, hitstun, blockstun, invincibility, and armor typically suppress counter-hit flags on the defender.
The attacker does not need a special state; counter is almost always evaluated on the defender. Document which defender states qualify in your combat spec and expose them in frame data tooling so balance patches do not silently change counter routes.
Counter-hit bonus taxonomy
Bonuses should be predictable and tiered. Random crit-style counters erode competitive trust. Common bonus layers:
| Bonus type | Typical value | Design role | Risk if mis-tuned |
|---|---|---|---|
| Damage multiplier | 1.1×–1.25× on counter | Makes confirms hurt without extending combos alone | Stacking with counter-only supers creates one-touch kills |
| Hitstun bonus | +2 to +8 frames | Opens links that normal hits cannot reach | Too much stun enables infinite loops with fast normals |
| Launch / float change | Counter-only launcher property | Defines high-risk poke punishes | Every slow normal becomes a full combo starter |
| Crumple / stagger | Extended grounded stun, no knockdown | Visual feedback + time to spend meter | Crumple into unblockable mixups feels unfair without telegraph |
| Wall / corner carry | Extra pushback or wall splat on counter | Rewards spacing reads in neutral | Corner carry from every counter homogenizes stage value |
| Meter gain | Attacker +defender − on counter | Economy swing for successful reads | Meter snowball if counters happen too often at low skill |
Separate counter-hit bonuses from combo damage scaling: counter multipliers usually apply to the opening hit only, then normal proration takes over for follow-ups. Stacking both on every hit in a string doubles reward without doubling risk.
Implementation: counter flag lifecycle
A minimal production implementation tracks counter eligibility per character:
enum CounterableState { None, Startup, Recovery, DashStartup, JumpStartup }
struct HitResult {
bool counter_hit;
CounterableState counter_type;
int damage_bonus_frames; // extra hitstun applied
float damage_multiplier;
}
// On defender state enter:
if (entering_move_startup) defender.counterable = Startup;
if (entering_move_recovery) defender.counterable = Recovery;
// On hit resolution:
if (defender.counterable != None && !defender.invuln && !defender.blocking) {
result.counter_hit = true;
result.damage_multiplier = COUNTER_TABLE[move.id].damage_mult;
result.damage_bonus_frames = COUNTER_TABLE[move.id].stun_bonus;
}
defender.counterable = None; // clear after any hit connects
Critical details engineers miss:
- Projectile counters — decide if hitting a defender during their move startup while your projectile was already active counts. Most games say yes; document it.
- Trade resolution — when both players counter each other on the same frame, priority rules (active frames, move strength) must run before counter flags apply.
- Throw vs strike — throws usually do not receive counter-hit bonuses; mixing throw counter states creates ambiguous OS layers.
- Air vs ground — air counter-hit often uses smaller stun bonuses because gravity already limits combo length.
Harbor Brawl refactor: from inconsistent to teachable
Pre-patch Harbor Brawl had three problems:
- Legacy moves used per-move boolean
counterLaunchflags instead of a global state check — some heavies counter-launched on recovery only, others on startup only, with no pattern. - Hitstun bonus was a flat +6 frames for all counters, making light counters stronger than heavy counters relative to their base stun.
- No VFX or sound distinction beyond a slightly louder hit SFX.
The refactor introduced:
- Unified
CounterableStateon every move via the animation timeline (startup/recovery markers required before ship). - Scaled bonuses:
stun_bonus = floor(move.startup_frames * 0.15)clamped 2–8; damage multiplier 1.15× for normals, 1.1× for specials (specials already had higher base). - Counter-only launchers limited to moves with startup ≥ 12 frames — fast pokes get stun/damage only.
- Training mode: blue flash on defender startup counter, orange on recovery counter; replay scrub shows counterable windows as shaded bars.
Result: average combo length from counter starters dropped from 7.2 hits to 5.4 (stun scaling aligned with proration caps), but counter-hit damage as a share of total match damage rose because players intentionally hunted counters instead of accidentally triggering broken routes.
Technique decision table
| Goal | Prefer counter-hit system | Prefer alternative |
|---|---|---|
| Reward frame-trap reads in neutral | Startup counter with modest stun bonus | Meaty frame traps without counter flag (simpler casual game) |
| Punish unsafe blockstrings | Recovery counter with damage mult only | Guard break meter (see guard-break guide) |
| High-skill ceiling without invincibility moves | Counter launchers on slow normals only | Dedicated counter-attack specials with i-frames |
| Readable feedback for new players | Uniform VFX + training mode counter overlay | Disable counter bonuses in casual queues |
| Prevent infinite combos | Counter bonus on hit 1 only; normal scaling after | Hard combo damage cap regardless of counter |
Common pitfalls
- Invisible counter windows. If players cannot see startup vs recovery counters, the system feels random. Always pair with UI feedback.
- Counter bonus on every hit in a combo. Extends combos and damage without additional risk; apply to opening counter hit only.
- Slow moves that are uncounterable. Armored or super-armor startup without counter vulnerability makes neutral stale — armor and counterability are separate knobs.
- Mash protection via accidental counters. Wake-up mashing lights should not counter each other into infinite trades; use priority or counter-disable on simultaneous startup.
- Online rollback desync. Counter state must be deterministic from inputs and move timers, not from visual animation blends.
- Counter into unblockable. Crumple states that guarantee mixups need escape options or visible telegraphs.
Production checklist
- Define which defender states are counterable (startup, recovery, movement).
- Mark startup/recovery frames on every move in the animation pipeline before balance.
- Apply counter damage and stun bonuses to the opening hit only; normal scaling after.
- Cap stun bonus as a function of move speed, not a flat constant.
- Limit counter-only launchers to moves above a startup threshold.
- Specify projectile and trade counter rules in the combat design doc.
- Add distinct VFX/SFX for startup vs recovery counters.
- Expose counter windows in training mode and replay scrubbers.
- Validate counter routes against combo damage caps and hitstun scaling.
- Test wake-up mash, simultaneous counter, and throw counter edge cases.
- Verify counter flags survive rollback netcode simulation.
- Publish counter bonus tables alongside frame data for tournament players.
Key takeaways
- Counter-hits reward hitting opponents during startup or recovery, evaluated on the defender's state at impact.
- Damage and hitstun bonuses should apply to the opening counter hit only, then normal combo scaling takes over.
- Teachability requires visible feedback — Harbor Brawl's counter flashes cut “random” death complaints by surfacing frame wins.
- Counter-hit systems complement but do not replace whiff punishes, frame traps, and dedicated counter-attack moves.
- Scale stun bonuses with move speed so light counters do not outperform heavy counters per frame of risk.
Related reading
- Game frame data explained — startup, active, and recovery taxonomy
- Game hitstun and blockstun systems explained — stun scaling and advantage
- Game combo damage scaling explained — proration after the counter opener
- Game whiff punish and recovery frames explained — punishing empty space vs counter hits