KINDLEFALL Play free
Part 5

Playtesting: what the notes changed

How playtest notes steered every build: the lava, the flicker, the ending, the ripostes, the Pyromancer.

An AI can write a boss overnight. What it can't do is hold a controller. Every build of Kindlefall ended the same way: someone played it on a Mac, in Chrome, with an Xbox pad, and wrote down what felt wrong. Sometimes politely. The changelog quotes those notes more than once, and not always flatteringly for the game.

This post is those notes and what they turned into. Where the old build still exists in git, we checked it out and captured it the same way as the new one, so the "before" pictures below are the real thing.

"Looks awful": the HUD

Early on the AI gave the HUD an art pass: a real fire shader in the health medallion, 3D glass flasks, a glass-tube health bar. It was technically lovely. At 24 pixels it was mush. The first round of feedback swapped the fire for a beating ember heart (the fire looked the same as the spell charges) and re-lit the flasks. The next round is in the changelog as "looks awful", and the rethink admitted the real problem: it replaced the tiny 3D renders with painted icons in one aligned row of equal slots.

The original HUD: a small flame medallion, a segmented red health bar reading 70 of 100, flame-drop charges and three green flask icons1 · Before the art pass
The art-pass HUD: a gold medallion with a blurry shader fire inside, shader flames for charges and 3D glass flasks2 · Shader fire, 3D flasks
The next iteration: a molten heart in the medallion, smaller shader flames and re-lit 3D flasks3 · The heart, still 3D
Today's HUD: the heart medallion, a glass-tube health bar, and crisp painted flame and flask icons in equal gold-bordered slots4 · Today: crisp icons in slots
Four HUDs in a dayCaptured from commits 952c378, c19c4e3, f913bc0 and today's build, same room, health set to 70%. The lesson went into AGENTS.md: tiny HUD elements should be crisp icons, not tiny 3D renders or noisy shaders.

The bugs a headless browser can't see

The test bot runs headless. On a Mac, Chrome runs WebGL through Metal with fast math, and three times the playtest saw something the bot never could:

The AI's summary of that day is still our favourite line in the docs: "a full-screen black frame is a present/clear problem, a black blob is a NaN." Every new shader now gets grepped for unguarded pow, atan, normalize and divides before it ships.

And one bug was a playtest bug in a different way: the notes kept reporting things as broken that were already fixed. Chrome was running cached modules. That's why the title screen shows a build stamp, and why a red banner appears if the code in the tab is older than the files on disk.

"Don't just throw you in": the opening

Runs used to start with you standing in a room. The note asked for an opening, and got a 3.8-second shot: fade in close on the knight, pull out, pan to where the enemies rise, pan back. Too fast, said the next note, so it became about nine seconds. Then it went silent: no music during the intro, just the ground rumbling as the room wakes and the dead rising with their own sounds, then the score creeping in over seven seconds once you have control. Then the title screen got the same treatment: pressing Play fades to black first, and a bug where the music blipped on for a moment was traced to a fade reading a gain value that lags scheduled changes. That clip at the top of part 1 is the result.

The lava, four times

This is our favourite before-and-after, because it's four befores. Floor IV needed lava, and lava is hard.

  1. Build .12: flat lava with glowing cracks. The playtest note, verbatim from the changelog: the first room's lava "looks like ass".
  2. Build .13: lower, with cooled crust, a hot lip against the banks, heat glow on the stone and broken basalt shelves along every bank. "Still looked bad."
  3. Build .15: rebuilt as a sunken channel with rock walls lit from below and a molten surface that actually flows along the channel, crust rafts drifting near the banks. You sink into it if you stand in it.
  4. Build .16: 3D. The surface is displaced, real crust slabs drift down each channel on the current as one instanced mesh, and bubble domes swell and burst.
A 2 by 2 grid of the same Sunken Forge room in four builds: top left, flat dark plates with bright glowing cracks along the walls; top right, lower lava with crusted plates and basalt along the banks; bottom left, a sunken bright flowing channel with crust; bottom right, the 3D channel with drifting dark slabs
Builds .12, .13, .15 and .16Reading order: top left to bottom right. The Slag Stair, captured from commits b4416b2, 3fe3e19, b380321 and d222ecf with the same camera.
TodayThe same room on today's build.

The same evening the playtest met the Cinderlings, molten slimes that split when you hit them, and the note was "more of that". That one line is why Floor IV kept growing procedural creatures: next came a six-legged crawler on procedural IK, and finally the Forge Heart itself.

