Elemental Fracture 6.3.0 – Patch Notes

Hey guys, Doobs here! Another update? As someone said on Discord, I looked like this…



This is the last major patch notes for a little bit and I anticipated getting this out to you all much later, but I was so excited to get this out to you guys that I pushed for as early of a release as possible; that doesn’t mean I haven’t rigorously tested it, I’ve just seen Spellbreak a little too much… hah! With that said, 6.2.0 brought back a mode that got cut and a progression system that died with the servers. 6.3.0 keeps going in both directions at once, and then it keeps going some more.

The headline in this one is quests. The whole quest system is running again: dailies, outfit quests, honor quests, and the entire story campaign from the Prologue through Chapter 3. It runs on the game’s own quest code. Every panel, every tracker and every reward card you see is Spellbreak’s, reading quests that Elemental Fracture hands out and pays for. The chapters come back with it: their menus, their music, their weekly unlocks, and the voiced story intros and outros that nobody has heard play since their respective eras (so if you play without music and voice, you may want to consider turning them on again).

Then there’s the other half, and it’s almost a second release on its own. 6.3.0 adds a whole new game mode, Free for all: Clash, with every player on their own team. It splits Dominion three ways. Dominion is the objective mode you know, now with balanced teams. Team Deathmatch is Dominion with the zones, boons and NPCs switched off, a fast respawn, and a score target that grows with the lobby. And Custom Match is back the way it was meant to work, with Match Codes: host a match, share a six-letter code, and anyone you share it with is in your lobby.

Around all of that sits the work that makes a mode feel finished rather than merely playable. Lobbies start themselves. Lobbies have a size, and a full lobby gets a short countdown and a waiting line instead of an overstuffed match. The server heals you when you respawn as opposed to being driven by the EF Controller. Each mode has its own rules about item spawning and loadouts, enforced by the server rather than trusted to the client. The Hi-scores split Battle Royale, Dominion and Clash into their own families. And the MASTERY tab finally counts every mode you actually play.

Like last time, there are “How we did it” sections through every part. Skip them if you just want to know what’s new. Read them if you want to see what it takes to turn a feature back on when the service it was built for no longer exists.

Here’s the map:


Part 1 of 7: Quests and Chapters

Once progression was back in 6.2.0, quests were the next thing I wanted to go after, because progression without quests is only half of what Spellbreak had. Spellbreak’s quests were never a side feature. They were how the game told you where to go, what to try, and what the world was about. A daily quest gave you a reason to pick up a class you’d been avoiding. An outfit chain gave the cosmetic you were wearing a story. And the story quests were the story: the only place the Hollow Lands explained themselves. When the servers went down, the QUESTS tab went with them, and the game lost its voice.

It’s back.

How quests and chapters fit together

If you never played during the chapters, here’s the shape of it. Spellbreak ran its seasons as Chapters, each 7 to 12 weeks long, and every chapter tied its quests to a reward track. The track is paid in Reputation: finish a quest, earn Reputation, and each level of the track unlocks something. Outfits, Artifacts, Titles, Badges, Cards, Emotes, Cloudbursts and Afterglows, with class XP mixed in along the way and the chapter’s Legendary set waiting at the top.

Four kinds of quest feed into that:

Most of each track used to sit behind the Chapter Pass, a real-money purchase that also unlocked the full weekly Honor Quest set and let you buy levels. Elemental Fracture has nothing to sell, so everyone owns the Chapter Pass for every chapter: every Honor Quest and every reward on every track is open to every player.

What’s actually in the box

The thing I’d point at, if you only look at one item, is that last one. In the original game your quest progress reached the backend once, at the end of a match. That was fine when the servers were Proletariat’s and a crash was rare. On a community service, where a match can end in a disconnect for all sorts of reasons, “your progress counts only if the match ends cleanly” would have made quests feel flaky. So progress is saved the moment it happens.

The chapters

