SotA

The New Britannia Herald

Thursday, August 27, 2026

Work Log Podcast

Episode

Towers that missed, pets that refused, and a build that lied

The guard towers in the castle arena have been firing at nothing for years, and now they hit. Pets will finally attack another player when you order them to, fog of war covers sixty-seven overland maps, and sixty-five bosses have a trophy waiting behind their kill. Also a build that reported perfect success while shipping forty-four broken shaders.

In this episode

  • The arena towers stop being decorative
  • Pets can attack players again
  • Fog of war spreads to the overland maps
  • Achievements get records, trophies and an editor
  • A clean build hiding forty-four shader errors
  • The Options window row audit

Transcript

Hail, and well met, citizens of New Britannia. Lord British here, with an account of what your makers set their hands to yesterday. The towers that guard the ankhs in the castle arena have stopped waving their arms and started hitting people. Your pets will bite another player when you tell them to, which they have declined to do for rather longer than I care to admit. The great overland maps go dark until you walk them. And a slider in your options marked one thing has been quietly adjusting something else for years. Sit a while. There is a good deal here, and some of it is very funny.

Picture the two towers at the ends of the castle team arena. They guard the team ankhs. That is the entire job. A player from the other side comes up the lane, the tower turns, the tower fires, the animation plays, and the shot goes out to the forty metres of range the thing advertises. And nothing lands. Nothing has ever landed unless you were standing close enough to shake the tower's hand. About two and nine tenths of a metre. Those towers have been decorative.

Here is why. The tower aimed with a range of forty metres, but the attack it fired was authored as a burst measured from its own feet with a two metre radius. Anything past that was thrown away as out of reach. No miss message, no log line. The tower played its animation, looked extremely busy, and did nothing, which meant you could walk up the lane to the enemy ankh with a stone guardian on either side of you cheerfully missing. Clearing that radius drops the shot onto the single target path, which has no distance gate, so the range it aims with is the range that lands. Thirty metres now.

They also had no line of sight check whatsoever. Those checks are switched on by the shot reading as a ranged attack, and with nothing to say otherwise it was being derived as melee. A tower. Classified as melee. So we set the flag, and all the checking that was already written turned itself on. And because that mistake hides so easily, a new test now sweeps every creature in the project that cannot move, looking for the same shape, because anything that can walk covers for it by closing the distance itself. Seventeen of them exist. Besides the towers it caught both PvP flesh flayer plants, which advertise an eight metre pull and reach two and a half.

While we were in there, two more things. Damage could cross the boundary into the waiting areas of both special PvP scenes, so a player sitting in the Obsidian Trials cave, waiting their turn, could be hurt from the arena side. Both waiting areas now block all player damage in either direction, whichever side of the line the attacker stands on, and the castle arena's downstairs waiting rooms, which had never had any protection at all, got the same treatment. The server side hostility check had also not been counting team arenas as PvP scenes at all, so every hit landed in either of them had been recorded against the wrong verdict.

And then the fun part. Both arenas have powerups on the floor now. One appears at a random spot while a round is being fought, and the first player to reach it takes it. Wrath for weapon and magic damage, Swiftness for movement, Vigor for health and focus regeneration. Everyone in the arena is told who got it, so there is somebody to blame. They do not stack. All three sit on one exclusive channel, so a second pickup replaces the first, and the buff comes off when the round ends. Two players who touch the same one on the exact same frame settle it on the server lock every chest and every resource node in the game already uses. One of them gets it, and both of them see it go.

The placement was its own small comedy. Five spots per arena, spread symmetrically in the castle so neither team is closer to more of them. The Obsidian Trial floor is rocky rather than flat, so each spot had to be found by taking the lowest ground under it that sits within twenty five degrees of level. Two of the first five had landed on cliff faces of seventy one and eighty one degrees, which would have made for a memorable pickup halfway up a wall. And there is a new panel in the GM tools that drives whichever arena a GM is standing in, live: powerups on or off, how often, how long, spawn one now, or close the arena entirely.

