Episode
Standing still looked like running north, and dragons stopped getting up
Monday was a netcode day. A long-standing bug made a motionless player appear to sprint due north on everyone else's screen, and the team spent the day pulling apart how other players are drawn, measured and hit. Also, the ancient dragons lost their second life, the Charnel Pits finally look like pits, the community website got a real calendar, and our test runner was caught spending ninety minutes deciding which tests to run.
In this episode
- A player standing still ran north on every other screen
- Ancient dragons now fight in one life
- The Charnel Pits become actual dug pits
- Guild calendar live, and desk icons move again
- The test runner that wedged the shared editor
Transcript
Good evening to thee, citizens of New Britannia. Lord British speaks, with an account of what thy makers were about on Monday. A warrior standing perfectly still appeared, to every other soul in the scene, to be marching due north. The ancient dragons are granted one life apiece, and twice the blood to spend upon it. The Charnel Pits, which for some time resembled a tasteful gemstone, are pits again, dug in grave dirt and bone. And our own test runner was discovered spending ninety minutes deciding which tests to run. We begin with the marching, because it is the best story I have had to tell in a while.
So. Picture it. You are in a fight. You stop moving, because you are casting something, or because you have decided that standing exactly here is the clever play. On your screen, nothing happens, which is correct. On everybody else's screen, your character sets off north at a dead run. And if somebody knocked you back, or you were walking a follow command, or you were lying there dead, same thing. North. Full speed. This has been true for a long time.
The cause is one of my favorite kinds of bug. When your game tells everyone else which way you are moving, it packs that direction into a small number. Zero meant due north. Zero also meant no direction at all, which is exactly what your game sends when you are standing still, or being pushed, or following somebody, or dead. One number, two meanings, and every other player's copy of you picked the wrong one every single time. The fix is lovely. Due north is now written as three hundred and sixty degrees. Same direction, different number, so zero can only ever mean nobody is going anywhere. While they were in there, they also found that a start toward the south tripped a check for a sudden reversal, which held your character still on other people's screens for a beat before it caught up. Southbound players, my apologies.
Then there is the sliding, and this one has been happening to all of us for years without anybody being able to put a name to it. Two separate pieces of code were acting on every other player's character, every frame. One pushed them forward at the speed their last update reported. The other pulled them back toward the spot that update actually described, five times a second. On average the two cancelled out, which sounds like a happy accident and was nothing of the kind. The drawn speed pulsed between about half the real speed and nearly twice it, four times a second. Everyone in this game has been faintly surging and sliding at everyone else since we shipped. There is now one model that does that projection properly, with a bound on how far it is willing to guess, and legs and feet that follow the motion the character is actually drawn at.
Hits got the same treatment. When you land a blow on another player, the damage number, the sound and the impact used to arrive a moment after the hit, which is the single most common thing people tell us about fighting each other. Those can now appear the instant the hit lands, and a swing that ends up not counting says "No effect" over the target instead of leaving you to work it out. Blink, Night Step and Charge used to snap the other player back to where they started and then arrive a second time, so every teleport looked like a stutter. Stuns, roots and knockdowns now stop the target on your screen right away. Weapon swings and melee skills picked up the reach allowance against a running or strafing target that shield strikes have had for ages. And players in a duel pass through each other now, the way players outside of a fight already do, so you stop walking into an invisible wall where somebody was standing a third of a second ago.
Here is the part I like best, though. None of that was settled by argument. The team built a test rig that runs two game sessions on one machine, hands each one its own simulated delay, jitter and packet loss, and writes down where each session draws the other one every single frame. So every fix can be measured at a hundred milliseconds, which is a normal round trip inside the States, and at two hundred and forty, which is what our players in Italy and Brazil actually live with. The networking library's own lag simulator had been compiled out of the shipping build, which means the lag tools we thought we had were doing precisely nothing. We have our own now. There is also a load-test rig, so the same measurements can be taken with twenty or thirty characters moving in one scene, because a duel and a guild fight are different problems.
And now the important part. Every one of those changes shipped switched off. All twenty-odd of them. Nothing in that list is on tonight. They go on one at a time, with two players and the measuring rig, and any of them that makes the numbers worse comes straight back out. I have been doing this long enough to know what happens if you turn twenty fixes on at once and then try to work out which one ate somebody's duel. So the honest status is this. Monday was the day we found out what was wrong. Switching it on is still ahead of us.
Now. Let us talk about Rinaldi, who has had a week. Rinaldi filed three separate reports about the Charnel Pits, and every one of them was right. The first was about the look. All five pits in the world were wearing the Binding Stone's crystal shard with a color tint on it, which meant that a pit of writhing corpses presented itself to the world as a handsome dark gem sitting on the grass. The second was about the one in Myrkur, which had about seven hundred health, in a zone where the zombies shuffling around it have about thirty-four thousand five hundred. The third was about the pit in the Spectral Foothills, which sat on top of a hill you could only reach by leaving the zone through its north exit and coming back around.
All three are fixed, and the art fix is my favorite because it was built entirely out of things we already owned. A Charnel Pit is now a hole dug in the ground: eight heaps of grave dirt raised in a ring, a floor of mud, a pile of skulls half sunk into it, two spreads of bone scattered outside the ring, and one arm. The dirt mounds are the same ones the zombies claw out of at Solace Bridge, which is the right answer, because that is exactly what this thing is. The bubbles and the haze stayed. The name floats lower now, so it sits just above the pit instead of hanging in the air over it. The Myrkur pit takes the zone's level like everything else there, so it is a real fight on Normal and a worse one on Extreme. And the Foothills pit moved down into the hollow about fifty meters from where you arrive, with its waves and its Charnel Glutton intact.
A pit of the dishonored dead should be a hole in the earth, full of mud and bones and regret. It should not be jewelry. Thank you, Rinaldi, three times over.
Dragons. The eleven ancient dragons no longer get back up. For a long time an Ancient had two lives. You fought it, you killed it, and it rose and fought you again. Which meant the fight was really two fights with a pause in the middle, and the pause consisted of standing next to an enormous dead dragon wondering whether it was finished with you. That was my call to change. An Ancient now has one life, and to keep the fight the same size its health went from three thousand three hundred and thirty to six thousand six hundred and sixty. Death Throes now goes off as the dragon dies, which is where a thing called Death Throes belongs.
Because that pause was also where you waited before you could touch the body, the corpse is lootable and skinnable the moment it goes down, and the kill pays out on the one death. The breath is harder too. An ancient dragon's breath now does fifty percent more damage than an adult's, across the color breaths, the lightning and fire breaths, and the fire breath it uses from the sky.
I will be interested to see how that lands. An Ancient was always meant to be the thing you tell stories about afterward, and I would rather it be frightening for one long fight than tedious across two short ones. If the breath proves too much, say so and we will look again.
The community website had a big day as well. The guild and town calendar is live, with List, Week and Month views, and you add an event by clicking the day or the hour you want it on. You can filter by source and tag, the World Calendar's events sit alongside your own community's, and members can propose an event that an officer approves or declines. The guild Overview page grew a members' view: the message of the day, who is online right now, who joined in the last thirty days, your leader and officers, and this season's place, score and four pillars drawn as bars. Officers get a list of what is waiting on them, applications and event proposals both, in one place.
And then there is the desk, where the icons would not move. You could drag them around on the desk this one was modeled after. You could not drag them on ours. The reason is wonderful. Every icon on that desk is a link, and a browser, seeing you drag a link, helpfully decides you must want to drag a hyperlink somewhere, and starts doing that itself after four pixels of movement. Our desk was waiting for six pixels before it accepted that you meant to move the icon. Four comes before six. So the browser won every time, cancelled our drag, and the icon sat exactly where it was while the player sat there dragging it. Icons now refuse to be picked up as links, the desk starts tracking at four pixels, a dropped icon settles into the square underneath it or the nearest free one, and no two icons ever sit on top of each other after you resize the window. Right-click the desk and you get New folder, Sort icons by name and Arrange icons. Members can make their own folders and add their own named web links, and each member sees only their own.
One more website item, and this one is Barugon's. The world map and the towns list were counting a player town's residents differently from how the game counts them, so a town whose people hold lots without a formal role read as having nobody in it at all, and then the filter that hides towns with one resident or fewer dutifully hid it. Towns were vanishing off the map for the crime of being populated. Both now count the way the game does: the governor, anybody with a Resident or Steward role, and anybody holding a lot there. Thank you, Barugon.
Right. The ninety minutes. We have one shared editor that the whole team books time on, and three times in a single day it locked up solid for ninety minutes or more while somebody asked it to run a batch of tests. Here is what it was doing. The tool asks for tests by name, and it was sending that request as one enormous pattern that spelled out the full name of every test you had selected, around a thousand of them, better than a hundred kilobytes of text on one line. The test framework then rebuilt that entire pattern from scratch every time it checked whether a test matched it. And it checks every node in the test tree, which is about sixty thousand of them, several passes over, before it runs a single test.
So the editor was never hung. The editor was extremely busy, working very hard, in order to decide that yes, those are indeed the tests you asked for. Ninety minutes of deciding. Zero minutes of testing.
They found it by attaching a debugger to the wedged editor and looking at what it was actually doing, which is the only honest way to catch something like that. The same batch of forty-five test fixtures now runs four hundred and eighty tests in thirty seconds. There is also a one-minute cap on any single test now, because the framework's own timeout only gets a chance to fire between pauses in a test, and a test stuck in a loop never pauses. While we are confessing, our pre-release suite had been failing since the fifteenth, because a very large change to the giant chess set left one settings file out of one build. It passes again.
A few words about words. Skill descriptions and stat names now tell you which attacks a bonus actually covers, using the same four phrases everywhere. Melee. Ranged. Melee and Ranged. Spell. "Melee and Ranged" means every weapon attack and never a spell, which is the distinction that has been quietly confusing people for years. Stats that said "Weapon" now say Melee and Ranged, and sixteen descriptions were rewritten to match, Eagle Eye, Backstab, Armor Weak Points, Flurry and Savage Sonata among them. Shield of Ice now admits that it gives spell critical damage. Stillness now describes what it does instead of saying "Movement bonus." All nine languages came along. Related: the ice skills were showing characters without Water Magic Specialization a red line promising zero percent, which now reads as a gray line telling you what the specialization would give you and that you need it first.
Three things about your belongings. Selling to a shopkeeper now stops and asks when your sale includes a mount, a pet, a collar with a tamed creature in it, or anything you have starred, and it names what it found. Somebody's Palomino went into a sixty-seven item pile of loot and was sold for eight gold with no warning whatsoever, and I am sorry about that horse. Ingot Molds are single molds with a hundred uses again. The stacking change in the last update made every smelt consume an entire mold, which was never the intent, so a mold is back to being a tool that lasts about a hundred smelts, your stacks will be split back into whole molds at the next deployment, and about four thousand four hundred molds are going back out by mail to the two dozen smiths who burned them. And a Quick Deposit or Take All of several hundred stacks into a lot chest now actually finishes, instead of handing you the chest back after a minute while the last of it was still in flight.
Two things about where you end up. Teleports into every adventure zone of tier eight and up now put you at the entrance. That is thirty-three zones, Spectral Peaks, The Rise, Jotungrund and Ravensmoor among them, and it covers the scroll, the sextant, Teleport to Friend and party summons, so you can no longer be dropped into the deep end of a dungeon because that is where your friend happened to be standing. Last Location, in the Choose Destination window, is now offered for towns and settlements only. And getting out of a bed, a chair, a stool or a bathtub shoved up against a wall no longer leaves you standing inside the wall. Standing up now checks that the spot is clear, that the furniture can see it, so it is not behind a wall, and that there is floor you can reach, and it takes the nearest clear spot beside you when the obvious one is blocked.
If you own a player dungeon, three changes. Visitors no longer read the builder's room-by-room inventory when they open the plaque at your door, which read like a spoiler sheet. They get one short line about how many rooms and halls there are, and the detailed breakdown is yours alone. You can write a story of up to a thousand characters through Options, and everybody who opens that window reads it under your dungeon's name. And standing inside your own dungeon you now get one Dungeon Menu button in the corner instead of four separate controls elbowing the compass out of the way. In the same spirit, if you run a player-owned town, the NPCs you have hired can be told to walk about. Right-click a banker, a shopkeeper, a guard, a crier or a tavern customer and choose Patrol, and it will stroll a small ring around its spot. Bankers and shopkeepers keep nearer home and hold still while somebody is at the counter. Everything already placed in your town stays exactly where it is until you say otherwise.
Lightning round. Two unfinished scenes came out of the game on Monday, and one of them is mine to own: the Lord of the Isle Pocket Universe basement, which was announced in twenty twenty as a fishing expedition, built over the following two years, and never finished. The other is the Eighth Level of Hell, an April Fools pop-up dungeon from twenty twenty-three that had already been closed off. Rewards anybody earned in either one stay in their inventory. Six developer test scenes that no player has ever entered went with them, along with the teleport board buttons that pointed at them, and that whole sweep removed better than one and a quarter million lines. If your character's saved location happens to be a scene that no longer exists, you now wake up on the Novia overworld instead of back on the tutorial island.
Then a thick cluster of log cleanup, which nobody will ever notice and everybody benefits from. About a dozen error lines that reported nothing actually wrong were corrected or hushed, which matters because real problems hide behind noise. The best of them: leaving Castle Atos threw a pathfinding error on better than half of all departures, because a hidden public mahjong table switches off its own colliders in order to disappear, and that left its four chairs behind in the walkable map as invisible obstacles that could never be removed. Crash triage can now read the crash report that gets written on Linux, so fifteen Linux reports that had all been filed under one unhelpful heading sorted into ten real ones. The launcher stopped attaching a crash folder from an earlier session to a later one, which had two perfectly clean quits reporting themselves as crashes. And our graphics auto-setup was reading the newest Intel laptop graphics as an eleven gigabyte dedicated card, then handing a first-time Linux player a texture budget that crashed them on their very first load.
A few small confessions to finish. Our tracker's priority scale ran backwards, so the most urgent level was labeled zero and the least urgent was labeled three, and people kept reading it the wrong way round, including the importer that brought in our old issues and read every one of them inside out. It is now Blocker, Critical, High, Medium and Low, which is harder to get wrong. On the back of that, two hundred and sixty-seven open reports were sorted, and forty-nine of them were suggestions rather than bugs, so they moved over to the Player Wishlist where other players can vote on them. Elsewhere, a pet left fighting while its owner was away from the keyboard was earning kill experience every few seconds, and experience counted as activity, so the owner never went idle and the rule about unattended pets wandering off never fired once. A crypt sarcophagus in Solace Bridge Outskirts was opening and closing forever because auto-attack kept the lid as a target, which kept the book inside out of reach. Practice dummies on player lots had been getting carried clean across town to stand on the Town Crier's spot. A tower at Castle Aerie was rotated one degree off from the wall beside it, which opened a four centimeter crack running the full height of that wall. And the name screen now refuses the names of famous real people outright instead of flagging them for a human to look at, which, I am told, includes Richard Garriott. Lord British is still permitted. As it should be.
That is Monday. It was a networking day wearing a bug day's clothes, and I am looking forward to the part where we start switching those twenty-odd fixes on, two players at a time, with numbers on a screen in front of us. If you fight other players, your evening is coming. Thank you to Rinaldi and to Barugon for reports specific enough to act on the same day they arrived.
And before I go. I asked the team how the new Charnel Pits had come out, and they looked me straight in the eye and told me they are the pits. Good night, friends.