SotA

The New Britannia Herald

Wednesday, September 2, 2026

Work Log Podcast

Episode

Forty-eight things stopped answering the mouse and one tooltip found them

A complaint about a planting bed tooltip uncovered forty-eight objects that had stopped taking clicks, dungeon entrances included. The crafting window's lot storage option now survives being reopened, three lot-sign lies got corrected, and fourteen dead leaderboards came back. A fourteen-hundred-item performance report was read properly instead of worked from the top.

In this episode

  • The forty-eight objects that ignored the cursor
  • Use lot storage survives reopening the crafting window
  • Three ways a lot sign was lying to you
  • Fourteen hundred allocation warnings, read properly
  • Every leaderboard in the game answers again

Transcript

Good evening to thee, citizens of New Britannia. Lord British here, with word of what thy makers were about on Wednesday. Forty and eight things in the world had stopped answering thy pointing hand, dungeon doors among them. The crafting table has remembered that thy storage chests exist. A lot sign went on selling a house its seller no longer owned, and no sweep ever came for it. Every leaderboard in the realm draws breath again. And a growing plant will now tell thee its own name. That last one is where the whole day started, so that is where we begin.

Here is where it starts. Someone is standing over a planting bed, running the mouse across a young apple plant, and the tooltip that comes up says "Medium planting bed." The bed. The wooden box the plant is sitting in. That is a small, ordinary annoyance, it got written up as a small, ordinary annoyance, and one of our engineers went to look at it expecting to lose an hour. About ten minutes in, he stopped. Went back. Checked something completely different. Then he checked forty-seven other things, every one of them was broken in exactly the same way, and some of them were dungeon entrances.

So. The day before, we had shipped a fix for something else. The Kobold Expeditionary Camp runs a wave battle in a ring, and sitting over that ring is an enormous invisible box, about thirty-five metres across, whose entire job is to notice when you walk into it. That box was catching the mouse. You would try to click a corpse and instead you would click the empty air in front of it. So we taught the cursor a rule. If a thing is made entirely of invisible pass-through volumes, and it has no prompt to offer you, it is scenery as far as the mouse is concerned, and the cursor goes straight through. That is a good rule.

The trouble hides in the words "made entirely of." The check looked at the piece of the object that carries the interactive behaviour, and only at that piece and the things hanging under it. On a planting bed, the interactive behaviour lives on a small child node whose children are the ten little planting spots, all of which are invisible trigger boxes. The bed's actual solid body is the parent, and its plant collision is a sibling. Neither one counted. So the game looked at a planting bed, saw ten invisible boxes and nothing else, and concluded the bed was thin air.

And it was not only planting beds. Pots and barrels. The haunted galleon's teleporter pads. Both rowboat teleporters. The shogun lightstrings. The ignitable scarecrows. The DJ turntables. And the giant statue dungeon entrances, which are the size of a house, and which the game had decided were a light breeze. For one day, you could walk up to a colossal stone statue that is a door into a dungeon, click it as hard as you liked, and receive the considered opinion of the engine that there was nothing there.

The fix stops guessing from shape and asks what kind of thing it is instead. A volume you walk into is always built as one particular family of switch, every one of the original problem cases belongs to that family, and nothing outside it can lose the cursor any more. The obvious alternative was measured and thrown away, which is the better half of the story. Widening the collider search to the whole object rescues forty-seven of the forty-eight. It also lets twenty-four hazard volumes back in, and the same check decides what you are allowed to attack, so all of those traps would become valid targets and we would get back the permanent auto-attack lock that took months to kill. There is a new test that walks every prefab in the project. Undo the fix and it goes red and names all thirty-eight offenders out loud.

Then the plant itself, which was the original complaint. The tooltip text was written years ago and was perfectly fine. There was simply nothing for the cursor to land on, because the plant art carries no collider at all, and a planting spot's own box is about seventeen centimetres tall, down at the soil. Point at the leaves and you sail through them into the bed underneath. Every growing plant now gets its own collider, sized from what it actually draws. It is measured in the plant's own local space, because each plant is turned by a random amount when it goes into the ground, and a world-space box would swell and shrink as it spun. It measures the close-up version too, because the distant version of the tree plants is a flat billboard that describes nothing at all. Mouse over a plant now and it says "Growing plant, apple," with a Watered or Needs Water line underneath. Clicking the leaves to sow, water and harvest works as well.