Now the one that has been sitting there since the day the code was written. It came in from a team arena test. Two players on opposite teams could not get their tamed pets to attack anyone on the other side, while a summoned lich fought perfectly happily. That smells like a PvP rule. It was nothing of the kind. The command that starts a pet attacking required the target to have a creature controller on it. That check was standing in for the question "may my pet attack this", and it is a fine test for "is this a creature", which is a different question. Every player alive fails it. So every attack order aimed at another player has been thrown in the bin, in every scene, since the guard was written. Duels. Arena matches. Guild wars.

My favourite detail is the two lines of text sitting underneath that guard. They describe their argument as, and I quote, "target player name". So the branch was written for players, and then somebody fenced it off from players, and there it sat.

And here is why nobody ever reported it. A refused pet command printed the same generic line no matter what refused it. Your pet ignored your command. That was the whole message. So there was no difference a player could see between your pet being in a passive stance, you not being allowed to attack that person, and your order being discarded by a check that should never have been there. All of it looked identical from the outside. A refusal now names the rule that refused it, so you get a second line, something like, its stance is Passive, so it will not fight without an order. I think that is worth more than the fix, because it is what stops the next one hiding for years.

There was a second layer under it. The team arena factions were missing six rows from the table the creature AI reads, so a player who had not picked up a team read as neither friend nor foe. A pet whose owner had no team could not choose a target in the arena at all, and could hurt a bystander its owner was forbidden to touch. Those rows are in. Pets still refuse an order against anyone you are friendly with, which includes party members, teammates, and anyone in a waiting area.

Now, maps. Fog of war shipped as a dungeon feature, switched on by hand as each dungeon map landed. It is a rule now instead of a habit. Every adventure zone at tier five and above, surface zones included. Sixty seven maps start covered and open as you explore them, from the Novia wilderness and the shardfalls through Mistrendur and my own castle, which I am told is now dark until you walk it. I have no memory of it being that hard to find. What you uncover is stored against your account, so every character you own shares one map of a zone, and it survives you logging out.

The interesting part is that the reveal rule had to be split in two. Underground, revealing is done by casting sight lines out from where you stand, which is exactly right in a corridor. Walls stop them, and a room behind a secret door stays covered until you find it. Outdoors those same lines are cast flat at eye height, so the first slope in front of you stops them a couple of metres out. You could stand on a hillside and uncover a circle the size of a dinner table. And the radius was thirty metres, which on the biggest zones is less than one square of the map grid. Jotungrund is thirty one and a half metres to a cell. You could walk its whole width and uncover nothing at all.

Outdoors is a plain fifty metre circle now with no sight lines, which also keeps a fan of up to two hundred and fifty six rays from being cast every time you take a step through ordinary countryside. Underground is unchanged and keeps the rays, so your secret doors stay secret. The whole flip was computed from the zone tier table rather than typed in scene by scene, with a dry run that names everything it would change before it changes it. It can be turned off across the shard without patching your client, and turning it off deletes nothing you have uncovered.

Achievements had a very large day, in three pieces. The first is that they write down that they were earned. Until yesterday the game worked out your unlock state on demand against whatever the catalog said at that moment, which has two consequences. It could never show you a date, because it never knew one. And retuning a ladder moved what you had already earned out from under you. Each record now freezes the goal as it stood on the day you hit it. In the same pass, kill counters moved to precise per counter saves, because two characters on one account playing at the same time were each saving a total that had never seen the other one's kills, and whoever saved last won. Your counts add up now.

The second piece is that an achievement can hand you an item, exactly once, which is harder than it sounds. A title is easy to grant safely, because owning a title is permanent, so the game can always ask whether you have it. A trophy can be hung on a wall, put in a bank, or destroyed in a fit of pique, so its absence proves nothing at all. The handover is tracked by a token written into the deposit itself, which means a server that falls over halfway through can tell the difference between a lost receipt and a lost trophy.

The third piece is the one I like. Sixty five bosses now have a mounted trophy waiting behind their kill achievement. Thirty eight of those borrow a trophy the game already shipped. The other twenty seven were built out of finished plaque art that has been sitting unused in the project since the original import. The Cabalists. The elementals. The golems. The spiders, the scorpion, the skeleton. Nobody modelled a thing. It was already in the box.

