SotA

The New Britannia Herald

Tuesday, September 8, 2026

Work Log Podcast

Episode

Town lots go to auction and the loading bar stops lying

Vacant lots in NPC towns will now be sold by auction, with a cut of the price going to the player who left. A loading screen that hit an error can no longer hang forever, and the reason we were blind to those hangs was that our own logging server had been kicking most clients off at boot for a week. Also: every rider in the game spent Tuesday morning frozen in the saddle, and that one was our fault.

In this episode

  • Vacant town lots sold by auction in gold
  • The loading bar that could freeze forever
  • Six bug reports, one avatar sunk in the ground
  • Fire warning rings pointing at the wrong ground
  • A quarter of vendor stock that would not sell

Transcript

Good evening to thee, citizens of New Britannia. Lord British before thee, with an accounting of what thy makers were about upon Tuesday. Land in the free towns shall now pass by auction, and gold shall find the hand that gave it up. The red ring that warns thee of fire has learned at last which ground the fire falls upon. A full quarter of the goods upon thy vendors would neither sell nor come home again. And that most patient of liars, the loading bar, can no longer hold thee at sixty four percent until the end of days. We begin, though, with a horse that would not walk, and that one was our doing.

On Monday we fixed a spell. Judgment fires a beam, and if you have the option switched on that keeps you standing still while you cast, the beam ought to be covered by it as well. It was not. A single step ended the beam and made rather a fool of you. So we taught the game to hold you still for any channel that is still running, which is a very tidy way of describing what happened next.

A mount is a channelled spell. The channel keeps running for as long as you are in the saddle. So on Tuesday morning every rider in New Britannia sat perfectly upright on a perfectly motionless horse, pressing the movement keys with growing feeling, until they gave up and dismounted. The option is on by default, so this reached everybody who owns a mount. It now holds you still for the two spells that walking really does interrupt, and for nothing else.

While we were in there we also found that the chicken mount was invisible while you rode it. Every mount is spawned hidden and then faded in by its own animator as it arrives underneath you, and the chicken's animator had been copied from an unused reindeer that has no fade written into it. So the bird was hidden on arrival and never came back. Riders have been sitting cross legged in mid air on a chicken shaped absence for as long as we have sold the thing. It fades in properly now, and there is a new test that checks all twenty nine mounts for both halves of that fade, because I would rather not have this conversation again about a stag.

Now the large one. When a lot in an NPC town comes free, whether the owner gave it up, let it lapse, or was foreclosed on, that ground has always gone to whoever happened to be standing on it with a deed in hand. First come. We have all seen what that produces, and some of you have set alarms for it. From this week those lots go to auction instead. Bids in gold, a clock, and a cut of the final price paid to the player who left.

The bidding is the part I like. You name a maximum rather than a price. Your whole maximum is held, and the server then raises you one step at a time and only as far as it has to in order to keep you in front. Whatever you did not need comes back to you when the auction closes. That means you can put in one honest number, close the game, go and have a life, and come back to find you either won at a fair price or were beaten by somebody who wanted it more. Raising your own bid costs only the difference, so going from a hundred thousand to a hundred and fifty thousand takes fifty thousand and the box tells you so before you confirm. Raising your own bid also does not extend the clock, because nobody was outbid by it, and so there is nobody who needs a chance to answer.

There is a window listing every town lot currently under auction: where it stands, how big it is, what it is up to, who is winning, and how long is left, with a button that spends a teleport scroll and takes you there to look at the ground before you spend money on it. Type slash auctions to open it. The lot sign itself and the region map both say when a vacant lot is being competed for, so nobody walks across a town to claim ground that is already spoken for.

The team wrote the gold conservation test before they wrote the auction, and it paid for itself twice on the first run. It found that a server dying at one exact instant during an auction close would have stranded the winner's leftover gold permanently, and that a game master taking a lot back afterwards would have refunded the winner a second time out of thin air. Both fixed. The test now kills the database at each write in turn and checks that the books balance every single time. Then a missing database index was caught before a single bid was placed. The auction table was documented as receiving its indexes automatically when the server starts. It does not. The first auction would have created that table with no rule enforcing one auction per piece of ground, which is the one thing standing between us and two people winning the same lot. Built by hand, and the migration record corrected so nobody has to rediscover it.

It is running on the test shard now, with the clocks turned down from three days to one hour for both the bidding and the winner's claim window, so a full run can be watched from start to finish in an afternoon.

Right. The loading screen. Some of you have reported town loads freezing below ninety four percent and simply staying there, at sixty four percent, at seventy six percent, forever. Here is why. The load sequence had no backstop for an error. If any one of the dozens of reads it performs each frame threw an exception, the whole sequence died on the spot and the bar parked on whatever number it had last written. We added three timeouts in August and every one of them sits above the point where this was happening, so they never fired. A load that hits an error now returns you to the overworld with a message that says so, and the specific reads inside the town equipment step that could throw are guarded.