Second story. Four separate reports, across three builds, and three earlier attempts that all ended with the words "cannot reproduce." The complaint is simple. You are at a crafting table. You tick "Use lot storage" so the game will count the materials sitting in the chests on your lot. Every one of those materials reads as zero. The recipe tells you that you cannot make the thing. The thing is eight feet away, in a barrel.

Here is why it looked intermittent. The first crafting window you open in a session works perfectly. The window is reused. When you close it, it plays a little hide animation, and the interface holds onto that same window object the whole time, so walking to a second station hands you the same window back rather than a fresh one. All of its setup ran once, on the very first open. All of its teardown ran on every single close. So from the second window onward you were looking at something half dead. The box was ticked, it was lit, it was wired to absolutely nothing, and it was extremely confident about all three.

Three other things had died the same way, and nobody had connected them, because each one on its own reads as a separate bug. The recipe category dropdown stopped responding. The "Only craftable" filter stopped filtering. And the two item lists stopped following things moving in and out of your backpack. Setup and teardown are paired now, so all four come back every time the window opens.

It also explains the folklore. Taking a chest off the lot and placing it down again appeared to fix the problem, and it does, sort of, because placing an item asks for the counts by a completely different route that never goes through the window. So players found a ritual that worked, which is the worst kind of bug, the kind that teaches people superstitions.

The last piece is the one I care most about. This feature had no way of telling anybody it had failed. The reply carried no reason the client could read. Nothing recorded a failed or empty answer. The server walked past containers it was not permitted to read and said nothing about it. That is why three passes over these reports all died at the same place. A feature that cannot report its own failure is a feature you will debug four times. The client now warns you when the answer comes back empty, and the scene server writes one line for every request, saying how many chests it walked, how many it was allowed to open, and how many it skipped and for what reason.

Third. Three things about the sign standing in front of a lot, and all three are about that sign lying to you in a different way. The first one hurt somebody. A row house in Haven Ridge went up for sale on the twelfth of August for two hundred and twenty-two gold. A few days later we refreshed the test shard with a copy of the live world's data, which replaced all the deeds. The for-sale record was not replaced, because that record only exists on the test shard and the refresh does not touch it. So the sign kept advertising, under the name of a seller who no longer owned anything at all. Every buyer who walked up and tried was refused. And the person who did own the lot could not decorate it, because a lot with a live sale on it is frozen. An unowned lot in that state could never be claimed by anybody, ever again.

Now. There was a comment in the code, right at the point where the listing is checked, saying that a sweep would come along and clean these up.

There was no sweep.

Somebody wrote down that a thing existed, and the rest of us read it and believed it for years, and it was never there. There is one now. A listing whose seller no longer owns the lot removes itself on the next pass, the sign clears within a minute, the price stops being published, and a buyer standing at a stale sign heals it just by trying to buy. The data refresh drops those records now as well, so the next one cannot happen in the first place.

The second lie was a market lot advertising itself "For Sale with House," on a lot that cannot hold a house. That was reported by Knightrider. There is now one single definition of "a house stands here," and the floating label, the sign text, the owner status line and both confirmation dialogs all have a lot-only version that talks about the deed and the decorations instead.

The third was the price you could not read. The floating banner was positioned by the middle of its block of text, at a written-down two metres above the sign. The middle means the middle, so half the block hung below that point, and the tall hanging sign tops out at just under one point nine metres. The bottom half of the asking price was inside the sign board. If the listing had a reserved buyer, the extra line pushed it deeper in. The banner measures the sign it is standing over now, and sits above it, and extra lines grow upward instead of down.