They needed icons, though, because every trophy icon in this game is a photograph of the actual decoration rather than a painted illustration, so the generator renders them. The first pass came out backwards. These plaques happen to face away from what the engine considers forward, so a tidy three quarter camera dutifully photographed the back of every single head. A wall of beautifully lit skulls, all facing politely away from the viewer. Nineteen bosses still have no usable art, and they are named in the build report as an art request rather than being skipped in silence.

The last thing on that pile is Achievement Studio, an editor window for writing achievements as data. All four hundred and eighty achievements in this game were added the same way: edit a table inside the code, rerun the generator, commit the result. That is a programmer's workflow, and it was the only one there was, so a designer could not add a single achievement alone. Now they can. A new rung drops into the correct place in an existing chain, so a five hundred kill deed sits between the hundred and the thousand already there. Editing or retiring one affects people who already earned it, so the window asks first and keeps a written reason. And it is honest about the thing it cannot do: counting a brand new thing still needs a programmer to add one line, so the window says so and hands over the line.

Right. The embarrassing one. A client build went out reporting success. Zero errors. It was carrying forty four shader compile errors. Four on the Linux client and forty on the Mac. Transparent surfaces on Linux and projected decals on Mac were failing to compile and drawing as flat magenta. If you play on either of those and have wondered why a window or a puddle occasionally looked like a warning sign, that was us.

The reason nobody caught it is a good lesson and I want to say it out loud. The build machines keep a cache of compiled shaders, and a warm build only reports the ones it had to recompile. So the run that broke it reported four errors, and every run afterwards reported a clean zero, because there was nothing left to recompile and therefore nothing left to complain about. A green build and a broken game, at the same time, honestly. And the automatic audit we built for exactly this problem reads back what the editor running it compiled, and that editor runs on Windows.

The two faults were quite different animals. On Linux, a colour cycling effect gathered eight values into a little local array and picked one out by index. Those values live in a shared block of constants, and picking out of that block by a changing index is something the Linux translator refuses to do, while Windows compiles it without a murmur. On Mac, fourteen shader outputs across ten shaders had spelled the first of their several render targets without a number on it, and once you leave the number off, all its numbered siblings end up sharing slot zero. Both are fixed, and the new check reads the shader source itself rather than a build log, so it needs no build and no particular machine to run on.

Now, my favourite piece of housekeeping in a long while. Somebody went through every row in the Options window against every setting the client actually reads, and found four that were not doing what their label said. The best is on the Video tab. There is a slider marked Highlight Strength. It has been adjusting your reticle. The real highlight strength, which is the glow on targeted and interactive objects, could not be written by anything in the client at all, so it has sat pinned at full for every player since the day that row was labelled. If you ever dragged that slider and thought, hmm, subtle, you were entirely correct. It controls the glow now, and the reticle got its own row, called Reticle Brightness, which keeps the value you already had.

The second is a checkbox marked Disable Weather On Low Performance, which was inverted. Ticking it turned the weather back on. Leaving it clear was what turned the weather off. Go and look at that setting again if you have ever touched it. Third, picking a language saved your choice and then the dropdown snapped back to the old one next time you opened the window, which makes a saved setting look thrown away. It shows what you picked now. Fourth, the Clear button under the voice cache could stall the client for several seconds, because pressing it started the entire voice system up just to tear its cache back down.

That same sweep went over all two hundred and twenty nine client settings against every place that reads them. Three came back dead, and only three, which says something good about the state of the client. It also caught an Xbox trigger rebind that has never once worked, and three graphics settings the client works out from your own hardware that were being written into saved settings files. Load a settings file from a friend's machine and you pinned their texture limits onto your hardware for good.

Three things for anyone who mines, chops or skins. Gathering skill above grandmaster finally reaches the harvest swing meter. The target wedge grew at four tenths of a degree per level against a ceiling of a hundred and ten degrees, and seventy plus four tenths times a hundred is exactly a hundred and ten, so every level from grandmaster to the cap widened the target by precisely nothing. A skill two hundred miner and a skill one hundred miner played an identical meter. It is full rate to a hundred now and half rate past it against a higher ceiling, and levels past a hundred also soften how fast the wedge narrows between hits, so a master keeps a target they can still hit several swings into a chain. The marker speeds up fifteen percent per hit instead of ten, because at ten you could barely feel the ramp. And all twenty six numbers behind that meter are live shard settings now.

