Brackenmere / dev log

Posts Building Brackenmere

Streaming an open world: chunks, paths and haze

Over three days the agents built the groundwork for Brackenmere as one seamless, ever-growing valley: chunks that stream in round the hero, a test square kilometre, people who can walk across it and haze instead of fog. The real faults were found by walking it, not by the tests.

G15 7 min read

How shall I tell it?

On the morning of 30 September I opened a new conversation. "I want to start the game proper, at the moment the kit yard, Brackenmere etc were all test areas to see items, work on aspects of it all etc. However I want to start Brackenmere now properly, with the village from scratch." Nothing was to be thrown away, "just ported over to the new Brackenmere layout and this stops being a testing ground, but now the start of the game and story arcs."

First person at dusk on the proving ground's road: timber cottages with lit windows, street lamps, and pale hills fading into the haze The proving ground at dusk on 2 October: the road, the hamlet's lamps and the far hills in the haze.

A world built whole

Until then every world was built and loaded whole, with nothing ever unloaded. Fine for a village; not for a valley that grows as long as the game does.

I could see that coming. "As the town grows, it's going to get bigger. Maybe a maximum distance viewing with some form of 'fog' etc is needed (not real fog). How do other games produce large scapes"

Then the request that shaped the next three days: "I want to build the groundwork without the opinion of the map baked in. Can we build all the aspects that are going to help here with a theoretically ever growing world, before we know what the world will look like". And one rule: "all mazes / quests will be their own worlds, but everything else in Brackenmere is seamless".

Five specs, one ahead

"What's spec 2, 3, 4 and 5? Should we be holistic in all this and plan everything upfront in detail then let agents work through systematically after". The answer was five specs: the streaming core, systems centred on the hero, pathfinding, distance and look, then the village port. Each plan would be written only once the spec before it had real measurements.

The core splits a region into 32 metre chunks that load round the hero, are built a step at a time while hidden, and appear only once their shaders are compiled. To prove it, the agents generated a square kilometre called the proving ground, with dry-stone walls laid across chunk lines on purpose.

The proving ground from above: a dirt road with the hero on it, cottages, fences, lamp posts and a campfire on grass The proving ground's spawn hamlet on 30 September, a test world generated from a seed.

Under the hood A chunk loads within the view distance plus one chunk and unloads only a chunk further out, so standing on a boundary never makes it flicker. Before the hero moves each frame, the walls round them must be in, so you can never walk through one that has not arrived.

One review finding needed my call: "On the decision, talk to me. What's your recommendation". It was to skip an off-screen rehearsal for warming shaders and instead count any shader compiled mid-draw, and hold that count at zero. "Yep that's fine, accept that. Don't build yet, ask me how to build etc."

The hitch

The tests passed. Then a verifier walked the proving ground on my Mac on High, corner to corner and back, and two checks failed. Eight shaders were still compiling mid-draw on every loop, and the worst streaming update took 23 to 33 milliseconds against a target of 3 to 4: a visible hitch, the very thing streaming exists to hide. The tests could not see it, because test mode steps time and builds each piece whole.

I was about to step away. "Fix the streaming hitch before merging. I am AFK now so any future issues or decisions go with your recommendation so we get it built. Keep on building - will you carry on to spec 2, 3 4 5 etc?" Every plan from then on went to a Codex reviewer in rounds, and I ruled out stalling on its findings: "if critical survives 3 rounds, take the last round and start building with the latest findings folded in as needed. Don't park".

The fix split the heavy builders (cottages, roofs, hedgerows, walls, lanes) into small bounded steps. The eight late shaders were the glow copies of lantern flames and window glass that only the bloom pass drew; a chunk now compiles them before it is shown.

Under the hood The worst streaming update fell from 22.5 to 33.5 ms (one hedgerow was the worst step) to 4.8 to 5.5 ms on High and 3.9 to 4.2 ms on Low, inside limits of 8 and 6. Caching whole cottages was rejected: each depends on a shared random stream and where it stands.

Everything becomes a window

Spec 2 took everything sized, as the roadmap put it, to "the whole world" and made it a window that follows the hero: the weather, the light budget, and the map, which now shows only the areas you have been in. The weather window pushed the worst update back up to 12.3 milliseconds, waiting on the graphics card, until it learned to read back without waiting.

The proving ground map: three discovered areas, Hamlet, Fields and Moor, with the hero's red dot on the moor The region's map after walking through three areas, 30 September.

By 1 October this was one of several branches running at once: "I've got three other work trees locally working on various elements from the maze generator. There's a Brackenmere rebuild and there's a backend server kind of build going on as well." I asked an orchestrator to bring them onto main, and worried about this one: "a lot of that was about performance and how it works on a large scale... we want to make sure that all that knowledge that they have, because they would have spent a long time researching, is brought in as well". Before it merged that evening, the branch wrote down every number it had measured and everything it had rejected.

People who cross chunks

Spec 3, built overnight, gave each loaded chunk a fine walking grid and the whole region a coarse graph of crossings, so the town's people can plan a route to somewhere not yet loaded. The reviewer tested it against about 9,000 random routes; a second look still found one that walked through a wall from a point exactly on a chunk line. Fixed, with a test that failed on that leg first.

Four of the town's people walking and standing round the road in the proving ground The town's people on the proving ground on 2 October. They walk in from a door out of view.