Two metres is kept as a floor, on purpose, and there is a test whose whole job is to stop a future engineer tidying that floor away as redundant. The low stone marker that nearly every lot uses is a quarter of a metre tall, so measuring honestly would put its banner at about knee height, in the grass, behind your own legs. And the banner used to turn to face the camera on all three axes, so looking down at a lot tipped it forward and swung its bottom edge back toward the sign it was supposed to be clearing. It bowed politely back into the thing it was escaping. It only turns side to side now.

Fourth, and this one is invisible, which does not make it small. We run a tool across the whole codebase that reports patterns it does not care for. It came back with one thousand four hundred and twenty-four places where the game wraps a tiny value, a true or a false or a number, into a temporary object that has to be cleaned up afterwards. All one thousand four hundred and twenty-four were marked "Major."

When everything is an emergency, nothing is. So rather than working the list from the top, we read the code behind each category, which is slower and is the only thing that works. About six hundred and fifty of them are a single localization pattern that has been a deliberate design decision for years. Two hundred and sixty sit inside error and logging branches that never run on a healthy client. A hundred and twenty are the network layer doing the exact thing the network layer is built to do. Most of the rest happen once, or once per button press.

That leaves a handful that run on every frame, or on every message that arrives from the server, and those are the ones worth anybody's afternoon. Every inbound message gets decoded, and every true and every false inside it was making a brand new object. There are now exactly two, one true and one false, handed out forever. Every hover, press, select and tooltip in the old interface was making one. The scripting layer pushes the current time and the frame delta in every single frame. Two labels, your character stats panel and the vendor window totals, re-formatted their numbers every frame they were on screen, whether the number had changed or not.

My favourite is the terrain code that fades distant trees in and out. To do its job it asks the terrain for the list of every tree instance, and that request hands back a fresh copy of the whole array. It was doing that several times per tree, per frame, and writing the entire array back once per tree. On a forest map. It reads once and writes once now.

We gave the same treatment to forty-four places using the query syntax, most of which run once per console command. Three were on the frame path. One of them checked every island in the world, every frame. Another built name arrays on every late update. And the guide wisp, the little light that shows you where to go, copied the complete set of every location in the game into a brand new array every few seconds so that it could check whether one entry was in it. It can simply ask now. Over on the plugin side, the decal system was walking its pools by index inside a loop, every frame, making a throwaway object per pool for the entire length of the session.

None of that will show up as a headline frame rate number, and I am not going to pretend otherwise. It is pressure on the memory cleanup that runs behind everything, and that pressure is what a stutter is made of.

Fifth. Fourteen of the eighteen in-game leaderboards had been answering with an error since the thirtieth of August. Deaths, Anglers, Consumers, the three gold boards, and all eight career boards. What happened is that half of an expansion shipped. The client half went out in a build, and the service that does the actual counting was never redeployed, so it was still running the older counter and had no copy of the economy or progression pieces at all. The boards the window kept asking for did not exist on the other end. We redeployed the whole set, and every board answers now, including the empty ones, which come back as empty tables rather than a failure.

Then the thirty-day column needed a word. The daily rollup only recomputes today and yesterday, which is exactly right for a board that has existed for months and useless for a board that was born on Sunday. A brand new board would have shown a thirty-day total smaller than its seven-day total until the middle of September. That is still a leaderboard, in the sense that there is a board and there are leaders, but the arithmetic was doing something impolite. We rebuilt the last fortnight by hand. The Deaths board went from thirteen rows to forty-eight on the monthly view.

And the Achievements board published completely empty, while a hundred and ten accounts on the test shard were sitting on unlocked achievements. Achievement points are not authored yet, so every unlock records zero points, and the board was keeping only the rows with points above zero. It filtered out every human being with tremendous efficiency. It ranks on achievements earned until points exist, and the points column stays, reading zero for everybody, honestly. Two name columns were shaped for the wrong reader as well, one in a form only the game window could read, one in a form only the page could. Both decode properly now.

A few smaller things. Your first hour in the game was wrong in two ways, and here is the first one.

