Episode
Spike walls that never bit, a blank map, and 533 repainted icons
Friday went underground. The oldest system in the game, traps, finally got an owner, and two of them had been dealing a rounding error for years. The in-game map that had been blank for two days was fixed at the root, a second complete set of skill icons went in, and a swamp mushroom debuff that could not agree with itself was straightened out.
In this episode
- Traps get an owner after a decade
- The map that died at startup and stayed dead
- A second set of 533 skill icons
- Creature spells and swamp gas failing quietly
- Three times a tester changed the work
Transcript
Hail, citizens of New Britannia. Lord British before you, with word of what your makers were about on Friday. The oldest system in this world, the traps, has at last been given a keeper, and two that have been menacing you with a paper cut for years now bite as they were meant to. Your map, which went dark for two days, has learned to see again. Five hundred and thirty-three skill glyphs are painted afresh, and you may choose which set you wear. And a gas rising off the swamp mushrooms could not make up its mind what it was doing to you. We begin underground.
So. There is a spike wall in this game. Several, in fact. Big iron thing, comes out of the wall at you, looks like it means business. And for years it has been dealing one to five points of damage. One. To five. You could walk straight into it and lose less health than you would to a bee sting. Nobody tuned it down. What happened is that a single number on it was set to zero, and in the formula that particular trap runs on, zero does not mean weakest. Zero switches the whole thing off.
The swinging log had the same number and the same problem. Between them that is five combat volumes across nine placements in the world, and they are the only zeros in the game. Every other trap sits at one or above. And these five all carry a real damage volume with the players-only flag set, which is not what somebody building a decorative spike wall does. They are set to one now, which puts them where the rest of the kit already lives. So nine trap instances out in the world have teeth for the first time in years. Consider that fair warning before you go walking down a corridor you thought you knew.
Now why did that sit there for so long? Because traps are the oldest system in this game and the only one that never got an owner. I mean that literally. There is no such thing as a trap in the code. A trap is a trigger, and a wiring diagram, and an effects controller, and a damage volume, all bolted together in one object, and those four pieces answer to four different authorities. Which is why a pressure plate can fire for you and do nothing at all for the person standing next to you, and why every trap bug reproduces on the live shard and never once in the editor.
The team went looking for the server side of the trap code on Friday morning and there isn't any. A whole-word search for the word trap across every server project comes back with exactly one result, and it is about disarming a weapon. So who applies trap damage to you? You do. Your own client hurts you on the trap's behalf. There is a note sitting in the code about this, left by somebody a very long time ago, that reads: this is a hack for now, having target damage itself. It has been for now for about a decade.
Here is my favorite of the day. The lightning trap group used all through Quel Shardfall. It deals damage. The charge-up sound plays, the strike sound plays. It has never once drawn any lightning. Each of its seven emitters names its own object as the place to put the effect, and the code that resolves that name only ever knew how to look through a character's skeleton. It walks the bones, finds nothing, and gives up early. A scene prop has no bones. So the damage worked, the audio worked, and the flash was performing the entire role from off stage. That one was the highest priority trap report on the tracker, and it was found by reading rather than by anybody managing to reproduce it.
Three more from the same pass. The decorative fire trap sat with its flame lit from the moment you placed it, because its particle systems start themselves and nothing ever told them to stop. The old fireball trap started a fresh timer every single frame while it was waiting to fire, so a one second delay queued up sixty to a hundred of them, and then it fired on every machine at once for good measure. And the timed traps read a clock that runs negative for half of every forty-nine day cycle, so the rhythm of the tesla coils and the lightning groups ran backwards for weeks at a stretch. Nobody reported that, because how would you report it.
The one you will actually feel is the hazard volumes. Lava, storms, poison fields, anything that hurts you over time kept a schedule it could fall behind on, and when it fell behind it caught up by delivering every tick it had missed, one after another. Thirty seconds away at the usual pace is ninety hits inside a handful of frames. That is what people have been describing as damage over time spiking, and it now picks up where it is instead of replaying what it missed.
And then the piece I like best, which no player will ever see. There is now a whole trap that runs with no game engine in it whatsoever. It reaches the world through three small doors: where time comes from, who is standing in this volume, and everything the trap makes the world do. No object, no collider, no room, no frames. The tests drive one against an entirely pretend world in about forty lines, including two independent copies of the same trap stepped through thirty rounds of a coin flip that have to agree every single time. That agreement is the property you need if you ever want to hand a trap from one machine to another, and it is exactly the property a per-machine dice roll could never have had.
One correction, and I want to make it out loud because we made the mistake out loud. Friday morning's audit said that no trap in the game has a wind-up, meaning no moment between the thing starting and the thing hurting you. That went into the systems document, the roadmap and a public post before anybody checked it. By the afternoon somebody had counted properly across all eighty-three trap prefabs, and twenty-one of the forty-eight damaging ones do have a wind-up. Twenty-seven do not. The explosive barrels, the geysers, the rockfall, both lightning traps and the bear trap are all authored with a short tell before they fire. So the pattern we needed already existed in our own game, and the twenty-seven without one are now named individually, which turns the job from a survey into a work order. We said the wrong thing before lunch and the right thing after it, and the post got corrected rather than left standing.
Now. The map. For two days, most of you pressed the map key and got nothing at all. Two players reported it in game within a minute of each other on Friday, and when the team went to the logs there were no map errors. Not one. What there were, were four thousand four hundred failures with no name attached to them, spread across five builds, in thirty-two of the thirty-seven client sessions that had started since it first appeared.
Here is what was going on. The map read its data once, during startup, before the game had finished mounting its art. That read failed. And in this language, a failure during that particular kind of one-time setup gets remembered permanently, for the life of the program. So the map was dead from the moment the client booted and it stayed dead until you quit. It could not try again. Even the piece of code that exists specifically to reload the map data could not rescue it, because reaching for that meant touching the same poisoned thing.
Which is why it usually came back on the next start. Which is why it looked intermittent. Which is the single worst way for a bug to present itself, because it teaches everybody to shrug and restart.
The map now reads its data the first time something actually asks for it, and if the answer is not ready yet it tries again. Four other startup readers had exactly the same shape and moved across with it: scene information, the tuning values, the emote data, and the rules behind your stats. Any one of them could have gone the same way given an early enough reader. And there is now a test that reads the client source and fails the build if anybody puts one back the old way. That last part is the bit I am pleased about. A fix stops one bug. A test that reads your own source and refuses the pattern stops the next four.
Right, something you can actually look at. There is a second complete set of skill icons in the game. Five hundred and thirty-three of them, repainted in a fuller, more colourful style. Classic is still there and still the default, and you pick between them in Options under Themes.
The constraint on that work is more interesting than it sounds. The border of a skill icon is a promise. Its colour tells you whether the skill is an attack, a buff, a heal or a passive, and its shape tells you which tree it came from. Players read those without thinking about it, and a repaint that quietly changed one would be worse than no repaint at all. So the generator never draws a frame. It cuts out the picture in the middle, has the model paint only that, and then stamps the original frame back over the top. All five hundred and thirty-three differ from the shipped art by exactly zero pixels outside the middle. That is checked rather than hoped for.
Getting there was a comedy. The first instruction told the model to keep the same subject, silhouette and composition, which it read as permission to tint the old picture instead of painting a new one. The next attempt painted properly and set everything on fire, so a blindness spell came back wearing a burning sun. The summoned elementals repainted from plain silhouettes into actual nude people, and the service's own decency filter refused to hand them back, which is not a sentence I expected to say about a skill icon. Explaining that the elemental is made of flame rather than flesh sorted that out. And the forty-four fireworks icons differ from one another only by colour, so one general instruction turned every last one of them into the same multicoloured burst. They each name their own colour now.
Two other things came out of it. The generator draws several at a time, which took a full set from about three hours down to about thirty minutes for the same spend, and there is now a checker for the four faults that are invisible to the eye across a grid of five hundred icons: a border that moved, a filename nothing will ever ask for, a missing import setting, and an icon that came back barely changed. And one glyph is deliberately left out. Its original art is twenty-four pixels square, more a badge than a skill glyph, and enlarging that and bringing it back returns mush. The fallback is per icon, so it quietly serves the original and nobody notices.
Two things in combat had been failing without a word of complaint. The first is casting animations. A skill names one animation state for every creature that can use it, and the creatures do not all carry that state. Ask an animator for a state it does not have and it plays nothing and reports nothing. So a Frostgeist in Highvale Outskirts would swing at you normally, and then cast an ice field while standing perfectly still, like a mime who has forgotten the routine. Its life drain, the same. The Hexe's shield of ice, the same. An audit against every creature and every rune found a hundred and forty pairs doing this across ten animation names. The client now falls back to the nearest state the creature actually has, and melee never falls back onto a casting state, because a sword swing standing in for a heal reads worse than the missing animation.
And then the swamp mushrooms. Hallucinogenic Gas takes a chunk off each of your attunements. The size of that chunk was written to read your current attunement. Your current attunement already included the chunk. So it read itself, and flipped, and read itself again, and the value alternated between two numbers on every frame. If you hovered the icon, six lines of the tooltip changed faster than a person could read them. I would like to say a hallucinogenic gas that cannot agree with itself about reality is thematically perfect, and I do think that, but it also meant the penalty was only landing on about half the frames. It now holds one value for its whole five seconds, which roughly doubles what it takes off you. You have been warned about the mushrooms.
That fix is general, by the way. Any effect whose strength is calculated from the very stat it modifies now reads your character as if that effect were not on you. Nine specialization elixirs and Knight's Grace work the same way and had settled into a stable answer rather than oscillating, so they move by under two percent. And buff tooltips now report the amount that was actually applied instead of recalculating a fresh one on every frame your pointer rests there.
Three times on Friday a tester changed what got built, and I want to name all three. First: back in July, all thirty-nine player event award trophies were made no-trade. Decoration contest, fashion, fishing, lava fishing, pumpkin growing, treasure hunt, and the PvP awards in both floor and tabletop form. That came out of a wishlist request, it went in, and the testers made the case against it. The owner decision is to undo it. All thirty-nine trade again, sell on a vendor again, go in the mail again, and because that flag is read at the moment of the trade it applies to the ones already sitting in your house as much as to new ones. Mounted fish and taxidermy were never part of it.
Second: the tester tool that grants every skill at a level you choose was handing over the numbers and none of the power. The panel said ninety. So did the tooltips, and so did the deck builder. Meanwhile health, focus, carry weight, attributes, attack skill and every resistance sat exactly where they had started, because every passive benefit a skill gives you comes out of one single function, and that function was reading the real skill sheet rather than the buffed one. So a tester with every skill in the world maxed had the constitution of somebody who had made a character ten minutes ago. All of it follows the buff now, and school masteries count as trained while it runs.
Third: earlier this week the health and focus bars on your own frame were made taller so the numbers would fit inside them. A tester rejected that on the verify task and was right to. The taller bars read heavy next to the frame we have shipped for years, the digits looked lost in all that room, and the name stack above them was looser than production. The bars are thin again, the digits sit three pixels higher so they read as centred on the bar rather than hanging off the bottom of it, and the spacing now reserves room at both ends of the numbers instead of only underneath. The Grandmaster badge also stopped drawing itself across the middle of your name, which it had been doing for a while and which nobody enjoyed.
Three things about the sound coming out of your speakers. The Audio tab had two volume sliders whose names both said voice, which is not helpful to anybody. They are Character Voices and NPC Dialogue now, and only the names changed, so your saved volumes carry over. Separately, spoken NPC dialogue was being trimmed by both of those sliders at once, and now follows only its own. And every skeleton and lich in the game finally speaks with the raspy bone voice. The skeleton barkeep in The Fall, the Warshaman out in the South Boundless Forest, the three named undead in the Lich Dungeon and the Obsidian Witch in Vikland were the last ones still talking like ordinary living people, which for a skeleton is a missed opportunity.
A few things about your inventory and your windows. Item packs and bundles are now filed under the category of whatever is inside them, so an armour pack shows up when you pick Equipment at a merchant instead of vanishing, and a pack with a mix inside shows under every category it covers. Three potion packs and the zone teleport pack had been authored as crafting material and were sitting in the list next to real ingredients; they are consumables again. A full bank now accepts a deposit that would simply top up a stack it already holds, which it had been refusing on the grounds that the bank was full. And item tooltips now list what salvaging the thing can actually return, with the odds of each result, read from the very same table the salvage rolls against, so the two cannot disagree.
Out in the world: the two fountains standing in the big garden pools in Brittany Estates were pure scenery, offering nothing on hover and no way to draw water, and they now answer the Take Water prompt like every other fountain in the city. Patrol pets on dock and shore lots have stopped walking off the edge into the water, which had been putting turkeys and decorative cats into a rubber-band loop of falling in and being snapped back. And rock, paper and scissors now runs at the pace of an actual game of roshambo, about four seconds instead of over eight, and you can interrupt it, so a throw can finally answer a throw.
Everything else, quickly. Forty-nine tracker items were closed on Friday and I am not going to march you through them. The shape of the pile: windows opening wrong, tooltips showing the wrong thing or nothing at all, and a satisfying number of very old reports that had been sitting there since before the tracker moved house.
The tuning window that testers use swallowed four more categories in a single day. Taming, so the question of how many collars a creature costs you can be answered in a minute instead of by taming a hundred of them and counting. Creature awareness, which governs how far things notice you and how long they chase. The threat model, which is the real answer to why your pet does or does not hold aggro. And how a hidden character renders, which is a set of numbers spanning two orders of magnitude sitting on top of art that carries its own strength. That last one matters because a stealth value once sat at thirty against a default of one half and made hidden players plainly visible to everybody, and no amount of squinting at the screen finds that. A dial finds it.
On the build side, Thursday's nightly produced nothing at all, because the build machine fell over ninety seconds in and the stop-everything rule then cancelled Windows and Mac behind it. The code was fine; another job built the same commit five hours later without complaint. It retries once now when the machine itself falls over, and refuses to retry when the code does not compile, so a hardware hiccup no longer costs a night. There is also a new tool that doubles the resolution of art that was drawn small in the first place, where no import setting can help because the detail was never in the file, and tiling textures come through it without a seam by construction rather than by luck. And the random dungeon generator moved into the Dungeon Builder window with five build styles, with the manual updated the same morning.
That is Friday. What I am looking forward to is the next step on the traps, which needs two people standing in one room in a dungeon doing something deliberate to one another, and I suspect the team will enjoy that far more than is strictly professional. And thank you, sincerely, for the reports. The blank map came in from two players within a minute of each other, and that is the reason it was fixed the same day rather than the same month.
One last thought before I go. After a full day of reading trap code, we finally understand why the spike wall did one to five damage for all those years. It simply was not very sharp. Good night.