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."
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'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 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.
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 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 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.