Making of King Tide

Chapter 03 — Tuning the Feel

The part you can't screenshot.

You can describe the wave field with a formula and the buoyancy with four probes. But "does it feel good to ride?" has no equation. It's the sum of a hundred small decisions about how the bike responds — and most of those decisions were made by building something, hating how it felt, and changing it. This is that trail of changes.

First, write down what it must not feel like

Before tuning anything, we wrote down the failure modes — drawn straight from the genre's graveyard. Pacer and Redout 2 and the Riptide GP series each taught a lesson, and the one that shaped the controls most was this, from our design targets:

"Every mechanic must be optional flair before it becomes a difficulty gate."

That single rule has teeth. It means no mechanic is allowed to play the game for you, and none is allowed to wall you out if you ignore it. Hold that thought — it's the reason for the first big thing we deleted.

The hover saga: tuning by subtraction

Early on, pitch was inert: leaning the nose had no effect on thrust along the ground, so the bike felt like it was on rails. The first fix made pitch expressive — pop a wheelie and throttle and the bike lifts; tip the nose down a slope and the throttle drives you into the wave face. Good. But once the nose could point anywhere, the bike could tumble.

The tempting fix was to add a gentle auto-righting force in the air — a spring that nudges the bike back to level. We tried it. We reverted it the same day. The commit message is blunt about why:

revert(hover): no PD in air — air is pure free physics again. "Any P term in the air branch reads as auto-leveling, which we don't want."

That's the anti-target in action. Auto-leveling feels like the game grabbing the bars out of your hands. So instead of adding a force, we removed the ability to flip by accident a different way: a hard clamp on how far the nose can dive (12°), and — over water — suppressing fresh nose-down torque past that limit so a pop off a crest can't be parlayed into an unintended front-flip. Land ramps stay unclamped, because there, flips are the point.

From spring curves to a "dive-then-level" kick

The nose-down gesture went through a few models. First, asymmetric spring curves on the bow and stern corners — soft at the top of the dive so you could pump the nose into a trough, stiffening near the surface so the belly hit first, not the nose. It worked but it was fiddly, four tuning knobs fighting each other.

The cleaner mental model that replaced it: a kick. Press nose-down and you get one crisp downward transient (tapering to zero over ~0.22 s), then a restoring term pulls the chassis back to surface tangent — level on flat water, slope- parallel on a hill. Keep holding, and the same input quietly becomes altitude control: the bike sinks toward half its hover height while staying parallel to the surface. Release, and a lighter nose-up kick (~0.18 s) fires so the bow leads the recovery as the bike rises. One gesture, three felt phases — dip, sink, rise — and not a single auto-leveling spring.

The tuck sweet-spot: feel as a curve, not a button

That same nose-down lean carries the game's clearest feel lesson. We wanted a downhill tuck — duck low, go faster — and the first version was a dedicated button (X on the keyboard, L3 on a pad). It worked. It also failed the anti-target: a button is a binary, and binaries don't reward skill, they reward knowing the button exists.

So the button came out, and the tuck became a curve folded into the lean you already have. Feather the nose down toward a sweet spot and the bike speeds up and slides cleaner; push past the sweet spot and the belly scrapes — the curve goes negative and the same multipliers invert into a penalty. There's no safe "floor it." The fastest line is a feathered lean held right on the edge of too-far.

Live demo — the cyan curve is the real shipped tuckFactor. Re-tune your own (orange) and feel it on the bike: the deck scrolls at the speed cap your lean earns.

Drag Nose-down lean up slowly. Watch the top-speed cap climb to its peak right at the sweet spot (the dashed line), then fall away as you keep pushing — and the deck flow speeds up and slows down to match. Now move the sweet spot and scrape floor sliders: that's the actual tuning dial we sat behind. We put the sweet spot high, at 0.8, precisely because it lines up with "about to scrape" — the input has a satisfying edge to ride. And the payoff only converts to real speed when something is already pushing you past your base top speed (a descent, a wave face), so a good tuck is a reward for committing to a fast line, not a free button.

Drift: borrowing thirty years of someone else's tuning

Not every feel problem is novel. When we added a Mario-Kart-style mini-turbo drift, we immediately hit the exact bugs Nintendo spent decades fixing. The first pass let a held drift spiral the bike into a 180; the fix was the wide MK-style model where counter-steering opens the slide instead of tightening it. We added tiered charge — blue mini-turbo at 0.6 s, orange at 1.4 s, a purple ultra tier past that — with a HUD badge and color-shifting sparks, because (another universal finding) a charge you can't read isn't a skill, it's a guess. And the rider physically banks into the drift, because the lean sells the slide more than the physics do.

The lesson here is humility: a lot of "game feel" is rediscovering what the masters already solved. The wins came from matching reference, not reinventing it.

The throughline

Look back at the changes that made the bike feel right and a pattern shows up. We deleted the auto-leveling. We deleted the tuck button. We widened the drift instead of constraining it. Almost every step made the bike feel better by taking away something that played the game for the rider, and by turning binary states into curves with a sweet spot you can learn. Then we made the skill legible — tier badges, pump feedback, the tuck's audible scrape — so the player can tell when they're doing it well. Feel, it turns out, is mostly subtraction plus legibility.

Read the code

The tuck curve is its own tiny, test-pinned module: src/game/systems/tuck-curve.ts (the demo above imports it directly). The dive/kick model and the deleted air-PD live in hover.ts; the drift tiers in drift.ts. And the failure modes we tuned against are catalogued in docs/design-targets.md.