Episode
Dragon breath that never burned anyone, and eight languages catch up
Monday's work fixed a whole class of area attacks that had been drawing themselves and hurting nobody, including dragon fire cones and lava channels. Sieges went back to being shared fights and now hold sixty-four players. Eight languages caught up on a month of untranslated text, and the team found out why the coverage report had been reading ninety-nine percent while whole features sat in English.
In this episode
- Hazard zones that applied no damage at all
- Sieges are shared fights again, sixty-four players
- Eight languages catch up, and the coverage report was blind
- The client took twenty seconds to close
- The inventory warning that cried wolf a hundred times
Transcript
Good evening to thee, citizens of New Britannia. It is Lord British, come with word of what thy makers were about upon Monday. The dragon's breath has learned at last to burn. Sieges are a shared fight once more, and hold sixty-four of thee at a time. Eight tongues of the realm have caught up with a full month of work. The game no longer takes twenty seconds to say goodnight. And a cow in Owl's Head has her name back where a name belongs. Come, sit close. I shall begin with somebody falling out of the sky.
So you are up high with fly switched on, you have had a lovely look at the countryside, and you switch it off again. Down you come. You land. And you die. Every time. Because the game looked at where you started, looked at where you finished, and worked out the fall damage for the whole trip. It was correct about the distance. It was wrong about everything else, and about you in particular, since you had been holding yourself up the entire way. Turn fly off up high now and your first landing is free. One landing, and only if you were actually up there, so nobody gets to bank a fall for later.
That is a fine warm-up. Now let me tell you about the dragons.
This is my favourite thing my team found yesterday. When something in the world is meant to hurt you by standing in a place, a cone of dragon fire, a channel of lava, the game marks out that place with a shape and then asks who is inside it. Simple enough. Except the part doing the asking only understood two kinds of shape. It knew boxes and it knew spheres. Anything authored as a capsule, or as a hand-built shape carved to fit, it did not recognise at all, so it asked nobody, and therefore hurt nobody. Twenty-five of these had been sitting in the world doing absolutely nothing.
A cone is not a box. A cone is not a sphere. So every dragon in New Britannia has been breathing fire directly at you, with sound and light and a great deal of conviction, and in the most literal engineering sense it was decoration. The lava channels down in the fishing dungeon were the same. Beautiful, glowing, warm to look at, perfectly safe to stand in. I would like to tell you we discovered this through careful telemetry. We discovered it because somebody went looking at every hazard in the game and counted the ones that had never once applied anything to anybody.
All twenty-five work now. Eight more were authored with no shape at all, which no code can rescue, so those announce themselves in the log the moment they switch on and the content team can go and give them a body. And while we were in there, two more problems in the same family. If another player dropped a Lightning Storm or a Ring of Fire or a Meteor Shower on you, and the two of you happened to be on different machines, the spell would draw itself, roll its numbers, and then leave your health bar completely alone. That is fixed. Your health bar and the fireball are in agreement again.
Body Slam also works on rooted creatures now. You root a thing so it cannot run away, then you charge into it, which is the single most obvious moment in the game to use that skill, and nothing happened. We fixed the code path for that a while back and the glyph still did nothing, because the skill's own data carried a separate rule that zeroed its chance to do anything whenever the target was rooted. Two gates, one open, one shut, and nobody had looked at the second one in years. Rend got a second pass too, so a bleed keeps the damage it opened with even if you walk around behind the target or swap weapons partway through.
Sieges next, and this is the sort of bug that hides in plain sight for a very long time. We have a matchmaking setting that lets you say how much you would like to share the world. Open, Party, Private. Perfectly reasonable. It applied to sieges as well. So if you told the game you would rather be alone, and then travelled into a besieged city, the game gave you a siege. Your own siege. A private one. All of it, yours.
A city siege is meant to be the whole town turning out. Instead you could stroll in on Private, take the entire thing apart at your leisure with nobody in your way, and never once wonder where everybody else had got to. And the game was doing exactly what it was told. You asked for solitude. It found you a war and cleared the room.
Sieges are always a shared fight now, the same way towns already were. Each besieged town still gets its own, so two towns under siege are two separate fights, but you and everyone else who travels to that fight land in the same one. Capacity went up while we were there. A siege instance used to hold eight players. It now holds sixty-four. If your setting is Private or Party you get a note before you go in telling you it does not apply here, and the same line arrives in your chat log when you land, so nobody is caught out.
There is a reason we were in the siege code at all, and I am not going to tell you what it is.
What I will say is that a plan was approved yesterday morning, it runs twenty-three steps across five waves, and by the end of the day five of those waves had landed. The groundwork, the whole server half, the client half, and a switch that stands the old system down once the new one is ready. There is nothing on your screen yet. There will be. I have been doing this a very long time and I am still not above enjoying a secret, so you will have this one when it is worth having and not a day before.
Now. Translation, which is a subject I hold opinions about, because a player reading half a sentence in their own language and half in mine is a player being told the game was not built for them.
Over the summer, work shipped faster than it could be translated. The dungeon builder, the town console, the guild finder, the addon store, achievements, item search, lot signs, trap wiring. If you play in German or Japanese, all of that arrived in English. So yesterday the team filled in about two thousand six hundred lines per language across German, Spanish, French, Italian, Portuguese, Russian, Simplified Chinese and Japanese, and cleared every stale line on top of that. Stale is its own quiet problem. When we edit an English line, its old translation is marked out of date and the game falls back to English until somebody looks at it. That was a hundred and sixty-six lines per language showing English while nothing anywhere reported a fault. That count is now zero in all eight.
Here is the part I actually want to talk about, because it is the good kind of embarrassing. Coverage is measured against a database of every string in the game. Every report we run, every percentage we quote, is counted against that list. So what happens to a line that never gets collected into the list in the first place? It cannot be translated, because no translator can see it. And it cannot be counted as missing, because the thing doing the counting does not know it exists. Invisible twice over, in opposite directions.
Two hundred and fourteen lines were sitting in that state. So were thirty-four titles, the ones at the top of every kill ladder, which went in during June and had never been offered to a translator at all. For weeks, every language reported around ninety-nine percent. The report was not lying to us. It could not see. There is now a check that refuses any change leaving a string the translators cannot reach, which is the only real fix, because the alternative is trusting a number that has already proved it can be confidently wrong.
And then a test caught the fill stepping on work that was already good. Two hundred and sixty-nine strings are registered twice under one name, once from code and once from the panel they were drawn on. The game reads the code copy first. Those had always been empty, so what you actually saw on screen was the panel copy, which in several languages had been reviewed by a human being. Filling in the blanks handed the win to fresh machine text over that review. On German, a hundred and twenty-one of them changed, including a formal and informal address that a reviewer had deliberately settled, a thousands separator that went missing, and a keyboard shortcut that moved. All two hundred and sixty-nine were rolled back and the duplication is now a bug of its own. The team also read forty-five lines per language by hand rather than trusting the automatic quality filter, which had flagged fourteen lines out of twenty-one thousand and been right about one of them. Reading by hand found thirty-two real faults, my favourite being a Russian line that had understood drawing a card as drawing a line.
Right. Something short and satisfying. How long does it take this game to close?
Twenty seconds. You hit quit, you sit through the logout countdown, the countdown ends, and then the window just sits there for the better part of twenty seconds, looking at you. Somebody finally measured where that time was going, and the answer is that the game's own shutdown work finishes in one and four tenths of a second. Everything after that is the engine carefully putting away every object it owns, tidying the house, folding the linens, for a process that is about to stop existing. The game now ends when its own work is done. The window closes about a second after the countdown instead of twenty.
While we were tidying, we removed the Discord chat relay. This let you sign in through Discord and mirror channel messages into your game chat log, and it has not worked for years. Its build switch was turned on in no build we ship. The library it needed was not in the project. The piece that drove it was taken out in July with the chat rework and nobody noticed, because there was nothing left to notice. So we deleted a feature that had already left, along with its chat channel, its colours, its saved tab settings, and four abandoned objects loitering on the chat tab. The community Discord links in the handbook are untouched, because those actually work.
Now the one I owe some people an apology for. "Some items could not be moved. Your inventory has been refreshed from the server." If you have played recently you have seen that sentence. Gravidy and Rinaldi both took the time to report it properly, which is the only reason we caught how bad it had become. That message was wired to every kind of failure the inventory could possibly have, it re-read your entire pack every time it fired, and quite often it fired when nothing had gone wrong at all. On the test shard it spoke a hundred and seventeen times in twelve days.
So the team went through the real failures underneath it. Consolidate All Stacks had been throwing every group of stacks at the server in one go, and the replies could cross over each other. It does one group at a time now, stops at the first refusal, and puts everything back if a merge never made it out the door. Moving a container full of bags between your bank and your pack had the same shape of problem, all the pieces at once, and a later piece could name a bag the server had already moved and renumbered. Those go one at a time as well and follow along with the renumbering.
Two more in the same pass. If you drag an item that is busy doing something else, or the collar your tamed pet is currently summoned through, the game tells you why instead of failing halfway and throwing your whole pack back at you. And if you try to set a container down on your lot while there are still bags with things in them inside it, the server stops before it changes anything and the game asks you to empty the inner bags first, rather than half doing the job and then reporting a bare error. Forty-three new tests hold all of that in place. And the warning itself now speaks only when a failed move really did leave your window out of date, which is the job it was hired for.
A few smaller things that will improve somebody's evening.
Your chat window has stopped having opinions. Every message explaining why a glyph did not fire, a fizzle, a press during cooldown, a target out of range, was forcing the chat window open and dragging it in front of whatever else you had on screen, so in a real fight it kept reappearing on its own. Rinaldi reported that one. Those lines still go to the log, the hotbar still flashes, the window stays where you put it. A whisper or a party line will still bring a faded window back, but it returns where it was rather than on top of your inventory. And a pin on a chat window survives a relog now, including a patch, which it never did before.
The weather reaches the world properly. Windmill blades turn at the speed of the actual wind, still in calm air and up to full speed once it picks up. Tree sway reads the same wind, so a Calm reading on your compass looks calm and a Heavy one looks heavy. Chimney smoke leans and streams instead of going straight up. They all read from one wind source per scene, so the smoke, the blades and the pennants finally point the same way. Item previews hold all of it still, so a windmill sitting in your backpack does not spin because of the weather outside.
Several things were simply drawn wrong. Buttons in nine windows had been rendering as bare labels with a hairline through them, because they all asked for a shared button style that had never actually been written, so they fell back to shrink-wrapping their own text. Catchphrases, mail, books, deco layouts, the deck builder and more have real buttons again. The character sheet was hiding your gold and weight behind a scrollbar, because the panel of numbers was losing a tug of war with the character portrait beside it and giving up about nine tenths of every missing pixel. And the obsidian bone armour carried exactly the same names as the ordinary bone armour, all five pieces, so no list anywhere could tell the two sets apart. Each piece is named for itself now.
You have some new choices as well. Ambient sound gets its own volume slider, so you can quiet a dripping dungeon without quieting combat with it. There is a checkbox to turn off the gathering mini-game and go back to the plain timer. There is a toggle to move with both mouse buttons while your weapon is drawn. A new command prints how much experience you have invested in every skill tree at once. Salvageable is back as a category on the crafting table. And links pasted into chat are clickable at last.
Now the fast part. A hundred and thirty-nine tracker items went down yesterday, forty-one of them bugs, which is not a normal Monday. A morning log sweep pulled just under two thousand error lines off the shard, collapsed them into two hundred and ninety-four distinct problems, filed fourteen new bugs, and then fixed nine of them by lunch. Including a siege catapult that could spawn invisible and unclickable, which would have made siege testing quite the experience.
Under the floor, the team took a chainsaw to the largest files in the game. Ten of them. Over a hundred and ninety thousand lines of code moved into smaller pieces grouped by subject. One was a menu file that had grown to twenty-two thousand eight hundred lines, which is not a file, that is a filing cabinet somebody has fallen asleep on. Another was seventeen and a half thousand lines of game server logic, now a small core and thirty-two companions. Not one line of it changes anything you can see. All of it means the next fix in those areas arrives as a small change instead of an expedition.
Elsewhere, the test shard was rebuilt on a fresh copy of live data, eight point eight million records restored, migrated and verified, with the whole procedure written up as a checklist so the next one is boring. Testers got a proper handbook, in game and on the web, including a chart of how a report travels from your hands to a fix and back. The server got a long pass making sure a bad value from a client bounces politely instead of causing trouble. And somebody swept every recipe in the game looking for a way to craft an item out of shop-bought parts and sell it back for a profit. They found none. That is the most boring possible result and precisely the one we were hoping for.
That is Monday. My thanks to Gravidy, Rinaldi, Wishdragon, Echondas, Mondravis and both Oops, who reported things properly and got them fixed for everybody. What I am looking forward to is the day I get to tell you what all that siege work is actually for, and I promise you it is worth the wait.
One last thing. Ophelia, the cow in Owl's Head, had her nameplate floating so far above her head you could read it from the next field. It sits where a name should sit now. And I said, out loud, in front of the entire team, that the previous state of affairs was udderly ridiculous. I am told I am no longer allowed near the bug tracker. Good night, my friends.