Episode
The right-click that kept aiming at the middle of your screen
Friday was spent on the things that had been quietly wrong for months. Right-clicking a creature to command your pet works from anywhere on screen again, the Remember User Name box remembers, the text floating over people's heads got re-cut at twice the detail, and the character window was rebuilt around a model you can actually see. Also, ten invisible test bots set off four hundred and eighty-one fireworks from underneath the terrain.
In this episode
- The right-click that aimed at the middle of the screen
- Remember User Name, and the quit dialog nobody answered
- Nameplates and speech bubbles re-cut for readability
- The character window rework and its bigger model
- Test bots that fired fireworks with no bodies
Transcript
Hail and well met, citizens of New Britannia. Lord British before thee, with an accounting of what thy makers were about on the last day of July. The names that float above thy fellows have been cut anew, sharper and lighter than they were. The window that shows thine own hero has been rebuilt, and it will now show thee a hero rather than a postage stamp. The box that swore to remember thy name has been taught to keep that promise. And ten of our own phantoms stood in a courtyard and loosed four hundred and eighty-one fireworks at nothing whatsoever. But we begin with a bear, a pet, and a mouse pointer that was lying to everyone.
Picture it. There is a bear. You have a pet. You right-click the bear to send your pet at the bear, which is really the whole arrangement, and nothing happens. No menu. So you click again, the menu appears, the pet goes in, and the bear regrets its choices. And you assume you misclicked, because that is what people assume, and you have been assuming it for months. You did not misclick. Two separate pieces of our own code were working against you, and both of them were doing exactly what they had been told to do.
Here is what the right button actually does when you hold it down over the world. It hides your pointer and pins it to the center of the screen, so you can swing the camera around without the mouse running off the edge of your monitor. Perfectly normal. Every game does some version of this. When you let go, the pointer gets put back where you left it.
The trouble is the order of operations. When you released the button, the game announced that the camera swing was over, waited a couple of frames, and then asked a very simple question. What is under the mouse pointer right now? And it asked that question before the pointer had been put back. So the answer was always the middle of the screen. If the creature you clicked happened to be near the middle, which it often is, everything worked and you never noticed a thing. If it was off to one side, the game looked at a patch of empty grass, found nothing worth a menu, and gave you nothing. It was not ignoring your click. It was answering a question about somewhere else entirely.
The fix is to stop asking. The game now remembers what you were pointing at at the moment you pressed the button, before any of the pointer trickery happens, and builds the menu from that. And if the creature has died in those few frames, it falls back to looking live, so you do not get a command menu for something that no longer exists.
The second cause is subtler and I like it more. Right-dragging turns the camera, and the game quite reasonably refuses to open a menu if you were turning the camera, because you meant to look around, you did not mean to click on a rabbit. It measures that turn using a smoothed value, the same smoothing that keeps camera movement from feeling twitchy. But the smoothing only runs while the button is held down. So when you finished a swing and let go, that value did not settle back to zero. It froze wherever it happened to be, part way through its curve, and it sat there. The next time you pressed the button, the whole remaining curve got billed to a click during which the mouse had not moved a single pixel. Half a unit of leftover motion was enough to fail the test. Which is exactly why it always worked on the second try. Your first click was what drained it.
The filter now resets at the start of every gesture. As a bonus, that also removed a small lurch at the beginning of every camera swing, where the camera had been re-applying the tail end of the previous one.
Now the login screen, which has been insulting people since the form moved over to the new interface. The Remember User Name box stopped remembering. That is bad enough on its own. What it was actually doing was worse.
The form asks to be filled in with your saved details right after it builds itself. Except it builds itself in two steps, and the boxes to be filled in do not exist yet at the moment the filling happens. So the saved name went on the floor, and the screen came up blank with the box unticked. Then you typed your name, pressed Log In, and the game looked at that unticked box, concluded you did not want to be remembered, and wrote an empty name over the one it had been faithfully storing. So it did not merely fail to remember you. It took the trouble to forget you, once per login, on your behalf.
That is half of it. The other half only fires on patch day, and it is my favorite bug of the week. Settings in the client sit in memory until the game shuts down properly. On patch day the launcher wants the game closed so it can update the files, so it asked the window to close, and then killed the process outright eight seconds later. Meanwhile the game, being a well-mannered piece of software, responded to that request by popping up a dialog asking whether you were sure you wanted to quit. You were not there. You were over in the launcher, watching a progress bar. Nobody ever answered that question. Eight seconds later the process died with every setting from that session still sitting in memory, unwritten.
So we had built a polite little conversation between two programs, one of which was asking a question of a person who had, by design, gone off to look at the other one.
Three changes came out of it. Your login choice is written to disk the moment you press Log In, so it is not waiting on a clean shutdown to survive. The launcher now asks the game to shut itself down through its own quit path rather than closing the window, which means a character standing out in the world sits out the logout timer properly and nothing you changed that session is thrown away. And the wait before a forced close went from eight seconds to forty-five, to leave room for that timer. Anything still running at the end is still closed the hard way.
There was one more from the same family. The game stamps a version number into its settings file whenever it clears that file out, and the stamp was being written without ever being saved. So a session that ended badly lost the stamp, and the next launch looked at the file, decided it did not match, and wiped every setting all over again. That one is fixed too. And a remembered user name no longer drags a stored password along behind it. The password box stays empty on every build now.
Now something you will see the moment you log in, and I mean the moment. We re-cut the text that floats in the world. The name over a character's head, the title and guild lines underneath it, speech bubbles, and the town labels out on the overworld map.
Three problems had stacked on top of one another, and each made the others worse. First: every one of those labels is authored asking for bold, and not one of the typefaces involved actually owns a bold cut. So the renderer obliged the only way it knows how, which is to inflate every letter outward until it looks heavier. Push that far enough and the holes inside your letters start closing up. We were pushing it three quarters of the way.
Second: the black outline around those letters. That thickness is measured as a fraction of the room the letter shape has to work in, and the shared setting was eating about a third of it. The version used for party members was sitting at the absolute maximum the renderer allows. So a fair amount of what you were reading was not a letter with an outline around it. It was an outline with a letter somewhere inside.
Third, and this is the one that made walking up to someone pointless: all three of those faces were baked into their picture sheets at a size chosen for reading at a distance, one of them into a sheet not much bigger than a postage stamp. Get closer and there was simply no more detail to give you. And the sharpening setting that would have helped had never been written into the materials at all, so it had been sitting at zero since the day they were made.
All three faces are re-baked now at roughly twice the detail, into sheets up to four times the size. The fake bold came down from three quarters to a tenth. The outline came down to well under half of what it was. Sharpening is on. And the shading that runs down each letter got lightened a great deal, because a dark bottom edge on a letter that is already outlined in black is just more black.
One more thing was hiding in there. Some labels are authored wanting a fine one pixel outline instead of the heavy one, and the slot where that material should have lived was empty. When that lookup finds nothing, it falls back to the thick outline. So every label in the game that asked for the delicate treatment had been getting the sledgehammer. The material exists now, and it is wired in. Six new tests hold all of this in place. They pin the ceilings on outline and bold, and they check that each material still agrees with its picture sheet about size and scale, which is the tripwire that catches a font re-bake somebody only got halfway through.
The character window got its rework, and the first thing you will notice is that you can see your character.
The window is portrait shaped, taller than it is wide, as a window showing a standing person ought to be. The picture being drawn into it was square. So the square got shrunk down until it fit inside the portrait, which left your hero floating small in the middle of the frame with a generous helping of nothing on either side. Those pictures are portrait now as well. Same camera, same everything else, and the model draws twenty to thirty percent taller at ordinary window sizes, with clearance left for cloaks and two-handed weapons through a full turn.
Empty gear slots have their silhouettes back. The helmet, the ring, the boot, the little pictures that tell you at a glance what goes where. The interface conversion had replaced every one of them with the name of the slot in text about nine pixels tall, which is less a design than a ransom note. Thirteen of those pictures are restored, dimmed to the way they always looked. Slots that never had art, like crafting tools and pet gear, keep their word instead. The mannequin and the doll cabinet picked up the same treatment.
And the Show More button is gone, replaced with tabs along the bottom of the window. Character, Stats, XP, Pet and Titles. Stats is everything Show More used to hold, plus weapon damage and spell damage, which had been built at some point and then never shown to anybody, plus new sections for attunements, resistances and masteries. XP shows both experience pools, which until now lived only in a title tooltip and a small orb on your display. Pet reads your active pet's numbers and behavior live. Titles lets you change your active title right there. And the window reopens on whichever tab you left it on.
Then somebody sat down and reviewed the whole thing before it shipped, and found four problems. The best of them by a distance: using a dye is allowed to be the first time you open the character sheet in a session. The preview would start before the window had finished building itself, so the window came up on whatever tab you had left it on last time, which covered up the character whose color you were being asked to approve. A confirmation prompt for a change you cannot see. Very confident. The resize grip in the corner was also sitting over the right end of the last tab and eating clicks meant for it. The XP row was pairing a lifetime total with a percentage of your current level, so its two numbers argued with each other. And the mastery tooltips carried a stray blank line. All four fixed, alongside twenty-three new tests over the tabs themselves.
Now my favorite thing on the whole list, and it is not even a player-facing feature.
We have test bots. They log into a shard, hold their connections, count toward the population, and let us find out what happens when a great many people are in one place. Until Friday they had no bodies. So you could fill a scene with them, watch the numbers climb, and see an empty room. Useful for measuring the server. Useless for anything you actually want to look at.
They have bodies now. They spawn as ordinary characters, spread themselves out around a spot you choose, and set off fireworks on a timer. And they do it the way you would. Each one joins the instance real players are already standing in, gives itself a firework, uses it, and uses it up.
The first live run against a test shard was ten bots, and three bugs came out one after another, each one hiding the next. The connection they use for logging was reaching for a fixed number that is correct on one shard and wrong on this one, so no bot ever finished connecting. Fix that, and every bot died about twelve seconds after arriving, because the server sent a perfectly ordinary reply about the contents of a bag and nobody on the bot side was listening for it. That was a hundred and eight dropped sessions in five minutes, avatars appearing and vanishing, and not one firework. Fix that, and the avatar's identity was going out in the wrong shape.
With all three fixed, ten bots held for ten minutes with no drops and set off four hundred and eighty-one fireworks. The fireworks were visible in the game. The bots were not. Ten separate displays of pyrotechnics going off in a courtyard with absolutely nothing underneath them.
Two pieces were missing, and each one told a different lie. The first was movement. Your spawn position only places a character for a moment, after which everyone else's copy of you steers toward a position it is being told about, over and over. The bots never sent one. So the position stayed at its default, and every bot slid to the middle of the world and settled in underneath the terrain. Listed in the player list, in the right scene, and buried.
The second was the flag that says a character has finished loading. That flag is the only route by which a remote character ever gets a model, and it was never being set. So each bot was a live object, in the right place, carrying effects, with no body to hang them on. Both of those are published now. Ten bots, visible, with nameplates, in a castle, firing fireworks, and no disconnects.
Three things about moving items around. A dragged item now draws in front of every open window. Anything that can double as a decoration, and that is a great many things including bottles and chairs, was being drawn on the older interface layer whenever you were standing somewhere you had permission to decorate. So dragging one between two open containers meant watching it vanish behind the window it was crossing. The icon now picks its layer every frame, based on where your cursor is rather than on what you happen to be holding. Double-clicking equipment in your own inventory equips it now, while loot and bank containers still take the item. And rings fill the first open ring slot instead of always evicting the left one, with a right-click option to give a particular ring a preferred side. That preference is saved on the ring itself and always wins, swapping out whatever is worn there.
The typing cursor now sits where your typing lands. Click into an empty box and the cursor drew high, and then the first letter you typed appeared below it. Three pixels in an ordinary box, and thirty in the large multi-line ones used for guild descriptions, item text, social notes and book pages. Those large boxes also start their text at the top now instead of floating it in the middle, which is what you want when you are writing a page rather than filling in a field.
At a crafting station, double-clicking a recipe no longer hauls the chat window in front of the station you are working at. Same for craft results, queue messages, repairs and salvage. Everything still lands in the chat log and can be searched back later, and the crafting window itself now shows the last three things the station said to you, with problems in the same red the recipe cards use for materials you are short of.
And one for the decorators. Resizing a decoration put two size numbers on your screen. The real one, which counted up and down as you worked, and a second panel parked over your own head that always read the same wrong number no matter what you did. That second panel was not produced by any code at all. It is a leftover from the old interface carrying placeholder text that got captured into a saved file years ago and has been faithfully stamped back onto the screen ever since. It showed up alongside every decorating message, not only resizing. It is gone, and so is the placeholder.
Forty-one tracker issues went closed on Friday, most of them the long tail of the interface rebuild. Tooltips, window pins, cut-off column headings, windows that would not close when they were told, and a good stack of verification tasks the testers have been working through. One deserves a sentence of its own. A pet shows its owner's name in angle brackets, and hovering over a debuff that pet had applied showed those brackets spelled out as four extra characters on either side of the name. The text converter was rewriting a bracket into a safer form to stop typed text from injecting formatting, and the new interface reads formatting but has no idea what that safer form means, so it went straight to the screen as nonsense. It now wedges an invisible character behind the bracket instead, which is exactly what the nameplates over your head have always done, and which is why they never had the problem.
The automated test suite is fully green for the first time in weeks. Seven thousand one hundred and eight passing, none failing. It had carried a red tail long enough that the size of the tail kept moving, which is precisely how a real problem hides in a pile of noise. Four of the sixteen were the tests being right and the code being wrong. My favorite: the character sheet was supposed to shrink its equipment slots on a short window, and the code that does the shrinking had been disabled on the exact line that applies the size. Its own test had been saying so for weeks and we had been reading it as weather.
And a pile of measuring gear went in. The performance window now breaks a frame down into processor time, render thread time and graphics time, and its graph splits every column into two bars side by side, so a spike tells you which half of your machine caused it. There is a profiling build of the client now, which the publisher refuses on every patch channel so it can never reach a player, and a way to record a slow scene from inside the game while it is actually being slow, rather than guessing in advance which scene will misbehave. Test shard accounts also went from one character slot to three.
That is the day. A good one, and a slightly strange one, because so much of it was the team finally believing something a machine had been telling them for weeks. I am looking forward to walking into a town square, reading a stranger's name over their head without leaning toward the monitor, right-clicking them, and having something happen on the first try. Small pleasures, and they add up.
And before I go. Our typing cursor spent months sitting three pixels above the text it belonged to, and this week the two of them were finally brought into line. Which makes it, I believe, the first successful character alignment in the history of this project. Good night, New Britannia.