Defold Lab piece 03 · verified playthrough, desktop + mobile

Windfall

The last apples of the year are lying on a frozen terrace and the frost bell is counting down. Nudge one and it rolls in a straight line until a planted board turns it, a stone or your own boots stop it, or the cart takes it in — a complete turn-based route puzzle authored end to end by AI agents in the real Defold engine, playing in seconds on a phone connection.

Play it now

Arrows / WASD / tap-to-walk · SPACE nudge · F board · Z undo · 2.12 MB over the wire · starts in seconds

▶  Play

The contract, and the terrace

The image concept generator was out of credits when this cycle opened, so the contract for the piece is WRITTEN instead of painted — and a written contract is a stricter colour spec than a painting: every colour below is committed as exact hex and the final audit samples the shipped frames against that list. The board on the left is authored in the same pass: palette chips, the orchardist's proportion rule, the 9×7 cell budget and the on-screen pixel size of every prop.

Windfall art-direction contract board
The written contract's visual half — palette, proportions, cell budget, prop sizes
Windfall in-engine frame
The same terrace, live in the engine

Gray boxes, and a solver that proves the puzzles

The whole game ran as gray boxes before any art existed. The turn rules live twice: once in Python, where they author the six terraces, verify every authored solution and BFS-prove par; and once in Lua at runtime. The recorded solutions are replayed in-game through the real input path, so a divergence between the two implementations fails the build instead of shipping. A second, independent bot re-derives a winning line from the live state mirror and plays it on the keyboard — it beats all six terraces on every audit round.

Windfall blockout
Blockout: the full puzzle playing as gray boxes
solver output proving each terrace
The offline solver: every terrace verified, par proved by BFS

A Blender pipeline, rendered to sprites

The orchardist is a rigged Blender character whose walk comes from retargeted CMU motion capture, rendered to sprite rows from one elevated orthographic camera with the character rotated per facing. His face acts: eyes, brows and mouth are separate named parts under the head pivot, with a randomised blink and three expressions swapped from state the player can already see. Apples, boards, cart, tree, bramble, stones, the bell and the ground tiles are all Blender renders packed into one Defold atlas.

orchardist sprite rows
The shipped sprite rows: mocap walk in three facings, idle, blink, the plant press

The instant-load signature

This lab exists to prove a real-engine game can be playing before a phone user loses interest. Every payload ships pre-compressed and is inflated in the browser, so any static host serves it optimally. Measured first-playable times, Playwright CDP network throttling:

Connection profileThroughput / RTTFirst playable frame
Wi-Fi / 4G10 Mbps · 60 ms2.6–2.7 s
Fast 3G (HSPA+ class)6 Mbps · 150 ms4.2–4.3 s
Chrome DevTools “Fast 3G” preset1.44 Mbps · 562 ms15.4 s

Where this misses: this lab holds itself to a first playable frame within 4 s on that fast-3G profile, and the measurement above is about 0.3 s over it. The payload is the smallest the lab has shipped; what is left is Defold's atlas packer, which sizes its page 2048 px wide whatever the content, so the texture carries a tier more than its art needs — splitting the atlas was tried twice and measured worse both times.

Total transfer 2.12 MB of a 3.83 MB bundle (gzip + RDO-basis textures) — the smallest payload this lab has shipped. Measured headless on software rendering: the unthrottled boot floor on this host is 0.88–1.09 s, so roughly a second of every figure above is SwiftShader starting up, which a real GPU does not pay. The fast-3G figure misses this lab's own 4 s line by about 0.3 s under those conditions and is reported as measured.

Real engine features, earned

Sprite atlases

Mocap walk rows, blink and expression sets, every prop — Blender-rendered into one basis-compressed atlas.

Tilemap hillside

One generated tilemap carries all six terraces; the camera glides down it between levels.

Factories

Apples, boards and terrace furniture are all factory-spawned from the level data — no hand-placed instances.

Particle FX

Drifting leaves ride the camera; a dust puff fires wherever an apple is turned by a board.

GUI scenes

Resolution-independent HUD in physical pixels — one layout from desktop to phone portrait, with a touch d-pad.

Message passing

The turn engine owns the rules and posts events; nothing reaches into another object's state.

step 0.135sroll 0.072s/cell plant 0.22skey repeat 0.30s / 0.085s camera glide 1.1sparallax 0.35 / 0.6 / 1.15 undo stack 64arrows + WASD + tap-to-walk pauselocalization-ready strings