Spellbreak released its story one chapter at a time, week by week, and a lot of what made that story land was the pacing: a new week, a new piece of the map mattering, a new voice in your ear. So we run it the same way instead of dumping every quest on you at once.

The world remembers its quests

A quest that asks you to find something on the map is only as good as the map. A lot of chapter objectives pointed at props that the dedicated server had quietly stopped spawning, which is the most frustrating kind of broken: the quest tells you where to go, you go there, and there’s nothing to interact with. Those props are back:

How we did it: a feature that was never actually missing

Here’s the surprising part. Nothing in the quest system was deleted. The quest classes, the quest menu, the quest list, the lobby widgets, the in-match tracker, the replication, even the network messages the game sends when you make progress: all of it shipped in the client and the dedicated server, fully compiled. What vanished was the one thing none of that code does itself, which is deciding what quests you have.

So the job was to become that service. The game describes all of its content in data: 92 quest blueprints and a master table of 326 quests (48 daily, 44 outfit, 126 honor, 108 story), six quest categories, and 71 event queries that decide whether a thing you did counts. We wrote a small extractor that reads those cooked assets straight out of the game files, and the appserver serves quests from exactly that data. When the client asks for its quests, it gets back the same structure it got in 2021. That matters more than it sounds: it means the numbers in a quest, the thing it counts, and the reward it pays are all Spellbreak’s, not my best guess at them.

Progress had to find a new way home. In the original game, the dedicated server tallied your quest progress and reported it to the backend at match end. Our servers can’t reach that backend, because it doesn’t exist. The tally still happens and still replicates to your client, so the client relays the same numbers over its own connection, on every change. The appserver only ever moves progress forward and never touches a quest that’s already been paid, so a repeated or out-of-order update can’t undo anything or pay anything twice.

The chapter loading modal was the hardest single bug. The CHAPTERS tab sat greyed out behind an “Updating Chapter Data” spinner that never went away. I spent a long time assuming the widget was waiting for a missing field. It wasn’t. The spinner is held up by the game’s loading manager, which tracks a set of subsystem bits, and the chapter bit was never cleared because the request that clears it goes to a service that no longer answers. Mapping every loading bit and clearing the right one, at the right time, is what un-greyed the tab. Hand-marking a bit as loaded instead turned out to be a trap: it opens menus onto a black screen.

The world props were being deleted on the server. Chapter props on the map carry a requirement: only exist during a given chapter week. The server checks that requirement when the world starts, and two things were wrong. The server only knew about one week, so “has this week started yet” could never be true for an earlier one. And the check refuses to answer at all until the chapter subsystem reports itself loaded, which a dedicated server never does. So every week-gated prop was destroyed on the server the moment the map loaded, while your client still drew it. You could see a Chapter 2 objective and never complete it. The server mod now seeds the full week list and answers the loaded check, and the props stay.

The voice-overs were in the files the whole time. Every Prologue week names a voiced story, and each Chapter 3 story quest names its own briefing and dialogue. The game opens the story pane for a “pending narrative” at login, and marks it seen when it plays. The mark-seen message was compiled out of the shipped client, so the client mod sends it itself, and the appserver remembers which stories you’ve heard.


Part 2 of 7: Free for All

A whole new game mode. Free for all is Clash with every player for themselves.

Clash was always a team mode, and a good one, but there’s a particular kind of match Spellbreak is brilliant at that team modes can’t give you: the lobby where everyone is a threat, where you third-party a fight on purpose, and where the scoreboard is a list of names instead of two colors. That’s Free for all.

How we did it: two teams, all the way down

Clash, internally, is Rumble, and Rumble is built from the ground up for exactly two teams. The scores on the game state aren’t a list. They’re two integers, Team1Score and Team2Score, sitting side by side. The teams are team 0 and team 1, and that assumption is baked into a lot more places than the score.