The next afternoon an audit noticed the people now moved two ways, one in regions and one in whole worlds. "How do the town people walk? What was the question?" Then: "Yes go with A after town-truth lands". One set of rules, and nobody walks through a wall.

Haze, not fog

Spec 4a was my "not real fog". Haze fades distance toward the sky's own colour, thicker low down, following the season and weather. Each quality tier gets its own draw distance, an area can carry its own look, and a ring of far hills stands round the world.

The same moor view twice: without haze the land is sharp to the horizon, with the first haze the far land pales into the sky The moor with the haze off (left) and its first pass (right). The pink band at the land's edge was a fault, fixed in the next round.

Then the agents hit a wall of their own. Three blind art reviews scored the look 4.1, 4.7 and 4.6 out of 10 against a bar of 8. Each round fixed real faults and barely moved the score.

So I gave my calls in the stream's chat, as its ledger records them. Two views: "the two images look great". The far landmark: "think that's ok". The Low moor: "I don't mind the solid white, but the solid line of where the fog starts is jarring." The hollow: "The same, the fog just suddenly starts with a solid white line, not good".

The fault was a curve: the haze was thickest the moment it began, and perspective turned that start into a ruled line. Easing it in cleared the hollow. On the moor the line softened but stayed, because it is the hill's own edge 30 metres off against haze 50 metres behind, so I kept it as a silhouette.

The Low moor before and after the eased haze: the crest's line against the white is softer on the right The moor on Low before (left) and after (right) the haze eased in. Softer, not gone.

Under the hood Haze reaches 160 m on High and 96 m on Low. The ring of hills costs 4 draws and 32k triangles in first person.

That afternoon I said what I had felt for days: "we've got to stop chasing that score of eight when we're not given it... It's costing us a lot of time in the review loops and they're just incrementing very slightly." A minute later I took it back as a rule: "That art review rule was just me hypothesising. I want to be based on actual reports from agents".

What I took from it

Building the groundwork before the map was right. Walking it on real hardware found what reviews and tests missed. And the haze improved from being told exactly what looked wrong, not from chasing a number.

On 30 September I decided to start the game properly. Until then the village and everything around it had been a test area. Now it was to become the real start of the game, and one day a whole valley that keeps growing as the story does.

First person at dusk on the proving ground's road: timber cottages with lit windows, street lamps, and pale hills fading into the haze A test village at dusk, with the far hills fading into the haze.

A world too big to load at once

Until then each world was loaded all in one go. That's fine for a village, but not for a valley that keeps getting bigger. So before deciding what the valley would look like, I asked the AI helpers to build the groundwork for a world that could grow forever. Mazes and quests would stay their own separate places, but everything else in Brackenmere would be one seamless land.

The answer was to cut the land into squares, a bit like tiles on a floor, and only load the squares near the hero. As you walk, squares ahead appear and ones far behind are put away. To try it out they made a test square kilometre of countryside, with walls deliberately crossing from one square to the next.

The proving ground from above: a dirt road with the hero on it, cottages, fences, lamp posts and a campfire on grass The test hamlet, made up by the computer.

Found by walking it

All the automatic checks passed. Then a helper actually walked the test land on my computer, corner to corner, and found the game stuttered every time new land loaded in, which is exactly what this was meant to avoid. The checks couldn't see it. Walking it could. The fix was to build each new square in small, gentle steps instead of one big lump.

The map and the weather follow you

The weather, the lights and the map now follow the hero rather than covering the whole world at once. The map shows only the areas you've been to.

The proving ground map: three discovered areas, Hamlet, Fields and Moor, with the hero's red dot on the moor The map after walking through three areas.

People who can walk anywhere

The villagers can now plan a walk to somewhere that hasn't even loaded yet, and nobody walks through walls.

Four of the town's people walking and standing round the road in the proving ground Villagers out on the test road.

Haze, not fog

I wanted a soft haze in the distance, not thick fog. Far land now fades gently into the colour of the sky, thicker low down, and changing with the season and weather. A ring of far hills stands round the edge of the world.

The same moor view twice: without haze the land is sharp to the horizon, with the first haze the far land pales into the sky The moor without haze (left) and with it (right).

The AI art reviewers kept giving the haze low scores, and each round of fixes barely moved them. So I told them what actually looked wrong: the haze started with a hard white line. Once it faded in gently, the line softened. On the moor a little line stayed, because it's the edge of the hill itself, so I kept it.

The Low moor before and after the eased haze: the crest's line against the white is softer on the right Before (left) and after (right) the haze faded in gently. Softer, not gone.

What I learned

Building the groundwork before drawing the map was right. Walking it on a real computer found what the checks missed. And the haze got better from being told exactly what looked wrong, not from chasing a score.

Building Brackenmere

G30 6 min read

Immersion: a world that answers the hero

One quiet night I asked the agents to research what makes game worlds feel real and build it in three independent rounds: the hero's touch, a world that lives, and places that tell stories. Then three more rounds paid for it, and my own play the next morning found the rough edges.

Building Brackenmere

G20 5 min read

Far tiles and tree cards

The valley I had just laid out was 448 metres across and you could not see the other side of it. In a day the agents drew the far land as baked tiles and the middle distance's trees as cards: the view opened up, but the frame time I hoped it would fix barely moved.

Building Brackenmere

G18 6 min read

The village becomes a streamed region and Kit Yard retires

On 3 October the village moved onto the open-world engine without a single building moving, and Kit Yard, the test hamlet, was retired. The proof was boring on purpose: every village test passed without changing what it checked.