Brackenmere / dev log

Posts Building Brackenmere

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.

G18 6 min read

How shall I tell it?

I redrew my map of Brackenmere on 3 October. This post is about what happened underneath it that same day, which was less visible: the work the new map was waiting on.

By then the open-world engine worked, but only on the proving ground, a test world. The village, the place my kids actually play, was still built whole at load time, with every spot in it written down as a number.

First person at the east end of Market Row: a stall on the right, a villager, and the keep on its crag pale in the haze beyond the field The village as a streamed region on 3 October, with the keep on its crag on the horizon for the first time.

Where it started

On 30 September I had asked for the village to stop being a test bed, and asked the awkward half of it too: "whats the idea on doing this, removing the old brackenmere and old kit yard etc". My one condition: "Nothing we've done is to be thrown away, just ported over".

The agents broke the open world into numbered specs. I wanted to see the whole road: "Whats 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". Spec 5 was the port, in three parts: 5a, 5b and 5c.

Then I stepped away: "I am AFK now so any future issues or decisions go with you recommendation so we get it built." Every plan would go to a Codex reviewer first, and "if critical survives 3 rounds, take the last round and start building... Dont park". Spec 5a alone carries sixteen rulings "made on Nick's behalf while he was away".

The morning of 3 October

Usage was running high that week. "Don't worry about my usage. Just carry on in the best way." Then I asked for a gut check: "Whereabouts exactly are we in all of this game building end to end?... as a kind of gut instinct from you? I know you won't know everything."

The orchestrator guessed "about a third of the way to a playable V1", with the new map at about 10%: "The village isn't on it." I handed the map work to a separate agent ("Shall we do this on another agent?... so we don't confuse you as the orchestrator of it all?"), told the orchestrator "please do push as you go", and the port started.

5a: names, not numbers

The spec's audit was blunt. The save did not know where the hero stood, and the tests set the hero down at written-out coordinates, position.set(8.5, 0, 12) for "on the cobbles". Move the village and every one of them breaks "for a reason that has nothing to do with behaviour".

So 5a gave every spot a name. Worlds declare anchors, tests say goTo('bakery'), and a code rule stops a village test importing the layout. The save now remembers where the hero stood in a region, with one firm rule from the spec: "the hero must never open inside a wall". A spot that does not fit opens at the spawn instead.

Under the hood Before 5a, 23 test and script files imported the village's layout constants. Afterwards a code rule kept them out of the village's browser tests and shot scripts, so the village can move without rewriting them.

5b: inside eight milliseconds

5b was about what an area can carry: house doors, hedges, the windmill. The limit was the streaming budget: no more than 8 ms of a frame spent bringing a chunk in on High, 6 ms on Low, or the hero feels a stutter.

The first measured walk blew straight through it. A hedge, then a house door and the windmill, were each built in one go, so the fix was to build them in steps: the windmill a course of boards at a time, the door's textures painted a band at a time.

Under the hood Worst streaming update on the proving ground walk, High, cold: 85.3 ms on the first run, 6.4 ms on the fifth.

That morning a separate piece built a far landmark: a keep on a crag, meant to sit on the village's horizon.

5c: the port

5c's goal was strict: "Today's village, unchanged in layout, becomes a streamed region." Same URL, same coordinates, every door and anchor landing on the same spot. Success meant "the village's browser tests pass with no change to what they check". The whole-world village builder was then deleted.

The village from above, the left half captured before the port and the right half after: the same buildings, lanes and yards line up across the join Left half before the port, right half after, same camera. The point was that nothing moved.

It was not free. The old builder had merged every fence post and gate into one mesh per material, and the region at first drew each piece on its own. The ground lookup was slow enough to break the budget in snow. And the look review found the market stalls had vanished: each stall hid its stand-in when its model arrived, and the stand-in turned out to be the whole stall.

Under the hood Merging the fences again took the village from 839 draws to 553 on High. Fixing the ground lookup took the worst update on the village walk from 11.9 ms to 5.2.

That evening I told the orchestrator: "lets let open-world-5c-build to finish, then lets pause there. Get that to a nice stopping point and let me know, dont start anything after that." Usage was at 88%, and it gave the port the remaining room "since it's the step that unblocks your map".