The trick that makes Free for all work is an engine detail. A player’s team in Unreal is a single byte. If every player gets a different byte, then everyone is hostile to everyone through the exact same machinery that decides friend and foe in Clash. No friendly-fire logic to find and defeat. Players get team 2, 3, 4 and up, which can never collide with the 0 and 1 the map uses for its spawn sides.

Then you spend a week finding every place that assumed two teams:

And one performance lesson I paid for twice. An early build looked the players up by scanning the engine’s entire object table, from a hook that runs every server tick. Under Wine one scan takes longer than a frame. The server slowed to under a frame a second and exited. A one-second cache wasn’t enough either, because the scan itself was slower than the cache. The shipped version reads the game state’s own player list, which costs nothing. Never scan the object table from something that runs every frame.


Part 3 of 7: Dominion and Team Deathmatch

Dominion was two things wearing one card. It’s an objective mode: hold the zones, grab the boons, fight over the map. But underneath the objectives it’s also one of the best team fights in the game, on some of its best arenas, and I wanted a way to play that fight on its own. So the Dominion card is a drawer now, with three rows: DOMINION, TEAM DEATHMATCH and CUSTOM MATCH. Custom Match gets its own part, because it earned one.

Dominion

Team Deathmatch

How we did it: Team Deathmatch was already in there, twice

There’s a real, cut Team Deathmatch mode in Spellbreak’s files. Its game mode class, its match rules, even its sudden death. That was the first thing we tried, and it cannot be played. It boots, and then it falls over three separate ways before a player finishes spawning: it has no arena table, the boon code assumes a Dominion game state and reads a null one, and it has no league tiers. It was cut mid-development and it’s missing from every table it should be in, which is very likely why it was cut.

The version you’re playing is simpler and better. Dominion already is a team deathmatch. It scores two ways: holding zones, and exiling players. And Dominion’s game state has three switches for exactly the things we wanted gone, zones, boons and NPCs, sitting right next to each other in memory. So Team Deathmatch is the Dominion game mode on its own servers with those three switches off, the respawn delay dropped, and the score target rescaled. Same mode, same arenas, same HUD, same everything that already works.

The score target needed one more step. Dominion’s own formula scales with the larger team, so a 2v1 would have played like a 2v2. We replace it with 3 points per player in the whole match, so an uneven match plays to an even-feeling target.

The death screen was the boon picker all along. Dominion’s death screen is one widget: the boon selection, the loadout sidebar, the merchant art, a background blur, and underneath all of it a small respawn countdown. With boons off, the picker had nothing to offer and filled your screen with “NO BOONS AVAILABLE”. Removing the screen entirely also removed the countdown, which left you staring at a death camera with no idea when you’d be back. The fix keeps the game’s own screen and folds away everything that’s about boons and shopping before the screen opens, because the boon request only fires when the picker is visible. What’s left is the score bar and the game’s own countdown, relabeled “Respawning in”.

Which screen you get is decided by where the server sent you. An early version asked the match whether boons were on, and cached the answer. Go from a Team Deathmatch match straight into Dominion and the cached answer was still “boons off”, so Dominion lost its boon screen. The fix is better than un-caching it: when the matchmaker sends you to a server, the travel message now says which mode it sent you to, and everything in the client that behaves per mode reads that. The server’s word, not a guess from the game state.

The one-team bug was a missing name. Dominion places a joining player through its squad system, which asks for the player’s “best team”. That function only knows about predefined teams: the team name a Custom Match pick sets. A matchmade player has no team name, so it logs that it’s falling back to a default and answers “no team”, and every such player ended up in the same place. Now, only when the answer is “no team”, the server picks the side with fewer players (or a party-mate’s side) and hands that back, so the game builds your squad on the right team natively.


Part 4 of 7: Custom Match and Match Codes

Custom Match is where Spellbreak’s community lived for a long time: scrims, tournaments, 1v1 grudge matches, the friends-only lobby where someone tries a build that shouldn’t work. It needs to be easy to get six specific people into one match, and on the right teams, and nobody else. That’s what 6.3.0 gives it.

