Episode
The Saturday every character in the build became a ghost
New characters wake on the Isle of Storms without a body and must find the Magic Mirror to earn one, which briefly turned every character in the game into a spirit. Client crash reports that used to arrive with four useless lines in them can now be resolved into real function names, and the first two run through it were one defect. Bard songs work in a fight again, the start-up freeze is fixed, and the Oracle answers in the language you play in.
In this episode
- New characters wake as spirits and find the mirror
- Crash reports that named nothing now name everything
- The blank window that lasted five minutes at start-up
- Bard songs return to the fight, visibly
- The Oracle learns fishing, and your language
Transcript
Good evening to thee, citizens of New Britannia. Lord British here, with word of what thy makers were about upon Saturday last. New souls now wake upon the Isle of Storms with no body at all, and must seek out the Magic Mirror to be given one. The bards may play in battle again. A crash that would tell us nothing has been made to talk. And the Oracle will answer thee in thine own tongue, whichever tongue that may be. We begin with the ghosts, of which there were, for a few hours, considerably more than anyone had ordered.
Here is where I found us at about a quarter to four on Saturday afternoon. Every character in our build was a ghost. Not the new ones. All of them. Yours, mine, the ones with years of dust on them. You logged in, you were a spirit, and there was no route back out, because the spirit state was built as somewhere you pass through on the way to having a body, and nobody had ever needed a door on the far side of it. The cause was a fix we made that same morning, for a bug that was more or less the exact opposite.
So let me back up. Years ago we moved character creation out of the world and into the screen before the game starts. Sensible at the time. But the Isle of Storms was built around a different idea, which is that you arrive on that island without a body, as a spirit, and there is a Magic Mirror on the shore that gives you one. When creation moved to the front end, that mirror became scenery. A lovely prop with a light on it. Two tutorial hints still pointed at it. A quest step was still sitting there, waiting for somebody to use it. It has been waiting quite a while.
That is over as of Saturday. The screen before the game now asks you for a name and nothing else, and it asks on the character screen you are already looking at, with no loading screen and no character model. Then you wake up on the island as a spirit, you meet Arabella, and you walk down to the mirror, and the mirror is where you choose your gender and build your face. The lunar rift will not carry a spirit anywhere until you have. And I should tell you why the name step had to move at all. The old one ran inside the appearance editor, and that editor draws an enormous mirror behind whatever it happens to be showing. It could not be switched off, because it is a fixed part of the backdrop and nothing on that screen owns it. So every new player met a mirror, in order to prepare them for meeting a mirror.
The island did not take all this quietly. Anais, who guides you through your first steps, was switching herself off within a second of appearing. There are seven copies of her placed around the tutorial, each with her own pressure plate, and every one of those copies was claiming the same network identity. So the game looked at seven Anaises, concluded that six of them were impostors, and switched them off. It was not wrong, exactly. It was simply switching off the six you happened to be standing next to. They each carry their own name now. And then the Magic Mirror itself, the one screen in this entire game whose only job is to ask you a single question, had both of its answers greyed out. Female and male, both faded, neither would accept a click.
Both work now, and the figure in the mirror changes the moment you choose. Gender also sticks, which sounds like something that should not need saying out loud. Your character record carries its own answer, and the client will throw away a saved appearance that disagrees with it, so the first appearance you ever save writes that answer into both places at once. Changing your look later at the New You shop still leaves your gender alone. There are fifteen tests holding that arrangement together and another nineteen on the name box by itself, one of which reads the server's own length rules so the two can never drift apart and leave you with a Finish button that fails for no visible reason.
Which brings us back to the ghosts. The morning fix was for the opposite complaint. A character with no body was starting as a solid figure, while everybody else started as a spirit. So we moved the check. And the check now ran before your appearance had finished loading, and in that moment, before the appearance arrives, every character in the game looks exactly like a brand new one. So every character in the game was told it had no body. And the spirit state, as I mentioned, has no exit. The check happens after the appearance arrives now. Found and fixed the same afternoon, about seven hours after we caused it, which is roughly the useful lifespan of a mistake if somebody is watching for it.
Now, the crash reports. When the shipped client dies at a low level it sends us back a stack of what it was doing at the time. Ours were arriving with four lines in them, all four the same name, all four useless. For months we have been diagnosing those from the last few lines of the log and a certain amount of prayer. But the frames were never actually missing. Here is what was happening, and I like this one. The shipped build publishes almost no names for itself. So when the crash handler goes looking for the name of the code at a given address, and finds no name at that address, it does the only thing it can do and hands you the last name it passed on the way there. Picture a street a hundred and thirteen megabytes long, where one house in ten thousand has a number on the door. Ask anybody where a given house is, and you will be told, with total confidence, the number of the last door that had one.
The names were never lost. Every build we make already archives its full debug symbols, and nothing in the world was reading them. So on Saturday morning we built the thing that reads them. Hand it a crash report and it works out which build that client was, finds that build's archived symbols, reaches into the archive and pulls out only the one piece it needs without unpacking the rest, and turns those four identical lines into real function names and real source lines. It caches per build, so a second report against the same build comes back at once.
Then we fed it the two crashes from the last two builds. Different graphics vendors. Different builds. Different camera setups. Two reports that read like two unrelated problems, and they resolve to the same point in the same piece of cleanup, the one that runs when a scene is torn down as you leave a zone. One defect. Confirmed against the compiled binary rather than guessed at from where the log stopped. We have given that cleanup a breadcrumb as well, since it was writing its timing line only after it finished, and therefore never wrote one at all on the occasions it died. And we found something else while we were in there. A crash report carries a note about where you were when it happened, and that note was being written exactly once, at the start of your session. So a crash five hours later reported wherever you were standing when you logged in. On both of these it named the zone you were leaving instead of the one you were entering, which is a very small error that points an investigation in precisely the wrong direction for a very long time.
Speaking of things that waste your afternoon. Four testers' machines filed start-up failures inside forty-eight hours, and the symptom is the worst kind there is. You launch the game and you get a blank window. White, or black, depending on the machine. And it sits there. Fifty seconds on a good day. Two hundred and ninety on a bad one. Nearly five minutes of nothing at all, with no bar, no text, no spinner, no evidence the thing is even alive. Most people do not wait that out, and I do not blame them. I would not wait that out.
The cause is my favourite sort of stupid. At start-up the client asks for its largest collection of assets, the rune set, and asks for it in the background so it can get on with other work. Then it gets on with that other work by issuing a series of small loads that block until they finish. And every one of those small loads had to queue up behind the enormous background request that was already in flight. On a cold disk, one four kilobyte file took a hundred and twenty-four seconds to load. Four kilobytes. That file is smaller than this paragraph, and it spent two minutes standing politely in line behind the biggest thing in the game.
The whole boot is asynchronous now, in an order that cannot collide. The small tables everything needs go first. The rune set goes last. There is a frame between each step, so the window keeps responding while it works. And from the very first frame there is a thin loading bar with a percentage along the bottom edge, drawn without loading a single game file, so that it is on screen while your disk is still cold and still deciding whether it feels like helping. Any load that still blocks during start-up now names itself in the log. And there is a switch that puts one machine back on the old road without waiting for a build, because I have learned to leave the old road open for a while.
Bards. I owe bards an apology. If you were playing a party song and you struck something, or used any skill that was not a bard skill, your songs were locked out for sixty seconds. That is a long time in a fight. But that is not the part I am sorry about. The part I am sorry about is that the game did not mention it. The glyph looked ready. You cast it. The cast played. The song went out, landed for nothing whatsoever, and the only way to discover this was to look at your party and notice that nobody had the buff. A full minute, available for casting into a hole.
The lockout is twenty seconds now, and while it runs it appears as what it always should have been, a greyed-out cooldown sweep on the glyph with a countdown on it. A song the game allows you to cast will always pay out. And the arrangement runs one way on purpose. Fighting costs you your songs. Your songs never delay your combat skills. A bard can always drop the music and defend themselves. There are two shard knobs behind all of it so we can retune the window without shipping a build, and putting it back to sixty seconds with the trigger off gives you exactly the old behaviour, in case twenty is wrong.
And then there is this one, which I have not stopped enjoying. Until yesterday, the first blow you took while performing drew your weapon and put your instrument away. Reasonable enough, except that the song did not stop. So your bard would stow the lute, draw a sword, square up to a bandit, and carry on playing a rousing party anthem from nowhere. No instrument. No free hands. The finest bard in New Britannia. That is fixed. Being hit now leaves the weapon sheathed and the instrument out, right through the performance and the moment just after it, and Performance Stance stands over such a hit too. Drawing your weapon yourself still ends it, as does a non-bard skill, a jump, or being knocked flat. A pet picking a fight still draws your weapon, and we have not settled whether that is right.
The Oracle had a rough week and came out of it a great deal better. Start with fishing. Our entire body of help documents contained nine lines about fishing and not one word about bait. So if you asked the Oracle what bait you ought to use, she gave you the guide to magic. If you asked her why your bait keeps vanishing, she gave you the guide to mounts. She was not wrong that mounts exist. There is a proper fishing and bait guide now, covering the cast, the six fishing skills, cast range, how quickly rods wear out, why the depth of the water decides the size of the fish, why a good spot goes quiet, which bait suits which water, the rules about lava, where bait comes from, and what to do with what you catch.
Writing it uncovered something I would rather it had not. The game has twenty-six things that look like bait, and it recognises seventeen of them. The other nine are sold in shops and dropped by creatures and do absolutely nothing when you cast with them. We documented the seventeen, because documenting the other nine would be sending you out to spend gold on items that cannot fish. The nine are filed as a bug and they will be dealt with.
Then the part that made me put my coffee down. The Oracle answers out of written guides, and the machinery that hands her a document caps it at twenty-four thousand characters. Our What's New document had grown to a little over fifty thousand. So twelve of its twenty-two sections had never once been visible to her. Every bug-fix section. All of the balance changes. The skill-description corrections. Months of work she was structurally incapable of reading, and no error raised anywhere, because from where she stood the document simply ended. It is three documents now. The same cap had been eating half of a hundred and seventy-six row emote table, which is split into alphabetical bands. And there is a test suite over the shape of those documents, two hundred and seventy-six cases, checking that no section and no document exceeds what the reader can take. Six of them failed the first time they ran.
She also speaks as herself now. Ask her a gameplay question or file a bug and nothing changes at all: same tables, same guide named at the end. Ask her anything else and you get the Oracle, instead of a help desk wearing her name. This works because she was already an artificial intelligence long before we arrived. The Ultima Futura Automaton was built by the Titans, tells you she was created to assist you, and refers to conversations as consultations. Her register is precise and modern, so writing her means less flourish rather than more, and every distinctive phrase she uses is quoted out of dialogue she already shipped with.
And she answers in the language you play in. Your client has been sending your language on every single request since the day the service was built, and that value was being used for exactly one thing: filling in a row on a bug report. A German player asking a German question got an English answer. Her guides are still written in English and she translates as she goes, keeping skill and item names as they appear in your game so you can still go and find them. The catch we hit on the way is a lovely one. Her in-character example lines are written in English inside her instructions, and the model read those as the words to say rather than as a demonstration of manner. So gameplay answers came back in perfect German, while "who are you" came back in English. Fixed, and checked in German, Russian, Japanese and French.
Four more things worth your evening. Your install is about to lose some weight. The music was encoding at around four hundred kilobits a second, which is well past the point anybody can hear a difference on a background track, and twenty-eight of the files were being re-encoded at near-lossless rates from sources that never held that much detail. A hundred and thirty-nine tracks came down, and the install drops by about four hundred and fifteen megabytes. The sound effects got the same pass for roughly two hundred more, and close to three thousand clips that only ever play as positional sound in the world were folded to mono, because a spatialised source sums the second channel away at playback and that stereo image was never audible to anyone. The long tracks and nineteen ambience loops now stream off the disk instead of sitting decompressed in memory, which hands your machine back most of four hundred megabytes of wind, waves and cave drips.
The Brightness slider is an exposure control again. It had been reduced to a plain multiply running after the final image was made, so dragging it up took a finished picture and scaled the whole thing, blowing the sky and the torches out to white while the shadows stayed exactly as dark as they had been. It now moves the exposure going in, about three quarters of a stop either way, and a dark interior opens up the way you expect it to. While we were in there, Night Vision stopped washing the entire frame green and hanging a particle rig off your camera. What remains is the extra light, which was always the part doing the work. And being stunned no longer slams your motion blur to maximum and yanks your field of view to fifty degrees over whatever you had chosen.
Three things about your bags. The backpack was opening at a width that left the item name column about seventy-five pixels, so a brand new install showed you a list of possessions called "Cott.." and "Belt ..", with empty space still sitting in the window. It opens at six hundred wide now. Containers open a hundred pixels wider for the same reason. And Take All closes any loot window it empties, which used to be an interface option switched off unless you went hunting for it, so an emptied chest sat on your screen while an emptied ore vein closed itself. Requested by Traveller13, who spotted that the two disagreed.
If you killed any of the sixty-five bosses we added on the twenty-seventh, you unlocked the achievement and never received the trophy. The bake that regenerates our shard data was producing the achievement rule and the loot list separately, and the rule shipped pointing at a bundle the loot list did not carry, so the handover raised a warning and stopped. Both files are baked together now, and every trophy you are owed drains into your Reward Bank a few at a time over your next few logins.
Twenty-four tracker issues went down yesterday. Out in the world: a candle you had switched off came back with its flame and its glow and lit absolutely nothing, which is a fine ghost story and a poor candle. A stone bench in the Brittany Estates was labelled question mark, Simple Chair, question mark, punctuation included. A lake in Northwood would only mark itself on your compass if you first climbed into somebody's water tower. And a fallen column on the Isle of Storms had collision that stopped half a metre short of the end you can see, so a player could stand inside the stonework and peer out through it.
In combat and in the interface: auras that travel with you, Elysian Illumination and Immolation among them, were attacking creatures that had no quarrel with you, so a stroll past the Etceter Crag Bandits started a fight you had not picked. The four thrown alchemy bombs were asking for an Explosive Potion instead of for themselves, which is why the glyph named the wrong item and refused to throw with a bag full of bombs. Moon Beams learned to make a noise when it fizzles. NPCs stopped finishing their sentences to an empty street after you closed the window. The fog of war stopped going see-through whenever the map auto-faded. And the health bar over your head stopped trailing your name by a frame every time you swung the camera.
On our side of the wall, a confession or two. The test shard came up three times in one day advertising an address that means "this machine, right here" to anything that reads it, so you could log in perfectly well and then stop dead at fifty-seven percent, forever. The start script now works the address out for itself, refuses to start if the answer comes back private, and checks afterwards what the services actually registered. Our health panel logs in as a real player every five minutes from outside the building and walks all the way into a scene. Meanwhile the nightly build sat in a queue until a quarter to six in the morning, because the build machine had been rebooted and was sitting at its login screen, waiting patiently to be greeted. And a review of what we actually sign turned up the fact that the game client was signed by nothing whatsoever. That is being fixed as well.
That is Saturday. What I am looking forward to is the next build, when all of it arrives at once and there are people waking up on that island again with no body and a mirror to go and find. Come and make one. Bring somebody with you. And if the name you want gets refused, the box will now tell you why while you are still typing it, which is a good deal more than it has ever done for me.
One last thing before I go. Why could our new character not get a table at the tavern? Because she had nobody to go with. No body. She had not found the mirror yet. Good night, and be well.