1. Path of Exile
  2. News

Path of Exile News

Divination Card Stories - The Journey, The Side Quest and The Destination

For today's news post we spoke with OmegaAxis to learn about the backstory of creating a series of Divination Cards: The Journey, The Side Quest and The Destination.


Good day/evening.

As you likely saw from the reddit post when 3.18's cards were revealed "The Destination" was the final entry into the series with the "The Journey" and "The Side Quest".

"The Journey", first released way back in Synthesis, was meant to honor a key turning point in my eldest son's life, entry into school. As with any kid, school often represents that beginning to see life outside the house, and really start to experience the greater world. The reward, a Harbinger orb, was meant to represent a key to those adventures. As we know Harbinger orbs were great during their name sake league for filling in your atlas semi-quickly and opening up the beachhead map to see that lovely portal. At the time there were no Harbinger cards as of yet either, so it also opened up that league's content to the core game along with the other cards released that league.

"The Side Quest" would later be released with Blight, and technically was supported by my wife who also plays. Timed roughly 1 year after "The Journey" was submitted, it was meant to snapshot a few occurrences going on in my son's life, notably his ability to only befriend girls from his class. In fact during his birthday he only invited girls to his pool party. This was expertly represented on the card with the artwork heavily favoring the women Masters, and poor Niko fading in the background. The original reward was the Master seeks help prophecy, which of course represents a quick distraction from your main task with master missions. With Prophecy removed it was swapped to a full stack of scouting reports which keeps with the theme of finding alternate activities.

Finally, "The Destination" is meant to represent the true goal of any one's life: belonging. In the image our young hero walks to the sunset with a Karui girl he has become sweet on, ready to start a new adventure together. Our son of course found himself in a similar situation, at the ripe old age of 6. The reward here was meant to represent a capstone item, with a healthy gamble built in. One can only hope for that perfect triple hatred Watcher's Eye with reservation efficiency and corrupted blood immunity.

All three cards' flavor text was meant to feel very Dr. Seuss inspired. It was, after all, dedicated to a kindergartner.

"Oh the places you will go, the sights you will see, the things you will meet."

"You'll never know the things you miss if you keep your eyes closed."

"You may be nothing to everybody, but you are everything to somebody."

Finally, in each card the family dog is also featured, our venerable husky. She is the oldest of all of my children, and still remains a cornerstone to the household.

The goals of each card was just to remember those slice of life moments, and provide utility to the game with the first two, and a big money gamble to the final entry.

With each iteration we were thrilled with the artwork as the artist managed to nail the intended scene from just my few lines of text.

The game has been a joy, still going strong since Domination. And soon enough I'll have my own lootbot with my son playing some cyclone or fire build.

Thank you team!

Weekend Wings & Back Attachment Sale and Free Mystery Box When You Spend Points!

This weekend we are running a Wings and Back Attachment Sale! You can view the full selection in the specials tab by pressing 'M' to open the store in-game. The sale runs all weekend and ends on Jun 06, 2022 6:00 PM PDT.

During the sale, we’re also offering one free Sentinel Mystery Box when you spend points! If you've already unlocked every item from the Sentinel Mystery Box, you'll get Two Twilight Mystery Boxes instead! This promotion is available on both PC and consoles.

Have a look at the what’s in the box below.

[previewyoutube][/previewyoutube]
Please note: it's only possible to get the free Mystery Box(es) once from this promotion. Making additional microtransaction purchases will not grant additional mystery boxes. Purchasing a supporter pack will not grant the free Mystery Box(es) but spending points from a supporter pack can grant them.

In case you need points for this sale, we'd recommend checking out the Sentinel Supporter Packs!

Thank you so much for your support!

Game Mechanics Q&A

It's been a while since we last did a Q&A about Path of Exile's game mechanics and we're keen to answer your questions about its intricacies! We'll collect your questions and present the answers sometime in the next few weeks.

The intention of this Q&A is to be exclusively about game mechanics rather than game design or other Path of Exile topics - for example, how specific passives interact with particular unique items, etc. It's unlikely that we'll be able to get to every question due to time constraints but we aim to answer as many as we can.

We look forward to your questions!

Fixing Path of Exile's Mangled Text Bug

We sat down with Ben, one of our UI Programmers who fixed the "mangled text" bug that's been affecting Path of Exile for a long time. Because there was some interest in the bug itself, he was kind enough to write up a post-mortem for us. Check it out below!


After announcing we finally found a fix for the infamous "mangled text" bug players have been encountering for the past 6 years, some players expressed interest in getting a post-mortem on this age-old issue. I'd always been interested in trying my hand at a technical details post someday so here you are! The bug has been known by a few different names, referred to by things such as "jumbled", "corrupted" or "krangled" text. Internally we mostly referred to it as being "mangled" so that's what I'll be calling it.

I can tell you that the bug was introduced to the codebase April 25th of 2016 and made it into production in 2.3.0 with Prophecy League. It was introduced by some refactoring of the text engine in order to support the then-upcoming Xbox version of Path of Exile.

[h3]The Symptoms[/h3]
I feel safe in saying that a majority of players encountered this bug at some point over the years, mostly showing up after longer play sessions, but some players encountered it much more often than others. It could affect any text in the game and there were two distinct effects of the bug:
One where the kerning, or spacing between the individual drawn glyphs, was either too large or too small.





And another where the individual characters were being graphically represented by the wrong glyph:



Some keen-eyed players had noticed that in the second case, applying a substitution cipher could restore the original text.

Example: "Pevpf`^l D^j^db" -> "Physical Damage", ^ maps to "a".