Then I wanted to see it: "can I take a look at the working world so far somehow?" It started a server from the work in progress, with a caveat: "It's still today's village layout, now loaded as a streamed region; your redrawn map comes in the next spec."

The visible change was the sky. The village swapped its old fog for the haze, so the edge of the world became distance instead of a wall.

Market Row in first person, before and after the port side by side: the same stalls and villagers, with flat open land on the left and pale hills in the haze on the right Market Row before (left) and after (right): the same street, with a horizon behind it.

Kit Yard retires

Kit Yard was the hamlet the agents built on 26 September to test the kit. By October it did three jobs: a showcase, a cheap open-sky world for tests, and the only horizon in the game. The catalogue page already showed every piece, the village could host the sky tests, and the haze had replaced its hills.

Kit Yard from above: a chapel in its churchyard, cottages along a lane, a stream with a stone bridge, a barn, a post mill and a fenced wheat field Kit Yard on its last day, 3 October.

So it went, and its buildings stayed in the catalogue for the new map to place. The one thing that existed nowhere else was the stream, and because I had said nothing was to be thrown away, it moved into the kit as water/stream, laid across the proving ground under a stone bridge.

First person beside the stream on the proving ground: an even channel with pale lips, a single stone on the water, and a mill and the keep washed out in the haze The same stream as a kit piece on the proving ground. The blind reviewer called it "a concrete gutter".

The blind art review scored the port 4.65: the village views in line with earlier reviews, the open ground far lower. Most of its broken list was already on main: right-angle ruts, a square with ruler edges, a village sitting in an empty field. The port had not made it worse, only easier to see.

What I took from it

Names over numbers was the real win. With a new map about to move the village, every relayout would have been a test rewrite without it.

On 3 October the village changed in a way you'd barely notice, and that was the point. Underneath, it was rebuilt so it loads bit by bit as you walk, like the rest of the open world. The one thing you can see is the sky: there is now a horizon behind the village, with a keep on a crag in the distance, instead of a wall of fog.

First person at the east end of Market Row: a stall on the right, a villager, and the keep on its crag pale in the haze beyond the field The village on 3 October, with the keep on its crag on the horizon for the first time.

Why it needed doing

I had just redrawn my map of Brackenmere, and the new map was waiting on this. The open world already worked in a test area, but the village, the place my kids actually play, was still built all in one go when the game started.

My one condition was simple: nothing we had made was to be thrown away, only moved across. Then I went away and left my AI helpers to make the decisions, with a second helper checking each plan before it was built.

Names, not numbers

The first step sounds small but mattered most. The helpers' automatic checks had been putting the hero down at exact spots on a grid, like "8.5 across, 12 down" to mean "on the cobbles". Move the village and every one of those checks would break, for no good reason.

So every spot in the village got a name instead, like "the bakery". The game also now remembers where you were standing in the village, with one firm rule: you must never wake up inside a wall.

No stutter

As you walk, the game brings in the next bit of the village. If that takes too long, you feel a little stutter. The first test walk stuttered badly, because hedges, doors and the windmill were each built all at once. Now they are built a little at a time, and the walk is smooth.

The move itself

The goal was strict: today's village, exactly as it was, just loaded the new way. Every door and building had to land on exactly the same spot.

The village from above, the left half captured before the port and the right half after: the same buildings, lanes and yards line up across the join Left half before, right half after, from the same spot. The point was that nothing moved.

It wasn't free. Things got slower at first, and the market stalls vanished for a while, but the helpers caught and fixed both.

Market Row in first person, before and after the port side by side: the same stalls and villagers, with flat open land on the left and pale hills in the haze on the right Market Row before (left) and after (right): the same street, now with a horizon behind it.

Kit Yard retires

Kit Yard was a little hamlet the helpers had built as a showroom for all our building pieces. It wasn't needed any more, so it went. But its buildings were kept to place on the new map, and its stream, which existed nowhere else, was kept as a piece we can use anywhere.

Kit Yard from above: a chapel in its churchyard, cottages along a lane, a stream with a stone bridge, a barn, a post mill and a fenced wheat field Kit Yard on its last day.

An art review was honest: the stream looked more like "a concrete gutter", and the open ground around the village was bare. Most of that was already there. The move just made it easier to see.

What I learned

Giving places names instead of numbers was the real win. With a new map about to move the whole village around, every change would otherwise have meant rewriting every check.

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

G15 7 min read

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.