Brackenmere / dev log

Posts Building Brackenmere

Twenty-seven pieces of feel

On 8 October I asked the agents what makes a game feel real, as someone who is not a game designer. One research pass became 27 small pieces of atmosphere and polish, built and merged in a day, and a lesson about how many agents one Mac can carry.

G22 6 min read

How shall I tell it?

By 8 October Brackenmere had a village, weather, seasons and sword moves you pressed on purpose. It did not yet feel like a place that carried on without you.

That morning, while another session relaid the village for the third time, I opened a fresh one with a question rather than a feature: "Can you look through the current game performance and visual element here?... If we are double loading or triple loading or doing some unwarranted passes in code to make it not as performant, then we should definitely fix those."

And the part I cared about more: "I'm not a game designer, but I'd like to understand things like I know we've added bloom that I didn't really understand before." I asked it to "take what I've asked you and understand the meaning behind it to look elsewhere on what else we could do to make this an immersive experience that the user feels part of a world."

Dawn behind the keep and the chapel, the low sun haloed and cut by their silhouettes Six in the morning by the chapel after the stream: the low sun glows round the keep and stops at every roof.

What the research found

The first half of the research was reassuring: nothing was drawn twice by accident. One thing dominated: on my Mac, High was drawing at twice the screen's resolution, and that alone made a quarter of the frames stutter.

The village square on High from the research pass, with the guidance card taking up the left of the screen One of the two screenshots the research was judged from. It also noticed how much of the frame the guidance card takes.

Under the hood At pixel ratio 2 the drawing buffer was 2880 x 1800, and 50 of about 195 frames took over 20 ms. Turning off AO, freezing shadows or hiding the HUD changed nothing. At 1.5, none did. With the cap and a shadow cadence, draws fell from 635 to 460.

The second half was what I had asked for: a glossary (bloom, ambient occlusion, frame pacing) and a long list of the tricks games use. Cloud shadows drifting over fields. Sun shafts at a low sun. Eyes adjusting at a doorway. People glancing at you. A hit that pauses for a split second so it lands.

"Okay, talk me through all this now. What do you want me to do to see if 1.5 looks acceptable? How do I do that?" It showed me how, and I looked. "1.5 is fine. Maybe we just set 1.5 as the maximum here and not allow 2, which had jumps and stutters."

Then the list. "You've kind of put yes to everything here apart from number 17 and 18, and I agree with everything here. It's hard to know on 17 or 18 until I actually see what it looks like, of course." Those two, a far landmark and a tilt-shift miniature look, were built so I could judge them in the game, the second behind a settings toggle.

Weather that is not uniform

The list missed the thing I noticed most. "Have we also looked at the weather and how we can just make that a little bit more realistic?" I described what I meant: "with the fog, there'll be like moments when there's patches of less dense fog and denser fog... And maybe with rain, it could like, there could be a bit of a swell with the wind at one point, so it changes direction briefly, things like that."

The agent read the code and agreed: each weather spell had one wind, one rain intensity and fog the same thickness everywhere. But everything already read that one shared wind, so changing it in one place would move the trees, smoke, rain and the wind's sound together. Nine weather pieces followed, from wind that veers and surges to fog banks, squalls, sun breaking through overcast, mist that lifts with the morning, storm beats and fronts you can see coming.

"Yep, let's do all of them and just add them in to the queue as needed."

The village from above in mist at eight in the morning, before the stream Before: mist at eight in the morning, the same thickness everywhere until the spell ends.

The same view after the stream, the mist thinned over the village and lying in the low ground After: the same morning, the mist lifting as the sun climbs.

A queue, and too many agents

Twenty-seven pieces was too many to hold in one agent's head. "As we've got quite a lot now in this queue that is purely in your memory, I'm wondering whether to convert your order and processes to Solo MCP to-dos." Each piece became a todo with its own plan, reviewed by a Codex agent, then an owner in its own worktree, a review and a check in the running game.

Then I went out. "I'm going to be away from keyboard, so any blockers I'm happy to go with your recommendations." And on download size: "Don't worry about JS ceilings. I'm happy for our file size to grow and take longer to load up the initial game... It's just performance in the game that I care more about than the actual asset download size."

Early in the afternoon I asked for more: "I'd like to load up actually maybe up to seven so we can start to be more performant and get through this backlog quicker."

That was a mistake. Within half an hour, from another session: "I'm worried about them sharing heavy playwright tests and competing and reloading each other's work before one's got a chance to kind of take a screenshot." Then, plainly: "It's absolutely killing my CPU."

I did not want to be the scheduler. "I don't really want to be in charge of doing all this. Can you tell the parent agents of these subagents to orchestrate what gets what resources." We settled on a steady state: "I think I like the 3 owners + 1 reviewer, that seems sensible, lets keep that."

Once it calmed down I asked the better question. "What is the heavy slot used for? What actually runs the heavy slot and why are we running it?" And: "is it possible to run less heavy load tests here, or are they all needed? ... if we cut down the amount of times these need to be run, then we are going to save ourselves not only CPU but also time as well." Each piece dropped to focused tests and only the browser tests its plan named; the full suite would run once, on the merged branch.