One thing which always struck us as being odd was that capital letters would have a different (or sometimes no offset) compared to lowercase letters.

[h3]The Hunt[/h3]
The earliest bug ticket for this issue was made on June 4th 2016, created from reports on the forums just after Prophecy's release. The biggest hurdle was we could never find a way to reliably reproduce the bug on our machines, only having it pop up very rarely and randomly. From what I heard we only ever got it on a programmer's machine once or twice, which is key to letting us inspect what's in memory to gather clues as to what went wrong. Until we could find reproduction steps the best we could do was some speculative fixes and hope the issue stopped getting reported. Due to lack of finding anything and it not being a show-stopping issue it got downgraded to lower importance so more time could be given to new features and other fixes.

Many developers (myself included) had made their own attempts at finding the issue over the years, all while more links to user reports would get added every other month to remind us of this puzzling issue. From the report gathering, screenshots and my own experience I could tell the following things:
  • It affected individual font styles (combination of typeface, size, italic/bold status), rather than particular text displays or strings.
  • It didn't appear to be a texture generation, corruption or atlasing issue as none of the glyphs ever seemed to be clipped or cut in half. The rare time we got the bug on a programmer's machine also confirmed this.
  • Logging out would not resolve the issue in most cases, only a client restart.
  • I noticed we never got a report for this happening on Xbox, PlayStation or MacOS, which ended up helping me narrow it down the most to a particular area of the text engine.

Around the release of Scourge I noticed the bug seemed to start getting reported a bit more often and I started experiencing the bug more in my own play sessions. I recorded most of these occurrences, collected images from players and started building a couple of hunches, but still couldn't find reproduction steps other than "play the game a bunch". A couple of weeks ago I got a bit of a gap in my tasks and decided to make another serious attempt, spending a few days diving fully into the text engine to read through and understand all its intricacies.

[h3]The Fix[/h3]
While deep diving through the text engine code, I finally came upon the following function:

SCRIPT_CACHE* ShapingEngineUniscribe::GetFontScriptCache( const Resources::Font& font )
{
const auto font_resource = font.GetResource()->GetPointer();
// `font_script_caches` here is a map of `const FontResource*` to `SCRIPT_CACHE` values
auto it = font_script_caches.find( font_resource );
if( it == std::end( font_script_caches ) )
it = font_script_caches.emplace( std::make_pair( font_resource, nullptr ) ).first;
return &it->second;
}

For non-programmers: this function takes in a reference to a particular font resource and uses its location in memory as a key (lookup value) for a SCRIPT_CACHE data object, creating a new entry if it doesn't already exist. The function then returns a pointer to the SCRIPT_CACHE object, which lets the function caller modify the stored SCRIPT_CACHE instead of a copy which wouldn't have its changes persisted in the `font_script_caches` map.
The SCRIPT_CACHE object here is an opaque data object used by the Windows Uniscribe library (which we only use for the Windows version of the client). The Uniscribe documentation doesn't give insight into what information is actually stored by this, just that the application must keep one of these for each "character style" used. From the effects of the text mangling bug though we can infer that it's used for kerning and mapping characters to glyph textures at least.

Upon first glance this function appears to be doing something completely reasonable, which is probably why the issue never got noticed all these years. You only spot the issue once you realise that font resources can be unloaded by our resource manager when they are no longer in use. The bug then occurs when another font (different typeface, style and/or size) happens to get loaded by the resource manager into the exact same location memory, causing the new font to reuse the old one's SCRIPT_CACHE.
Once I had found this I did a couple of tests to confirm my theory that this was the issue.
Forcing every font to use the same script cache immediately produced this upon starting the game:



Huzzah! Both types of symptoms on display, which was also confirmation that these effects were from the same issue and not two separate ones. From this I was then able to reproduce the bug naturally by purposefully loading and unloading as many fonts as possible, until you get a new font occupying an old one's memory location:



Now that we know the problem, there were a few ways to go about fixing this: You could move the SCRIPT_CACHE object to belong to the Resource::Font object, delete the old SCRIPT_CACHE whenever the font gets unloaded, or swap the lookup value from the memory address to be instead be based on the typeface, size and styling of the font, which is what actually makes a font unique. All these options work but each has its own pros and cons and should be weighed based on how it fits into the larger systems.

[h3]Summary[/h3]
The actual cause of the bug isn't that interesting in itself, just realising that memory addresses can and do get reused, so you need to be careful if/when using pointers as keys. This bug will stick around in my memory though due to the particularly strange symptoms, being really annoying to track down and even just the notoriety of having stuck around for so long. I'll almost miss it in a way since it's one less "grand mystery" for my brain to pick at. Guess I just need to find the next mystery issue to fascinate myself with!

Thanks to everyone who has reported this and other issues over the years! Software development and debugging in particular can be strange and the smallest of things can produce really weird bugs. Detailed bug reports are always really valuable for building a picture of what could be happening and helps us reproduce the problem ourselves, which then lets us develop and test fixes instead of poking around in the dark.

R.I.P T l e e v

Hideout Showcase

We went through our Hideout Showcase forum again to highlight some of your amazing hideout designs with the rest of the community! Some of the hideouts featured make use of the new Timekeeper's and Ghost-lit Graveyard Hideouts, both exclusive to the Sentinel Supporter Packs! If you're looking for a new Hideout or need some inspiration for your next one, check them out in the showcase below!

[previewyoutube][/previewyoutube]
Here's a list of the hideouts featured in the video (.hideout files are available for download in corresponding forum threads):