Hosting

Joining

Teams and the host

Custom Match doesn’t count, on purpose

The host of a Custom Match controls the rules, the score target and the teams. That’s the point of it, and it’s exactly why it can’t feed anything competitive.

How we did it: the lobby that only existed on your screen

This one surprised me. I assumed Custom Match codes were a backend feature, like friends and parties, and that I’d need to reverse-engineer the messages the game sent to create a lobby. The game never sent any. In the shipped client, the Custom Match lobby lives entirely on your machine: two fields on the game instance, “the lobby settings” and “am I the party host”, which HOST and PARTICIPANT set. The menu decides which page to show from those two fields, and never once asks the party who’s in charge. Your settings reach the match after you connect, when the server asks each player for their post-login data.

What the backend did own was the code. The “Match Code:” label is a real widget, in the MATCH SETTINGS screen and on the main menu, and all it does is show your party’s lobby ID. So the appserver hands a hosted lobby a code as its lobby ID, and the game’s own label displays it.

The label that never refreshed. The first build issued codes perfectly and showed nothing. The label updates when the party manager broadcasts “party changed”, and that broadcast lives at the very end of the game’s party-refresh handler, in a stretch of code that crashed on Elemental Fracture’s half-initialized party state back in 6.1 and has been skipped ever since. Broadcasting it ourselves runs every listener, including one that still crashes. So after each party update, the client calls only the label’s own handler, and the code appears.

There’s no box to type a code into. I looked through every widget in the game. PARTICIPANT is “Set Team”, nothing more. The only place in the whole UI where you type an identifier to reach another player is ADD A FRIEND, so that’s where codes go.

Team picks were the other trap. The native path sends your Team Number to the server after login, and the server’s handler for it treats the number as an index into the match’s squads and moves you into that squad. On a Dominion server the squads come from join order, so the handler could shuffle teams at random. The server also reads a team name straight off your login token, which is exactly how the original matchmaker placed players. So the appserver puts your pick in your token, the server places you on join, and the squad-moving handler is skipped on Dominion servers.

The host’s scoring controls are the game’s own. Dominion’s score target is worked out every tick from five numbers on the game mode: whether the target is dynamic, a starting target, a base, a bonus per player on the larger team, and a ceiling. The native MATCH SETTINGS screen set those after login. The EF Controller’s Host Settings send the same values through the server, which writes exactly the fields the native settings wrote. Who counts as the host is decided the same way as your team: your login token says so, signed by the backend, so the server can check it and the controller only shows the controls to the player the server will accept them from.

Why the XP bar still moved. The server was already sending 0 XP for a Custom Match, and the bar still swept up. Two reasons. The client read the XP value from the wrong place: the match stats arrive as a boxed structure whose data sits at an offset you only learn by asking the game, and the read landed beside it, on a value left over from your last match. It now asks the game’s own getter, the same one the server uses, so the animation shows exactly what the server awarded. And the Mage Rank bar always opens by sweeping from empty up to your current level, which looks like a gain even when there isn’t one. With no XP to show, it now opens where you already are.


Part 5 of 7: Lobbies That Run Themselves

A good mode with an empty lobby is still an empty lobby, and a full lobby that never starts is worse. This part is the plumbing that turns “a server running a mode” into “a match you can drop into”: when it starts, how big it gets, what happens to the eleventh player, and what the server does for you after you’re exiled.

Automatic match starts for every team-based mode

Battle Royale lobbies started themselves in 6.2. Now so do Dominion, Team Deathmatch, Clash and Free for all.

Lobby sizes and the overflow line

The server heals you

Every mode has its own rules

ModeItem SpawnerLoadoutsHeal button
DominionNoNoNo
Team DeathmatchNoApplied on respawnNo
Custom MatchYesYesYes

These aren’t menu options that happen to be hidden. The server refuses what a mode doesn’t allow, so a modified client gets nothing extra.

How we did it: every mode already had a countdown