That was the easy half. The hard half was one tester's machine that froze on every single world entry. Seven crash reports from that machine on September the seventh, all of them Windows application hangs, every one of them ending one to three frames after the equipment load finished, and not one of them able to say what call was blocking. The watchdog that exists precisely to answer that question retired when the front end handed off and was not running. And Windows only writes a dump when a program actually crashes. A program that has merely stopped answering gets nothing, so there was nothing on disk either. The watchdog now runs for the entire session, and after forty five seconds of silence on the main thread it writes a dump and an error log into the same folder the launcher already uploads. Each stage of the load now leaves a breadcrumb, so a hang comes back named.

And then the reason we had so little to go on. The boot telemetry we added on the twenty ninth of August pushed most clients over the logging server's rate limit inside their first fifteen seconds. Between fifty six and seventy four percent of all sessions were being kicked off the logging server at boot, every day, since the thirtieth. A kicked client then threw away every log line for the next four to five minutes. Which is exactly the first zone load. We spent a week asking the client to tell us what happened during the one stretch of its life in which we had taped its mouth shut. The limit is far more generous now, the client budgets its own chatter, and a disconnected client keeps its backlog instead of binning it.

The last piece was the heads up display. Entering a world scene loaded the entire interface in one blocking step, the last blocking load left in the sequence, and on that one tester's machine it stopped the client dead every time: the window froze as the bar reached the end and the server dropped the session after a hundred and thirty five seconds of silence. That is now fetched in the background. We shipped that fix in the morning, then discovered in the afternoon that the request was still being served the old blocking way any time a loading screen was up, which is the only time it matters. Fixed the fix. A slow load now reads as a slow load with the bar still moving.

Here is one that has been going on for years, under six separate bug reports, and it was one thing the whole time. Reading a letter dropped you into the floor. So did the sit emote, and the beg emote. So did mining. So did casting Light, and casting Heal, and summoning a pet, and simply standing in combat stance. The oldest of those reports is about a tamer's boot heels sinking into the grassy plains, and it has been open long enough to have opinions.

The collision capsule your avatar stands in was authored with its bottom edge about a hand's width above the soles of the feet. So the avatar has always come to rest around nine centimeters underground, in every state, at every moment. The reason you have not been complaining about it constantly is that the foot placement system, which is the thing that puts each foot on the actual surface underneath it, was hiding it for us, and foot placement only ran while you were standing still doing nothing. The moment you did anything at all, the floor swallowed your ankles. The capsule now rests on the feet where it belongs, and foot placement runs during every animation you perform while standing up. Seated, prone and upside down poses keep it switched off, which is correct for them, because a chair is not a floor.

The same day we found that dismounting buried you thirty eight centimeters into the ground until the next thing that happened to resize your capsule. The dismount code set the capsule's height and its center from two different numbers that did not agree with each other. Both come from the height now. If you have spent the last while wondering why your character looked short after getting off a horse, you were right, and I am sorry.

Now, creature area attacks. You know the red ring on the ground. Ice Field, Ring of Fire, Meteor Shower, a troll's ground pound, a frost giant's stomp. The ring is a warning: fire is coming to this circle of ground, kindly be elsewhere. Eleven of the ninety one ring attacks in this game were drawing that circle around the creature that was casting, while the attack itself landed on the creature's target. So you saw the ring, you did the sensible thing and stepped smartly out of it, and the fire came with you, because the fire had been aimed at you from the beginning. The ring is now drawn where the blast actually falls. Roars and blade sweeps really do go off around the creature and are unchanged.

Ice Field had a second problem underneath that one. A tester reported taking damage from a field roughly fifty seven seconds after the ice had melted, from a field that only stood for about twenty. The spell hands its target one long damage application rather than reapplying it on each pulse, and nothing was trimming that application when the patch of ice expired. The water resistance loss that a water specialist's field applies had exactly the same fault, and nobody had ever noticed that one. Damage taken while you are actually standing in the ice is unchanged.

And a small embarrassment attached. Two of the Ice Field test fixtures had been failing for a week and nobody had looked. A change on the thirty first of August added a fourth effect to that spell and inserted it in second position, which shifted the damage and the resistance shred down a slot each, and both fixtures were reading those slots by number. They are reading the right ones again. A test that goes red and stays red is worth about as much as no test at all.

Then the vendors. Player vendors in this world are carrying stock that was listed years ago, and a large share of it could not be bought by anybody and could not be taken back by the person who listed it. Buying gave you a flat "no longer available" while the item sat there on the shelf looking available. Reclaiming gave "failed to reclaim" and the listing did not move. The number is sixty five thousand two hundred and thirty two listings, out of two hundred and eighty five thousand in the database. Twenty three percent of everything on sale.