The blessings came down across the board. Of the three day blessings you find out in the world, greater agility drops from forty five dexterity to twenty five, the plain one from thirty to twenty, avoidance and elusiveness and both tolerances from twenty to fifteen, and the sun, moon, tamer and skill blessings come down with them. The penalty each one carries is unchanged. The attunement blessings that drop off a kill went from fifty to thirty. And the two agility tiers no longer run at the same time. They shared a channel that holds two runes, so anyone carrying both had seventy five dexterity instead of the greater tier's forty five.

A handful of things you look at. Long crafted and enchanted item names now fold in the hover tooltip rather than stretching the plate across your screen and burying your inventory behind it. Six skill glyphs were the same picture wearing six different names. Knockdown and all five zone effects were byte for byte identical, so four zone buffs on your buff bar were wearing the red attack border instead of the blue buff one. All redrawn. The status frames on your HUD unlock, move and reset from the right click menu on your own character now, and unlocking them takes effect immediately rather than at the next zone change. And the buff icons under a creature's name are a setting, with three positions, off by default, because each icon costs a draw call and a big fight is precisely where that adds up.

One I want to be straight about, because it touches money. The store and the game shard have been reading two different copies of the account records since a data restore on the twentieth. Anything bought after that snapshot writes to one copy while the shard reads the other, so it never reaches the player, and neither end raises an error about it. That one is diagnosed. It is not fixed yet. The fix depends on where the web stack lands after the server move, which is being decided separately, and either way the shard has to read whatever the store writes to. The whole cutover is written down now as four things that have to happen in a particular order, which is more than it had yesterday.

Sweeping up. We thought we had catalogued this game's buffs. Eight hundred and two effects, all carried by runes, with everything else listed as out of scope. Then somebody opened the other doors. Gear alone holds four thousand three hundred and fifteen stat effects across nearly two thousand wearable items, five times the entire rune list, and that is before crafted effects, skill rewards and the auras hanging on scenes. Six doorways in all, baked out now. Out of it came a page with all eight hundred and six buffs down one axis and all one hundred and ninety one stats across the other. Filter it to food, search for pie, and twelve meals line up with their focus and health side by side. I looked at that for longer than I will admit to. It also produced three changes to Shield of Air, the short version being that charging it no longer buys you cheaper absorption, and a focus potion pays out less while a focus shield is draining your bar.

The build farm fell over for ten hours. Every job died at its first command at twenty three minutes past six in the morning, because an automatic security update swapped a piece of plumbing on disk underneath a process that had been running since the fourth of the month. A program that finds a newer helper than the one it started with refuses to launch anything at all, and launching things is what a build machine does for a living. Nothing built between five past five and half four in the afternoon. There is a timer now that checks every ten minutes and restarts it, politely, once the queue is empty.

The rest, quickly. Twenty one tracker issues closed, most of them testers confirming fixes on the chaos shard, which is the least glamorous and most useful thing anyone did all day. The editor test suite had been sitting at exactly thirty five failures for eight builds running, which is more than enough red to hide a real break in. All thirty five are triaged and twenty are fixed, and most were checks pinning what the code looked like rather than what it had to do. A creature reaching for a special ability could throw an error and lose it, hit by two players overnight. Sowing seeds into a planter box left in a bad state now refuses politely instead of failing halfway through. Nine thousand one hundred and seventeen accounts whose names contain a space can be granted tester access again. And the Lord British wine bottle icon, drawn at four times the resolution it shipped at, now ships at a size where you can see it is a bottle.

That was Thursday. What I am looking forward to most is the first person who walks into a shardfall with the whole map dark and has to actually find their way home. We have been handing out the answers for a long time. That, and the towers, who are having their first good week since they were built.

Before I go. I asked one of the engineers how the new fog of war was coming along, and he told me, with a completely straight face, that it was a little hazy at first but it is clearing up nicely. He works with computers for a reason. Good night, citizens of New Britannia. Be well, and mind the dark.