Anais on the Isle of Storms says your name back to you twice, and her voice cannot pronounce a player's name, so on any line that shows your real character name we play a version of the clip with the name taken out. Both of those lines were written so that removing the name left behind a wreck. "Of course I know your name's." Full stop. She sounds like a woman having a very small crisis in the middle of a sentence. The lines now read "Of course I know your name," and then your name, and "Got it," and then your name, both of which hold together whichever way they come out. Four clips were regenerated on her existing voice, and the nine translated copies of each line were re-keyed so they do not fall back to English.

The second one is that new characters had been training the wrong skill since the end of August. Casting Dash or Air's Embrace fed the experience to Gust instead. The starting kit handed out both of those skills next to a Gust at level one, and Gust has to be at twenty before either of them will train itself. The experience rule gives the whole award to a parent that sits below the level its child demands, and it did that faithfully, on every single cast. Gust and Flame Fist now start at twenty, and Stone Fist, Healing Touch and Light at ten, and there is a test that checks the whole prerequisite chain for every starting skill so it cannot drift again.

Three things about your pets. The recall drops your pet on a random spot about two metres away again, and pressing it a second time moves it somewhere else, so you can shake a pet out of a lava pool or off the line between you and the thing you are shooting at. A fix last month had replaced that with a fixed point directly behind you, which made pressing it twice pointless. Requested by inuphet. The catch-up teleport a pet does on its own still uses the predictable spot behind you, because that one wants to be predictable.

Your pet also no longer treats you as a wall. A pet standing behind you, told to attack the thing you are facing, was refused on a line-of-sight check because you were in the way, whenever the faction bookkeeping happened not to call you friendly on that particular frame. And a pet dying after its collar had moved on, with a new creature tamed over it, or the pet dismissed, or two collars swapped, hit an internal error that cut short the rest of the death handling for everything else in that fight. That report has been open long enough to have opinions of its own. It is fixed.

And three from a hands-on pass with the three dimensional book. The hotbar and the equipped deck strip step aside while a book has the screen, and come back on their own when it closes. The book opens filling the frame, because the camera used to fit itself once, against the closed book, and a closed book and an open spread are very different shapes. And turning a page makes a sound. That last one was missing from the flat book as well. Back and Next had been silent for years, and nobody ever mentioned it.

Quickly, the rest. A player dungeon that could stop loading part way through, when a room had lost its link to a neighbour, now steps past the gap and finishes, and the disconnected room still comes back to your inventory. A crash to desktop we had been chasing in the pathfinding code was not our code at all. Reading the memory dump itself, the processor had resumed in the middle of an instruction, inside a function it had entered correctly, which is not something software can do to itself. Ten of the sixteen native crash reports since the middle of August that told us which processor they came from are the same high-end Intel part, from the generation with the well-documented stability problem. The crash checklist now reads the processor model before anybody traces a single line.

Housekeeping, at speed. A commit gate that refuses a new item asset until it has been baked into the catalog that every game master and tester tool reads, written after sixty-one pieces of a book set shipped into the world invisible to every one of them. Data files pinned to one line ending style, which stops nearly thirteen thousand tracked files pretending to be modified when nobody has touched them. An old patcher toolchain and a dead analytics window left the client we are rebuilding, taking about twelve thousand lines with them. And build ledger rows for a fortnight of builds that had never been committed, which matters because the public patch notes are drawn straight out of those rows.

The tracker took a beating as well. Forty-eight issues closed. Most of the ones I have not already mentioned are window and tooltip complaints, and I would rather not read them out one at a time: panels too narrow to read the item names in, a missing box around a padlock, a sort arrow pointing the wrong way, a highlight that was red when it had no business being red. There is a whole category of bug where the correct fix is three pixels wide and the correct description takes a paragraph. We closed a great many of those.

What I am looking forward to is the garden. It is a small thing next to leaderboards and crash dumps, but I want to walk into a planted field and have every single thing in it tell me what it is and whether it wants water. That is the game working the way it was always meant to work, and for one day this week it was not. That is the news. Be well, be kind to your neighbours, and check your own signs.

And now that every plant in every bed will finally answer you by name, I think it is fair to say the fix has taken root. I have been sitting on that one since the first story of the show, and I want you to know that I enjoyed every minute of the wait.