Episode
Chat, the combat bar and the whole HUD leave the old interface
A Sunday spent tearing out the old interface at speed. Chat, every NPC conversation, the combat bar and the entire in-game heads-up display all moved to the new framework, and the combat bar promptly arrived in the wrong corner of the screen with nothing in it. Forty-five NPCs got their voices back, taming collars stopped being stuck forever, and seven design deep dives went up for public voting.
In this episode
- The combat bar landed empty and undraggable
- The whole in-game HUD comes off the old interface
- Chat and NPC conversations move across
- Forty-five silent NPCs get their voices back
- Seven design deep dives open for public voting
Transcript
Good evening to thee, citizens of New Britannia. It is Lord British, come with word of what thy makers wrought upon the Sabbath. The old interface has surrendered its largest chamber, the very heart of thy screen. Chat, and every word thou hast with every townsperson, crossed over with it. Five and forty voices, long mute, speak again in Solace Bridge and Estgard and Resolute. The taming collar that would hold a dead beast forever and never again leave thy hand has been broken open. And our own combat bar, newly moved, arrived jammed in the corner, quite empty, and refusing to be dragged anywhere at all. That last one we shall take first, for it is the best story, and by some distance the most humbling.
So, a few hours after we moved the combat bar onto the new interface, a tester logs in and finds it shoved hard against the left edge of the screen. Every slot in it an empty box. And then, a little lower down, a second copy of all his glyphs, sitting there under a permanent red cooldown wash, like the ghost of the bar he actually wanted. He tries to drag the real one back to the middle. It will not move. Three separate faults, all from the same afternoon, all of them entirely ours.
Here is what happened. The bar was never centred, because its resting position asked the layout to work out the horizontal placement on its own, and for something floating free, that means the left edge. The empty slots were sadder. The piece that draws a combat slot on the new interface had been built a few days earlier and covered in tests, and then we switched it on without ever handing it the card art, the fades, the slide, the border, or the flash when two glyphs combine. It was a beautifully tested picture frame with no picture in it. And the ghost bar underneath was the old drawing, still going. The cleanup that retires the old interface runs once, when the game starts. Your hand deals fresh slots every time you change decks, and each new one arrives carrying its own little layer of the old interface along with it.
The reason he could not drag it out of the corner is my favourite detail of the whole day. The only draggable part of the bar was completely covered by its own slots. The one gesture that gets you out of trouble was sitting underneath the thing causing the trouble. There is a proper grab border now, and everyone starts centred once.
Now, the part I would rather admit than have you find out. Thirteen tests on that rebuilt bar all passed, cheerfully, while it was drawing in the wrong place with nothing in it. Every one of them read a setting off an element that had never actually been laid out on a screen. So we added one that mounts the bar in a real panel and asserts where it truly lands, and another that drives a slot and checks the slot changed, rather than asking the slot politely how it feels about things. All three faults were fixed the same day they were reported. Thank you to the tester who wrote it up carefully, with what he saw and where he saw it.
Worth saying what moved, because the bar is three things sharing one frame. The utility row you park items and glyphs on, the combat row that holds your hand in a fight, and the decoration strip that borrows the same space while you are placing furniture on a lot. They were always going to travel together. We had the combat hand rated as one of the five hardest things left to convert, on the strength of a fifteen hundred line state machine sitting behind it. That machine never had to move at all. It touches the drawing in about four places, so all it needed was to be told where the mouse is from somewhere new. And while converting the glyph charge track, we found that the little dividing marks along it have been stacking on top of one another at one end for years. The code spacing them divided one whole number by another and got zero every time, so every mark but one landed in the same spot. They spread across the track properly now. Nobody ever reported it. I suspect everyone assumed it was decorative.
That was the afternoon. The evening was the big one. The main in-game heads-up display is off the old interface. That is the casting bar, the melee charge bar, the control point capture meter, the resurrection shrine meter, the death countdown, the harvesting bar, the floating damage and healing numbers, your health and focus bars, your target's, your pet's, the equipment and encumbrance warnings, the mail and ransom and friend notices, the network trouble warning, the button row that slides in at the top right, the frame rate meter and the housing banner. Sixteen surfaces in one evening, and it closes the single largest item on the migration list. Four rows are left on that list, and only one of them can be picked up on its own. The rest wait on the login and character select screens, which go last, because login must never break.
Here is the bit the engineers are proud of and I think you will enjoy too. Not one shared interface file was edited to do any of it. Every piece of that HUD is the only copy of itself, so switching each one over is a line of code rather than a change to the enormous shared file that the whole team merges through every day. Sixteen surfaces moved and the file everybody stands on never wobbled once.
Planning that work also caught a bug that has been quietly insulting screenshot takers for weeks. When you hide the interface to take a clean picture, the old interface fades away obediently. Anything already moved to the new one had no idea the request was being made. So the charge bar, the combat bar, your equipped deck, the party list, the timers and the centre message banner all stayed right where they were, in your beautiful scenic photograph, still catching every click you meant for the world behind them. That is fixed, and fixed in the shared foundation rather than in each piece, so the ninety or so windows already on the new framework all inherited it, and everything converted from here on gets it without anyone having to remember. A test fails the build now if someone adds a new window that neither inherits the behaviour nor opts out deliberately. One case needed its own handling: hiding the interface while you were typing in chat could strand you completely, because the text box kept the keyboard, a hidden text box cannot be clicked away, and holding the keyboard swallows the very key that brings the interface back.
Chat also moved yesterday, and so did every conversation you have with every NPC in the world. Those two ride on the same foundation, so porting it once covered both. Your tabs come across, with their names, their text sizes, the channels each one shows, and whether you had the window pinned. Window position and size reset exactly once, because the old frame and the new one describe position in different coordinate systems, and reusing the old numbers would have put your windows somewhere silly. Set it once and it stays. The conversation window got something it never had: you can drag it, resize it, and it remembers where you left it, where before it was nailed to one spot on the screen forever.
The interesting work underneath was linking an item into chat. When you do that, the line you are typing exists twice over. There is the version the server receives, with the full item tag buried in it, and the version in your box, showing just the item name. The old code held those two together with a pair of lists of character positions, nudged by hand on every single keystroke, plus three separate checks whose entire job in life was to notice the positions drifting apart before they broke something. So we stopped storing positions at all. A line is now a list of runs, each one either text you typed or one whole link, and both versions are just those runs joined up. Typing, backspace, delete, paste, cut, typing over a selection, all one rule. Moving the cursor becomes a non-event. Two hundred and fifty one lines of hand rolled arithmetic became forty nine, and the three drift detectors went in the bin, because a line held that way cannot drift.
There was a colouring bug in there too, and I love how it was fixed. A chat line gets wrapped in its channel colour, and a clickable link inside that line chops it into pieces. So the colour opened at the start was being closed at the end of the first piece and never picked up again. The link, and every single word after it on that line, came out plain white. Lines without a link looked perfect, which is why it read as a link problem for so long. The fix already existed, in an entirely different part of the game: the code that lets a book keep its formatting across a page break is answering exactly the same question.
And then there is what we found while pulling chat apart. There is a whole Discord integration in there. Twenty four guarded blocks across the tab, the tabbed window and the chat foundation, plus three entire classes for a channel list that nothing in the game could open. About five hundred lines. It sits behind two build switches that are not turned on in any build and never have been, in the entire history of this game. Not one player has ever run a single line of it. It is gone now, and I would like to think it went peacefully.
Four other things would each have broken chat outright on its very first frame, and three of them are traps waiting for every window still to be converted, so they are written down. Asking which window is in front reads a piece of the old framework that a converted window never builds. Pressing return to send would also have reopened chat on the same frame, since the input gate deliberately lets return through. Six chat windows would have shared one saved position and stacked neatly on top of each other. And the fade that hides chat when you stop using it asks whether your mouse is over the window, in a way that only understands the old framework, so it would have answered no forever and faded the window out from under your own cursor while you were typing in it. The teardown that retires the old drawing needed real care as well, because on a chat tab, the button that opens the tab options menu sits underneath a piece of decoration. Delete the decoration, delete the button. Strip too little and the old window draws over the new one. It now deletes the things that are nothing but drawing, and strips the drawing off everything else in place.
Now for my favourite fix of the day, and it has nothing to do with interfaces. A player reported that Eugena, in Solace Bridge, had no voice. She was not the only one. Forty five NPCs across the world had never spoken a single word, and they all had the same fault: most of the townsfolk of Estgard and Harvest, the barkers in Artifice, three children in Resolute, two mages out in Superstition Canyon, Emilia in Sanctus Spine, Arnice DeMalo, and, best of all, the Forgetful Ghost.
A ghost. Who could not remember to speak. I could not have written that one better if I had tried, and believe me, I have tried.
The recordings existed the whole time. Every one of them. They were filed under a name that differed from the one the game asks for, so the game asked, and heard nothing back, and shrugged, and the character stood there in silence. All forty five have their voices now. To stop it happening again, the casting tool reads a character exactly the way the game reads it, and sweeps the entire world checking that every voice is filed under a name the game will actually ask for. There was a related oddity fixed too, where a name that stops covering both sexes could leave the remaining character inheriting the voice belonging to the one that moved out. Which is how a boy in Ardoris ended up speaking with a woman's voice for rather longer than anyone would like.
Two skills also got their voices, in a manner of speaking. Fireflies and Clumsy have been completely silent since forever, because neither had any audio authored on their effects. The tempting fix was to put a sound on the effect they share. That effect is also used by Absorb Impacts, Reckless Stance, Taunt and the armour bonuses, so the tempting fix would have handed the same noise to all of them, and I would be standing here next week explaining why your armour buff sounds like a bug. Each got its own cast effect instead, and there is now a test holding that shared effect silent. Enfeeblement is quiet for the same reason and is on the list.
The other thread of the day was research, and some of what it found is uncomfortable. Seven design deep dives went up for public comment, each one measured against the games that solved these problems before us: inventory, crafting, alchemy and consumables, armour, weapons, the enhancement bench, and taming and pet combat. Every proposal on those pages has its own discussion box and an up or down vote, no account needed. Tell us which ones you want first.
The finding that stopped me cold is about maximum durability. It is not a condition meter at all. It is the enhancement budget. Every masterwork and every enchantment spends some. Every failure spends twenty five of it, permanently. Repairs never give any of it back, and the bench refuses to work on anything below thirty. Add that up and a crafted one handed weapon can absorb five failures in its entire life. Which means the ten effect ceiling the system advertises has never once been reachable by any player, ever, on any item. The weapons audit was not much kinder. If you enchant a bow, a crossbow or a shield, you are offered three choices drawn from eleven, and all eleven are attributes, whichever of the nine gems you spent. Both archery enchants in the game are fitted to swords, maces, spears and wands, and to nothing that fires an arrow. And forty eight unique weapon parts ship with their bonuses already written, and no recipe makes a single one of them.
The alchemy audit measured all five hundred and thirty three consumables in the game and found that chain drinking is capped at about two and a half potions of value before the sickness system takes over, that nothing in the game grants Chaos Resistance, and that one aged whiskey is the only gathering buff in existence. And the taming plan opens with a bug printed right there on the page, in public, with the before and after tables: the pet level cap is applied before its bonuses rather than after them, so a grandmaster tamer whose cap reads eighty nine has been producing level one hundred and fourteen pets. Twenty eight proposals on that page, including a public vote on whether Episode Two's unmet pack animal promise gets honoured or formally retired. I would rather you decided that one.
Speaking of pets, taming collars no longer become worthless keepsakes. When a pet died and its resurrection window lapsed, the collar showed as empty but could no longer be traded, handed back to its tamer, sold, or even put in a storage chest, and there was nothing in the entire game that could reset it. Collars trade again once a pet is past saving, including all the ones players already have wedged in their banks. No action needed on your part. Travelling to another scene with a dead pet reached the same dead end, and so did losing a collar update during a loading screen, and both now clear themselves the next time the collar is worn.
A number of monsters in player dungeons have been standing perfectly still for a very long time. The spider room in Hilt Basement had sixteen of its thirty three spawn points sitting off the walkable ground entirely, so the spiders arrived, considered their situation, and stayed exactly where they were. Same story in the Ravensmoor lich room, The Fall throne hall, two rooms in The Rise, and the Lyceum room. The cause was a tool that records walkable ground rebuilding it from where a room used to be, before the physics had caught up with the room being moved. Rooms that happened to be authored square were unaffected, which is why it went unnoticed for so long. All of them are rebuilt. The spiders may now chase you, as intended.
Names floating in the world had a bad week and are better now. The dark edge that keeps a name readable over bright scenery was being drawn inward from the letter edges, and at nameplate sizes it filled the letters in completely, so a coloured name on a pet or a friend read as a dark smear. It sits behind the letters again. The text is back to the size it was authored at, and a plate no longer shrinks as you walk toward it. Separately, the names over player vendors, cash registers and placed decoration pets had shrunk to about a tenth of their proper size and read as a small grey smudge from any sensible distance. Those are back too.
The compass got its look back after its own move, with the ornate lettering, the halo behind the text, the bracket frame and the zone line at its proper size. It also learned something new. There is a wind arrow on it now, pointing where the wind is blowing, which is the same heading the flags in town are streaming to. Park somewhere breezy and watch them agree with each other. Three things about your inventory, meanwhile: bags group at the top the moment the window opens rather than after you click a heading, there is a new option to list what is inside your containers alongside the containers themselves, and rows have stopped announcing their contents twice in two different formats, which is how a bag could read twenty one of forty two, twice, side by side.
In the sweepings. The Oracle has spent its life confidently telling people their problem had never been reported, while being able to see four hundred and seventy five reports out of two thousand three hundred. It can see all of them now, including closed ones, which are usually the answer to "is this known", and it can look up a report by its number, which it previously could not do at all. The daily cap on reports had been removed in the code six days earlier but the service itself had not been updated, so players were still being stopped at five a day. Fixed, and its hourly capacity raised well over twice.
The tester tooling had a similar day. The in-game task board could only ever show the newest hundred tasks, which is awkward with three hundred and seventy six open, and it threw away everything you had loaded on every refresh. Both fixed. The deploy now tells the testers when a build goes live, instead of that being a hand step someone had to remember, which is how one nightly release left thirty nine tasks invisible. And fifty three tasks had been marked ready to test when testers had already run the pass and reported the change still failing, which is a rude thing to do to a volunteer. Those went back to us, with a note on each.
Elsewhere, all twenty five crash reports the Linux client has ever sent were false alarms, twenty of them from sessions that ended with a perfectly normal quit. A day of shard logs collapsed from a hundred and eighty two error lines to seven distinct problems, four of which were fixed on the spot. The public roadmap got its first proper pass since early July and grew from twelve done items to twenty two. Three crafting table faults went down, the recipe book stopped hiding its page buttons below the bottom of your screen, and a search matching nothing no longer freezes the book on whatever page it happens to be showing.
What I am looking forward to is the quiet. Four rows left on that migration list, and three of them are login and character select, which we save for last on the grounds that nobody has ever thanked a team for a brave change to the login screen. After that, the old interface has nowhere left to live.
And on that note. We have spent months taking the old interface apart, window by window, and after yesterday there is barely any of it left on screen. Which means that at long last, after all these years, we are finally drawing to a close. Good night, friends. Be kind to your pets, and mind the spiders. They can move again now.