The fire wants a log. My eight-year-old is behind his wanderer's shoulder in 3D, I'm looking down at the same clearing in isometric, and we are both in the same camp on the same Wi-Fi.
Lantern Hollow is twenty-four builds in, and a great many hours deep. I've made websites and apps for years; this is my first game, and games punish you for guessing in ways websites never do.
Two views, because we don't agree
I wanted an isometric game. Fixed camera, 2:1 tiles, everything drawn as pixels — the kind of thing I grew up on. My wife and my two boys, five and eight, played it and asked, more or less immediately, for a camera they could turn.
So the game has both. Isometric, and a third-person view you can orbit, and V swaps between them mid-run. They are not two games. They read the same world, the same firelight, the same creatures walking about, and the choice is per person rather than per world. When we all sit round one fire on the LAN, I'm looking down at the moor and the boys are behind their own shoulders, and none of that reaches the simulation.
Keeping two renderers honest is the tax. Every time I light a lamp or shade a cliff, I have to do it twice and then check that both agree. The 3D view spent hours and hours catching up on things the flat view had always done: the checkerboard cut through a tree standing in front of you, warmth pooling on the ground in steps rather than a smooth gradient, mist that ends the world at whatever your fire reaches.
Nobody updates anything
The first testers got a build, played it, and stayed on that build. Why wouldn't they? It was working. Meanwhile I was six versions along, fixing things they were still hitting.
My first answer was an alpha key: a string you copied off the website and pasted into Options so the game could ask about new builds. People did paste it in. They also lost it, pasted it with a trailing space, or never opened Options at all.
Now you sign in to the game with the same account as the website, and it asks the site what the latest build is. Copies from Google Play and TestFlight say nothing, because the store handles it. The account carries your name, your clothes and your three worlds, so a phone picks up where the desktop left off.
If I were starting again I'd build that on day one, before the first person you're not related to installs anything.
Everything was the wrong size
A tile is one unit across. That's the only measurement I picked deliberately. Everything else I eyeballed, and everything else was wrong.
The gravelhides — the wolves out on the moor — stood about half a wanderer's height. On a screenshot they read as big dogs. They're at 0.72 of you now, which is the difference between an animal you'd back away from and one you'd try to pet.
Hills were worse. One step of elevation was sixty-four pixels, drawn as a sheer dirt cliff with grass hanging over the lip. The person climbing it was forty-eight pixels tall. Every rise in the world was taller than the player, so the moor read as a quarry. They're half that now, with turfed banks instead of cliff faces, and they finally read as hills.
The fix that stuck wasn't resizing models. Each creature is drawn at its own voxel size, so a wolf can be shrunk by making a voxel worth less rather than by cutting voxels out of it. It keeps the muzzle, the ears and the folded hind legs, and it means a size argument is one number rather than an afternoon of redrawing.
One body, many clothes
The wardrobe is the thing I'd most like the earlier version of me to have known about.
Every character used to be a finished lump of voxels. A shirt was painted onto the body. Which meant a new shirt was not a new shirt — it was every walk frame, every facing, every pose, drawn again, for each of sixteen directions.
Now there's a rig. A body is built once, clothes are separate parts pulled on over it in order — shoes, trousers, top, hair — and then the whole assembly is posed: arms swing, legs stride, the torso leans on a lunge. Eight haircuts, five tops, three pairs of trousers and two pairs of shoes go through the same machinery, and so does every friend you rescue and every stranger at your fire.
The clothes were an hour or two each. The rig was many times that. The trade only looks obvious from this side of it.
What I'd tell myself on day one
- Ship the update path first. A tester on an old build is reporting bugs you fixed several versions ago, and they have no way of knowing. The game asks the website one question now, and never talks to GitHub at all.
- Pick a unit and write it down. A tile is one unit. A wolf's aggro radius, the reach of the mist wall and the camera's distance behind your shoulder are all counted in tiles, so a number means the same thing wherever I read it.
- Build the machine, not the object. The rig, the voxel scale, the quarter-tile grid the firelight lives on. Each swallowed hours, and each turned the next hundred things into an argument or two.
- Two renderers is two of everything. There's a test that photographs the camp at day, dusk and night in both views and shouts if a pixel moves. I need it more than I expected to.
- Show it to people who don't care how it works. Most of what I have fixed lately was noticed by someone in this house before I saw it.
Next on the list is a trader who sells rather than buys — arrows, bandages, fuel — and hints for the chests out past the pond, so digging one up is a hunt rather than a bump into it.
Download the latest build if you're signed in, or see what's changed.