The Nitro Boost System — Game Feel Through Juice
The nitro boost is, mechanically, just a multiplier. Hold the button, go faster. When the meter runs out, you stop going faster. That's it. But it feels amazing, and that gap between mechanics and feel is 100% juice.
The numbers
const BOOST_POWER := 2.0 # engine power multiplier while boosting
const BOOST_TOP := 1.42 # top-speed multiplier while boosting
const BOOST_KICK := 10.0 # extra forward accel (m/s^2) while boosting
const BOOST_DRAIN := 0.5 # meter drained per second (2s full)
const BOOST_REFILL := 0.07 # meter refilled per second, always
const BOOST_DRIFT_FILL := 0.28 # bonus refill per second while drifting
const BOOST_MIN_START := 0.06 # need at least this much meter to igniteA full meter lasts 2 seconds (drain rate 0.5 per second). During those 2 seconds, your engine power doubles, your top speed goes up 42%, and you get an extra 10 m/s² forward kick. That kick is important — BOOST_POWER and BOOST_TOP only affect the engine model (which tapers as you approach top speed), so the kick provides a constant shove that you feel immediately.
if gas:
var power := _power * (BOOST_POWER if boosting else 1.0)
var headroom := clampf(1.0 - f_spd / maxf(top, 1.0), 0.0, 1.0)
flat += fwd * (power * surface * headroom * air) * delta
if boosting:
flat += fwd * BOOST_KICK * air * deltaWithout the kick, boosting at high speed feels mushy because the engine power multiplier barely matters when you're already near top speed (headroom is close to zero). The kick bypasses the headroom calculation entirely. It always shoves.
The drift refill loop
This is the design decision I'm most proud of. The meter refills passively at 0.07/s — slow. It takes about 14 seconds to go from empty to full just by driving. But while you're drifting, the refill rate jumps to 0.07 + 0.28 = 0.35/s. Five times faster.
var fill := BOOST_REFILL + (BOOST_DRIFT_FILL if drifting else 0.0)
boost_amount = minf(1.0, boost_amount + fill * delta)This creates a beautiful loop: drift to fill your meter → boost out of the drift → the boost carries you to the next corner → drift again to refill. Good players always have nitro. Bad players always wonder why their meter is empty. The system teaches you to drift without ever saying a word about it.
The gating mechanic
You can't spam the boost button. There's a minimum-to-start threshold:
boosting = boost_held and boost_amount > BOOST_MIN_START and gasYou need at least 6% meter and you need to be on the gas. No boosting while braking. No boosting from absolute zero meter. This prevents the annoying flicker where you'd tap boost, get a 0.02-second burst, and waste input.
Visual feedback: the flame
When you boost, an orange particle jet fires from the back of the car:
func _make_flame() -> CPUParticles3D:
var p := CPUParticles3D.new()
p.position = Vector3(0, 0.45, 2.2)
p.emitting = false
p.amount = 34
p.lifetime = 0.35
p.direction = Vector3(0, 0.1, 1.0)
p.initial_velocity_min = 8.0
p.initial_velocity_max = 16.0
p.color = Color(1.0, 0.6, 0.15, 0.9)34 tiny orange cubes spraying backwards at 8–16 m/s. Short lifetime (0.35s) so they don't linger. The emission material has emission_energy_multiplier = 2.4, which makes it bloom through the post-processing glow. On the Neon Night City map, the boost trail looks electric.
The HUD meter
The boost meter on the HUD is a simple filled rectangle — cyan when charging, hot orange while firing:
var col := Color(1.0, 0.6, 0.15) if car.boosting else Color(0.3, 0.82, 1.0)When the meter drops below the ignition threshold, the fill alpha drops to 0.35 so "empty" reads clearly. You can glance at it and instantly know: can I boost right now? Yes or no.
Tracking boost for quests
The world tracks total boost seconds per session in _boost_total. That feeds into the quest system — there's a quest that rewards you for boosting a cumulative 30 seconds. It's a tutorial quest, basically. By the time you complete it, you understand the boost-drift loop instinctively.
The nitro isn't complex. But every piece — the kick, the drift refill, the gating, the flame, the colour shift on the meter — works together to make pressing one button feel like an event. That's juice.
Written by Oliver
Indie game developer building 3D web experiences in Godot and Next.js. I write about creative coding, procedural generation, and game feel.