---
title: "Game feel juice hit flash camera kick and impact"
description: "Hits land flat and actions feel weak. Juice is the layer of flash, kick, particles, and sound on the contact moment. It is script-authored feedback on top of the real gameplay effect, not a component you attach."
engineVersion: v1.0.234
date: 2026-09-28
license: "(c) Gessa, proprietary. Cite with attribution to https://gessa.ai/docs/. Terms: https://gessa.ai/terms/."
canonical: https://gessa.ai/docs/knowledge/playbooks/game-feel-and-juice/
---

# Game feel juice hit flash camera kick and impact

## When to use

Hits land flat and actions feel weak. Juice is the layer of flash, kick,
particles, and sound on the contact moment. It is script-authored feedback on top
of the real gameplay effect, not a component you attach.

## The recipe

Author with `project_apply_script_semantic_patch` using the `ai_safe` op pack;
the feedback runs in the same handler that resolves the hit.

1. Hit flash: on impact, `ctx.entity.patchComponent` a `HighlightComponent`
   (`enabled:true`, a bright `color`, high `fillOpacity`) on the struck entity for
   a moment then off, or pulse a `LightComponent` `modulation` (`mode:"pulse"`)
   for a bloom of light.
2. Impact burst: fire a `ParticleEmitterComponent` burst at the contact point
   (see particles-and-visual-effects) for sparks, dust, or a puff.
3. Punchy sound: `ctx.audio.play` the hit cue with `AudioPlayOptions`, jittering
   `pitch` slightly per hit and setting `volume` so repeated hits do not sound
   identical (see audio-feedback).
4. Camera kick / recoil: `ctx.camera.addLookInput` a small delta to nudge the
   view on the shot or hit, then let it settle. This is the recoil kick and the
   closest thing to a shake.
5. Brief pause feel (pseudo-hitstop): there is no time-dilation op; approximate by
   gating the actor's own update with a `setBooleanState` `frozen` flag for a few
   ticks so it visibly hitches, then clearing it.

## Pitfalls

- There is NO native `screenShake` or `hitstop` host op (that is Spawn
  vocabulary). Approximate a shake with a short oscillating `ctx.camera.addLookInput`
  kick, and a hitstop with a state-gated pause; do not expect a one-call effect.
- Only ENABLED highlights count against the per-tier highlight budget; turn the
  flash off after its moment so it does not linger or blow the budget.
- Keep juice on the authority path that already resolves the hit so feedback and
  damage stay in sync across clients.
- Juice is feel, not gameplay; the flash and kick must not change the actual
  damage, hitbox, or outcome (see combat-damage-and-respawn).

## Verify

- `simulation_run` (`qa.run.start`) to confirm a hit triggers the flash, burst,
  sound, and kick together.
- `qa_capture_renderer_viewport` (`qa.renderer.viewport.capture`) to see the flash
  and impact read on screen.