First play of the overnight build

The morning after the overnight sprint, a person played floors that had only ever been played by a bot. Build .19 is the list of what broke:

Then build .20, two things you only see with your own eyes. A click during the loading screen started a run (now the game waits in a "preparing" state and throws away anything pressed). And the floor flickered.

Z-fighting

The tops of the floor tiles sat at exactly y = 0.05, which was also the height of every telegraph, rune ring, glow and message glyph drawn on the floor. Two surfaces at the same depth fight over which one is in front, and as the camera moved, they shimmered. The fix is almost funny for how small it is: floor tiles moved 0.06 down, and additive effects got a polygon offset. Floor VI's moving tiles followed, and two builds later Floor VII's flat overlays needed the same fix.

Second playtest: earned, not mashed

Build .22 is where the game's combat got its spine. The playtest found you could mash your way through fights with ripostes: the "visceral strike" mark (stun an enemy, and your next hit is an execution) was appearing after ordinary hit-staggers, and Ember Parry fired if you just hammered the button.

Now marks only appear on real openings: a parry, a guard break, a wall stun, a posture break. One execution per enemy per six seconds. Ember Parry ignores presses within half a second of the last one, the window is 0.18 seconds (0.12 against bosses), and a miss locks you out for a second. "POSTURE BROKEN" got its own banner.

The ending

The epilogue screen: lines of italic text ending in 'Kindlefall is quiet.' over a darkened hearth
The epilogueCaptured at the end of a bot run, which is why it says "You never fell. Not once." The bot plays invincible.

The overnight build ended with an epilogue, then a credits roll naming the guardians you'd felled, then a restart. It didn't feel like a real ending. Now it's the epilogue, which remembers your run (your hero, whether Vesper was your ally or your rival, Ser Cendric's farewell, your deaths and vows), then the word KINDLEFALL alone on the screen (since Sprint #2 with a short recap of your descent beneath it), then the main menu, with New Game+ waiting under Continue. No credits roll, no restart button. It ends.

The last screenEpilogue, then one word. Captured in real time.

The waves

The same build sent the Tide Gallery back to the Floor V team. The orchestrator had already bounced the waves once because the screenshot didn't match the report; the playtest note was that they needed to look way better. They came back as real breakers.

Overnight build (09fcfb2)
Today
The Tide Gallery, before and afterSame room, same bot, two builds.

Third playtest: quiet, and a Pyromancer who doesn't swing her staff

Build .23 was mostly about calm. The title screen used to play the world's sounds behind the menu; now the world is silent there and the score plays softly. A click anywhere used to start a run; now only Enter, A, or the chosen hero's card does. Restart asks "Really restart this run?", with No selected by default.

And the Pyromancer. She was built overnight as a mage with a staff combo. The note: "swinging the staff is kind of dumb". So her attack became three magic arrows and then a fireball that bursts, auto-aimed out to twelve units and homing slightly, tuned to about 23 damage per second single-target against roughly 30 for the melee heroes, plus the embers it feeds back.

Overnight build: "Weak staff, twice the embers"
Today: arrows, then a fireball
The Pyromancer reworkBoth clips from Floor I's Hall of Bones, camera pulled in, driven by the same script: on the left she has to walk up and swing (slice, stab, chop, spin); on the right she stands off and shoots. The red lines are Crypt Archers aiming at her.

Then the note said she was "squishy". She got a Frost Wave on its own button: an ice cone that shoves everything back, freezes it briefly and shatters enemy projectiles, no embers needed, seven-second cooldown. The next round turned it into a frozen breaker that rises, stands as a wall for about a second and a half, then cracks into chunks, and turned the Meteor into a real molten boulder that tumbles in from the side, lands half-buried and throws out cooling debris. With, per the changelog, "no white flash".

Frost WaveThe frozen breaker, standing as a shield.
The rock MeteorHold the spell past the greater bolt and release: the boulder tumbles in over its telegraph and lands.

The small notes

Not every note is a rework. Some of our favourite changes are one line each:

What we took from thisA note doesn't need to be a solution. "Looks like ass" was enough to get four lavas. What made the notes work was that they came back fast, every time, as a playable build, with the build number on the title screen so everyone knew which version a note was about.
Play Kindlefall

In your browser, with a keyboard and mouse or a controller.