Clash and Dominion never needed a new timer. Both game modes inherit the same pre-match countdown that Battle Royale uses, because it lives in the base game mode they share. It had simply never been told when to start. For these modes, the fill requirement stays out of reach until a second player is in, then drops to zero, and the game’s own countdown arms itself. When a player leaves and fewer than two remain, the countdown freezes, and the next join restarts it. Cutting it to 30 seconds when the lobby fills is the same lever pulled the other way.

The heal is the game’s own heal. A respawn in Dominion restores you through gameplay effects, the same way a health shard or an armor pickup does, and that’s what the server applies: the game’s own effect classes for health and armor, applied the instant you respawn. No memory write of a health value, nothing that fights the replication.

The loadout had to land before the heal. A queued Team Deathmatch loadout that arrived a second after you respawned would swap your belt after the heal had already filled your armor for the old one. So the queued loadout is applied the moment the client sees you alive again, and the server’s loadout heal runs right after the swap.


Part 6 of 7: Stats You Can Trust

6.2.0 gave you a progression system and public Hi-scores. 6.3.0 had to teach both about six new ways to play.

Mode families on the Hi-scores

The MASTERY tab counts every mode

How we did it: the stats card is the game’s own, and it reads two maps off your player blob: matches played per mode for the Mage card, and wins per mode for a class card. The backend only ever sent the second one, and filled it with match counts, so Mage Overview read zero everywhere and the class cards called your matches “wins”. The card only knows the modes the game shipped with (the three Battle Royale sizes and Dominion), so Team Deathmatch, Team Clash and Free for all join them as rows of their own.

A post-match screen that matches the server

How we did it: one match, one record

Dominion, Team Deathmatch, Clash and Custom Match were each being written down twice: once by the server watching the match, with no player stats, and once by the match result itself, which carried the stats but had no start time. The result’s start time only got set when a Battle Royale-style scoreboard poll saw a player, and arena modes never have one, so every arena result filed under a match that “started” at time zero. Worse, every result on the same server shared that one time-zero match, so each new match quietly replaced the last one’s stats. The result now uses the start time the server broadcasts, the same one the match watcher uses, so one match is one record.

The history is repaired from the original event log, which is never edited: each time-zero result is matched to the real match that ended at the same moment on the same server, and the results that were being overwritten come back.

And exiles were being shared out. The server tallies player-versus-player exiles and damage per player, keyed by each player’s ID. It read that ID from the wrong spot in the player’s data, got the same number for everyone, and so everyone’s row got the whole lobby’s total: in a three-player Free for all, all three players were credited with every exile in the match. It reads the right field now, and every player gets their own numbers.


Part 7 of 7: Also in This Patch

Named belts, already shipped

The named belt fix went out early, in the 6.2.18 hotfix: a named belt gives its full armor the first time it’s worn, from a chest, from the ground, or spawned in, exactly like the plain tier belts. If you missed it, you already have it.

The in-match scoreboard

How we did it: Dominion’s in-match scoreboard and the one Clash would use are the same widget, and it builds every row from stats that already replicate to your client: exiles, times exiled, damage. It only ever opened in Dominion because its mode filter said so. The title was the fun part: “DOMINION” isn’t a setting anywhere, it’s text baked into the widget’s layout. So the client finds that text block in the widget tree and sets it per mode.

Mode select polish

The EF Controller


Getting started

Already playing? Relaunch the launcher. It pulls 6.3.0 and updates the game and the mods.

New here? Grab the launcher from elefrac.com, make an account with an email and password, sign in, press Play.

Your quests are waiting in the QUESTS tab, and this week’s chapter is waiting in CHAPTERS. Free for all is in the Clash card. Team Deathmatch and Custom Match are in the Dominion card, and if a friend sends you a Match Code, it goes in ADD A FRIEND.

If something in here doesn’t match what you see in-game, tell me. That’s the report that makes the next version better.

See you in the arena. ⚡

← すべてのパッチノート