The cause is one of my favorite kinds of bug, the kind where the data is older than the code that reads it. A listing records which plot its vendor sits on. That field was added later, and when a field has no value it is simply left out of the record rather than stored as empty. So every listing written before that field existed comes back with nothing there. Both of the handlers that check it read nothing as meaning "the owner has just picked this vendor up and taken it away", and refused to act. No error to the player worth the name, just a polite refusal, on a quarter of the market, for years. One of the reports on this noted that a failed reclaim then retried itself two hundred and twenty three times before giving up, which at least shows commitment.

Both work now. And a reclaim repairs the rest of that vendor's shelf as it passes, so the first thing you take back fixes the ones behind it.

A few smaller things that will improve somebody's evening. If you have ever been over your carry capacity, you know the encumbrance penalty to Dexterity. It was one point per five pounds of excess weight and it had no ceiling at all, so a character hauling one thousand six hundred and forty four pounds against a few hundred pounds of capacity was carrying a penalty of more than two hundred points and landed on the hard floor of one Dexterity. Every other encumbrance penalty in the game was already bounded. This one now leaves you thirty percent of your Dexterity however absurd your pack, and the Dexterity row on your character sheet will tell you, when you hover it, what the weight is actually costing you.

Decorators had a good day. Dragging a placed decoration now keeps the preview under your cursor. The game was recording where on the item you grabbed it, and then spending that offset on the starting point of the placement ray, which converted the up and down part of your grab into sideways drift: a book taken hold of nineteen centimeters above its pivot came to rest a third of a meter away from the cursor, which is wider than the book. A decoration the game is highlighting under your cursor can also be picked up on the first click now, rather than the click running a stricter test than the highlight did and refusing you for reasons invisible by definition.

Your holiday lights got their colours back, and the explanation is worth thirty seconds. A multicolour strand was showing pale green, purple and orange bulbs where it should have shown red, green and blue. The bulbs were painted correctly the entire time. The problem is that their brightness was set high enough that by the time it reached the tone mapper, the part of the renderer that squeezes the enormous range of light in a scene down into what your monitor can actually show, it was well past the point where that operation can hold on to a saturated colour. Push a red hard enough and it comes out orange. Push a green and you get pale yellow green. Push a blue and you get purple. The strands glow a little less at night now, and that is what buys the colour back. The Crown Shop preview never showed the fault because the preview camera renders without any of that processing, which is a trap we have now written down.

Two things about finding your way. Devotionals are on the town map. Every shrine in Novia, and in player owned towns, now has a pin named for its virtue, and clicking the pin sends the wisp to it. And in a besieged town, the Cabalist power meter is visible for the first time, having been drawn in the same band as the compass all along, with the compass painting straight over it every frame. Sieges also stopped producing two copies of the boss at once, and a player walking out of a besieged town while hosting it for everyone else no longer deletes that boss and his entire army from under the people still fighting them.

The lightning round. Eighty six tracker items closed on Tuesday, and I will not march you through them. There was a solid run at other languages: French, German, Spanish, Portuguese and Russian clients no longer get an English "list is empty" staring back at them, inventory tabs and column headers now translate in eight languages, and three separate French labels that had been holding out were talked round. The immersive book reader took three fixes and now opens one book at a time, keeps its own buttons, and stops your page clicks from reaching through the paper and putting you into decoration mode on whatever the book was covering.

The tutorial on the Isle of Storms has been telling new players for years that a training dummy is nearby, when the dummy was standing twenty four meters behind them, well out of range of the skill it asks you to use. It is now five and a half meters away, and can be hit, which does rather help. Gathering nodes stop paying at their cap however you play the chain, after we discovered one copper vein handing out thirteen Meticulous Collections. And Gravidy caught two good ones, a search box on the tester board that gave up looking after the first page of results, and the worn item preview that swung your avatar out of the window when you tilted it.

On the tools side, the Editor now runs a census of duplicate object identifiers across all four hundred and forty seven scenes, and the results were a pleasant surprise. Ninety two duplicate groups across two hundred and eighty thousand objects, sitting in only seventeen scenes. One forest scene that everybody has believed for years produces around seven hundred identifier errors on every save has none whatsoever. It has had none since the start of September, and nobody had gone back to measure. There is a lesson in there about the difference between a number you remember and a number you check.

That is Tuesday. What I am looking forward to is the first genuine bidding war over a lot in Brittany, which I expect to be undignified, expensive, and enormously good fun to watch. My thanks as ever to the testers filing the reports that make days like this possible, and to a team that spent Tuesday chasing a nine centimeter error through six years of bug reports and caught it.

And now your groaner, which you have earned. We spent Tuesday flattening the ground under forty two housing lots and putting the rest of New Britannia's vacant land under the hammer. Which means that, for the first time in the history of this world, our real estate market is finally on the level. Good night, and mind your footing.