2026-06-01·Sanchez

Diagnosing the Old Version Before Tearing the Rabbit Hole Apart

I decided to rebuild after playing the old version one more time.
The screen was rolling along, but I was left holding nothing.

There was no physics

The biggest problem was that there was no physics.
The rabbit was pinned to a fixed point on a path laid out with a Catmull-Rom curve, and the camera just followed that point at a constant speed.
No gravity, no jumping, no inertia, no acceleration or deceleration.
Pressing A/D instantly snapped the angle of the wall the rabbit was stuck to.
There was nowhere for any sense of weight to live.

It took me a while to articulate why instant input is a problem.
When the response follows your input 100% immediately, the person holding the controls feels no resistance at all.
Without resistance there's no sense of having handled something well.
Feel comes out of that gap where the thing obeys you but not quite instantly, and the old version had a gap of zero.

The visuals were the opposite of the intent

The visuals were the exact opposite of what I intended.
A Stanford Bunny scan model (bunny.obj), flat white, zero animations.
The background was nearly black, and the walls were painted with a "dirty wall" PBR texture.
A game that was supposed to be a cozy fairy tale had turned into horror.

That wasn't a skill problem, it was an ordering problem.
Before settling the mood, I grabbed whatever assets were at hand to get something running, and each of those assets dragged its own tone in with it.
A realistic scan model, a realistic wall texture, and a dark background are each fine on their own; combined, they add up to dark realism automatically.
Nobody intended horror and horror is what came out.

There was no failure

The clincher was the game's structure.
No obstacles, no fail condition.
You just hit 500m and it's over.
You'd pick up falling carrots, but missing them did absolutely nothing.
In a word, it was a "carrot-picking simulator."

With no failure there's no success either.
A choice with nothing at stake isn't a choice, so nothing the player does produces a story.
Collect ten carrots in a row or miss every one, and the screen rolls on identically.
No amount of polishing the controls could have made that structure fun.

Old version screen

The code wasn't honest

The code wasn't honest either. tunnelGenerator.ts and collision.ts were built but never used, and the values in constants.ts didn't match the hardcoded values in the components.
The rapier dependency was declared but never actually ran.

Looking back, those three are the same symptom wearing different faces: what's declared and what's real have come apart. A filename says it does collision detection and nobody calls it.
A constants file says these values are the truth and the components use different numbers.
package.json says we use a physics engine and the execution path doesn't.

A codebase like that lies to whoever reads it.
Time goes into figuring out where to even make a change, and you repeatedly discover that what you just fixed was dead code.
The real cost wasn't the line count, it was that mistrust.

Repair or rebuild

Once I laid out all the symptoms, there was only one conclusion: this wasn't something a partial repair could fix.

The test I used was simple.
If the problem is on the surface, fix it; if it's in the foundation, build again.
Every item on that list was foundation.
Adding physics means replacing how movement works entirely.
Adding failure means collisions, health, and a game-over flow that don't exist yet.
Changing the tone means throwing out the model, the materials, and the lighting.
Fix them one at a time and you rewrite all of it anyway — and if that's the outcome, better not to be dragged around by the leftover structure while doing it.

The conditions that would have talked me out of it are just as clear.
If there had been a lot worth salvaging, or real users I couldn't take offline, or if the problems had been a few local defects, I would have repaired it.
The old version was none of those.
The only thing worth keeping was the idea that a rabbit runs down a burrow, and that's a sentence rather than code, so carrying it over cost nothing.

In the next post I'll write about deciding what to use as the yardstick for drawing it all over again.

Next: Deciding the redesign direction →