Two first-person views of the green, before and after: the after has dense grass round the hero's feet Left before, right after: near grass round the hero on High and Medium, bending away underfoot.

Landing it

The pieces landed one after another through the afternoon ("can we push periodically as well, to ensure we are saving this to github accordingly"), and that evening the whole stream went to main.

Under the hood 320 commits between the research and the merge. On the merged branch 592 of 593 browser tests passed; the one failure failed the same way at the stream's start commit.

The owners left notes on what they could not judge: sun shafts that read as a halo rather than streaks, a lit room at midnight half a stop too bright. My last question of the night: "All that 'needs your eyes' are they recorded somewhere? I wont remember that, a solo mcp todo or something?" It became one todo, with every check and the URL to open.

Two first-person views facing the evening sun, before and after Eight in the evening, before and after: the sun gets a glow in the haze, and the grass thickens at your feet.

Under the hood The download grew by about a fifth (793 KB to 956 KB of compressed JavaScript) and the village went from 124 to 180 shader programs. All of them compile while loading: none after the world is ready.

What I took from it

Asking what makes a game feel real got me further than asking for any one feature. None of these pieces is big. Together they are why the village feels alive when you stand still in it: cloud shadows crossing the fields, a crow lifting off a hedge, mist burning off the mere.

The other lesson was about the agents. More owners did not make it faster; it made my Mac grind. Three owners and a reviewer, with fewer test runs, finished the queue by evening.

By 8 October Brackenmere had a village, weather and seasons, but it didn't yet feel like a place that carried on without you. So instead of asking for one new feature, I asked a question: what makes a game feel real? "I'm not a game designer," I said, so explain it to me, and find what else we could do. That one question became twenty-seven small touches, all built in a single day.

Dawn behind the keep and the chapel, the low sun haloed and cut by their silhouettes Six in the morning by the chapel: the low sun glows round the castle and stops at every roof.

What the helper found

First, the good news: nothing was being done twice by mistake. But on my Mac, the top quality setting was drawing far more detail than the screen could even show, and that alone made the game stutter. I had a look at a slightly lower setting, couldn't tell the difference, and said "1.5 is fine". So that's now the limit.

Then the part I'd really asked for: a plain explanation of the tricks games use, and a long list of ideas. Shadows of clouds drifting over fields. Shafts of light from a low sun. Your eyes adjusting as you step through a doorway. People glancing at you as you pass. A tiny pause when your sword hits, so it feels like it lands.

I said yes to almost all of it. Two I couldn't judge until I saw them, so they were built for me to try.

Weather that changes as you watch

The list missed the thing I noticed most. Real fog has thicker and thinner patches. Real rain swells with a gust and changes direction for a moment. Ours was the same everywhere until the weather changed.

Luckily the trees, smoke, rain and the sound of the wind all followed one shared wind. So changing it in one place moves them all together. Nine weather touches followed: wind that shifts and gusts, banks of fog, sudden squalls, sun breaking through cloud, mist that lifts as the morning goes on, and storms you can see coming.

The village from above in mist at eight in the morning, before the stream Before: morning mist, the same thickness everywhere.

The same view after the stream, the mist thinned over the village and lying in the low ground After: the same morning, the mist lifting as the sun climbs and lying in the low ground.

Too many helpers at once

Twenty-seven jobs is a lot, so each became its own item on a to-do list, with a helper to build it and another to check it. Then I went out and told them to go with their own recommendations if anything came up.

In the afternoon I got greedy and asked for up to seven helpers at once, to get through the list faster. That was a mistake. They were all trying to test the game at the same time and getting in each other's way, and "It's absolutely killing my CPU." We settled on three builders and one checker. I also asked why they were running so many heavy checks. Now each job checks only its own bit, and the big full check runs once at the end.

Two first-person views of the green, before and after: the after has dense grass round the hero's feet Before and after: thick grass round your feet, bending away as you walk.

Landing it

The pieces went in one after another through the afternoon, and that evening it was all in the game. A few things the helpers couldn't judge themselves, like whether the light shafts looked right, went on one to-do list for me to look at.

Two first-person views facing the evening sun, before and after Eight in the evening, before and after: the sun glows in the haze, and the grass is thicker at your feet.

What I learned

Asking what makes a game feel real got me further than asking for any one feature. None of these touches is big on its own. Together they're why the village feels alive when you stand still in it: cloud shadows crossing the fields, a crow lifting off a hedge, mist burning off the lake.

And more helpers didn't make it faster. It just made my Mac grind. Three builders and a checker, running fewer tests, finished the list by evening.

Building Brackenmere

G10 6 min read

Performance by construction

A week in, Brackenmere ran well on my Mac and I had no idea what it cost anyone else. One day of measuring turned performance from a clean-up job into rules the tools enforce, and an overnight blind review stopped the agents optimising away detail my kids would see.

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

G28 6 min read

A whole campaign in a day: first morning to Lantern Night

One evening I asked the agents for a whole story, and by the next morning Brackenmere had seven main quests, nine side quests, two named bosses and a finale on Lantern Night. Two reviews on paper and a playthrough by a fresh hero did most of the work; my own play found the rest.