On November 7th, 2021, the ME3Tweaks group released Pinnacle Station for Mass Effect Legendary Edition. Pinnacle Station was a DLC developed by Demiurge for the original Mass Effect game in 2009. Demiurge also handled the PC port of Mass Effect. Sometime after the DLC was released, the source code was lost, which is why it did not appear in the PS3 version of Mass Effect Trilogy, and was subsequently not included in Mass Effect Legendary Edition.
In this blog post, I’d like to go over some of the technical challenges and how the ME3Tweaks group ported Pinnacle Station from Mass Effect to its Legendary Edition counterpart, as well as detail a few of the changes we made. For clarity in this post, when I say ‘ME1’, I mean Mass Effect from 2008, and when I say ‘LE1’, I mean Mass Effect (Legendary Edition) from 2021. These are how the games are referred to in our modding scene to help avoid confusion.
Pinnacle Station
First, let’s start with some context. Pinnacle Station is a combat-focused DLC where Shepard must top the scoreboard on 4 different maps across 4 different game modes, though only 3 maps are available per mode. There is also a special map after completing all of the other scenarios, upon which completing you get access to “Shepard’s Apartment”, a small building on a remote planet.
It is somewhat neat prize, but the DLC does not offer any story of any actual substance and nothing is referenced from this DLC in future games (as far as I am aware). I’m pretty sure this is often considered one of the worst DLCs in the franchise.
Origins and initial feasibility
This project started on September 18th, 2021, after I came back from a complete modding hiatus after working pretty much nonstop on modding from March until the end of July.
After seeing someone comment about wanting Pinnacle Station in Legendary Edition, I began to look into seeing just how capable our tools would be at attempting something like this. Our tools could already port assets from ME1 to ME3, and the LE games are based mostly on the ME3 version of the engine (not entirely, but data formats are mostly the same).
Initially it was only going to be Shepard’s Apartment, which is the prize for completing Pinnacle Station. This would be fairly easy since there is not much sequencing involved, and only a handful of meshes, something that could be done in a mod without too much work. Over time the project evolved into the entire DLC, with a focus on making it feel more like part of Mass Effect Legendary Edition, rather than feeling like a port of content directly from Mass Effect.
The starting question for this project was simple, yet complicated: Is porting the entire DLC actually possible? What are the things we absolutely can’t port? Do we even know what they are?
Material Shaders
For years we’ve known we cannot port material shaders across games, even between LE games, because of some unknown data that trails the embedded shader files in the shader caches. I’m no expert on shaders, but shaders from my understanding are essentially how the graphics card draws surfaces of polygonal models. If you don’t have a shader, the graphics card can’t draw the polygon. Materials in Unreal Engine reference a shader by a GUID and provide inputs to it, such as color, textures, and other items. If the loaded shader caches don’t have this ID, the game instead uses the default material, which is the checkerboard pattern.
Modders can work around this limitation by finding other materials that provide a similar effect, cloning them, and providing different inputs to them. Not all parameters of shaders can be changed; some are meant to be widely changed (like tintable armor materials), others have no configuration options at all (like some VFX shaders that don’t even use textures).
We could never have ported shaders though, as Mass Effect and Mass Effect Legendary Edition run on different versions of DirectX.
SHADERS: Couldn’t be ported
Audio
Audio was the big question mark for this project. When starting this project, most of ME1’s audio system was not understood. We knew both ME1 and LE1 used ISACT, but we weren’t sure if the versions changed – though it was unlikely as ISACT has been dead since 2007-ish. If audio could not be ported, there was almost no reason to try to port the main part of the station, where dialogue is part of the story. Additionally, we currently cannot replace or add new audio to either ME1 or LE1 due to several unknowns in the audio pipeline for the games.
While porting the apartment, we found that audio would work if one just took the original ISB (ISACT Sound Bank) files from ME1 and put them into LE1, and porting over the objects that referenced it. This worked for all audio in the DLC.
AUDIO: Could be ported
Lighting
How will the maps be lit? Porting prebaked lighting across may or may not work. For a few years we’ve had a workaround for adding or moving new objects in levels: turning on dynamic lighting. This means the game could compute how objects should be lit. This is done all the time in the game already, moving objects for example use dynamic lighting to cast shadows and to shade them when they move into less lit areas.
SirCxyrtyx a few years ago wrote an experiment to turn all lighting on a level to dynamic, which yielded both terrible lighting (compared to the prebaked lighting) and terrible performance. But it was possible, and could possibly have acceptable performance on smaller, less complex levels.
LIGHTING: Maybe could be ported
Differences between games
We were not sure how much under the hood had actually changed from ME1 to LE1. Did things move around in game files? Were some things cut? Were some things added that needed to be used?
As part of the discovery phase, I built a system to generate an object database, which maps every unique game object to the list of files that contained them. Game objects in this context mean things like meshes, textures, particle systems, and more. This database differentiated objects by their full instanced path, as shown below.
This database would be used to build our donor system, which would be checked every time an object would be porting over from ME1 to LE1. The instanced full path would be used to find an identical asset in LE1, and if one existed, it would port that instead. This would mean we would extensively be using existing LE1 assets, such as shaders, updated meshes, textures, etc. Without this system it would not be possible to do this porting as we would have to manually point to LE1 only assets, such as Materials (which reference the shaders).
Using this system, we were able to determine that there is not a lot of internal differences between the original and the Legendary Edition version of the game, which meant porting levels would not require an enormous restructuring of the DLC. Some things would need changed, but nothing insurmountable. We also learned that Pinnacle Station has very few unique art assets, which is something it shared with Bring Down The Sky.
DIFFERENCES BETWEEN GAMES: There were minor differences that could be easily worked around, hopefully
Using VTest to port the DLC
Our porting process uses a workflow that became known as VTest, which means ‘Vegas Test’, as the original code was meant just to be a test. Vegas was the code name for Pinnacle Station during it’s original development. We used Vegas in the codename for our project, CrossGen-V.
VTest is a porting pipeline that takes a slightly modified set of files from the original DLC, runs them through a converter, and outputs converted files. As development progressed, we built in ways to improve development time, such as automatically telling Mod Manager to install the mod and run the game at the end of a VTest session. At the end of initial development (November 6), VTest takes about 6 minutes to run and uses about 7GB of memory.
The set of ME1 files to be ported are known as ModdedSource files. We made minor changes to these files , such as renaming things that need to be memory unique, or to take a specific donor object when porting. We also made changes that only have to occur in a single file here, like basic sequence fixes. These files would almost certainly crash ME1 if you tried to put them back into ME1, as they are specifically tailored for use with VTest.
The VTest pipeline is quite complicated and technical, but it can be broken down into a few main stages. Glossing over a lot of the very technical bits, the pipeline looks something like this:
- The destination mod folder (located in the Mod Library) is cleaned out, and files we never have to process are copied in, such as 2DAs and TLKs. These are known as PrecomputedFiles. These are files that don’t need conversion at all so they are simply copied into the mod folder.
- The ModdedSource files are run through the VTest conversion code one at a time. The ME1 file is loaded into memory, and we make ‘PreCorrections’ to this file, such as renaming objects so the donor system will use different objects. This also is done to make changes to the files so certain unnecessary assets are not ported over, but we don’t have to modify the original file (in case one of our edits breaks things).
- Each ME1 file is then run through the VTest converter, which does the actual conversion. It behaves differently based on which type of file is being converted:
- Level files are run through a level porter, which starts by generating a blank LE1 level file. It then ports the ME1 level actors over, as well as all of their references. The donor system pulls in the LE1 versions of assets automatically, or our own specially crafted donors, if one is available.
- Localization files generate a blank LE1 package file, and then port over the ObjectReferencer, which is used to tell the engine to keep the listed objects in memory. Because of these references, everything in the file is ported over by our tools, using the same donor system, except it forces use of the same language localization.
- The converted files, now in LE1 packages, are run through our PostPortingCorrections code, which is where the meat of the conversion takes place. It does things like convert properties that changed between the games (such as NavReferences), applies some fixes and applies specific changes we wrote, like fixing sequencing (such as installing BlockForTextureStreaming, which is not available in ME1) and the intensity of lighting.
- The package is then saved to disk in the Mod Library folder, and we run some checks on it. These include things such as checking the actor count in the level is at least 2, testing import resolution, ensuring correct texture NeverStream flags, and checking all property references that their type matches. We also run our standard toolset checks such as making sure entry and name references are within the bounds of their respective tables.
- As VTest completes, it signals ME3Tweaks Mod Manager that it should install a mod by passing it the moddesc.ini path. Mod Manager loads the mod and installs it. VTest also tells the Mod Manager to automatically boot the game afterwards.
You can view the source code for our pipeline on the Legendary Explorer GitHub .
VTest allowed us to make changes that would affect multiple files without having to do everything by hand in each file. If we needed to rescind a change, we simply commented out that part of the porting code and recompiled the mod with VTest. This ensured accurate results every time and allowed us to configure options, such as dynamic lighting, porting level models, flipping off certain levels to improve compile speeds, and more. It had the downside of typically having more up-front development time for changes, but the payoff over time far exceeded the upfront investment.
This means that manual changes after VTest were only done for testing purposes. We would install the mod, change files in the game directory, and when we acheived our desired results, we would apply those changes to ModdedSource or code them into VTest.
The result of taking Legendary Edition assets is that some things will look different, as many texture and material assets were changed. Most of these are not really an issue, but if you compare the two, you’ll see differences.
Specially crafted donors
During the porting process, we found that there are assets that are only existed in Pinnacle Station, such the simulator loading effect, the capture ring effect, and terrains that are used on maps like Volcano.
We made special donor files for these, which are inventoried at the start of a VTest session. The object database is updated in memory, allowing VTest to think LE1 assets exist, when they’re actually only part of our special donors. For example, we remade an object with the same exact instanced full path as the planet you can see outside of the window aboard Pinnacle Station; when this object was being ported from ME1, it would use our custom object instead of trying to port the ME1 version, which would not work in LE1.
Tracking progress
We used an excel sheet to track issues and how they were fixed, as well as other things such as donor materials. This project was not big enough to warrant using a larger system such as JIRA or GitHub issues. We would fill this out as we went along. As of initial release, most of them have been checked off, with a few being most to post-release.
Reusability of VTest
I’m sure some modders will read this, and see what everyone wants to see: A convenient, easy way to port content (like their own mods) from the original game over to the legendary edition of it. Unfortunately, it is unlikely this system would ever work in a generic manner that mod developers hope would work.
VTest is several thousand lines of code that is very heavily tailored to porting Pinnacle Station. The donor system however is fairly generic, but only properly works if the source files are properly formatted – same named objects MUST be identical, which for mod files is rarely the case.
For this project, we tried as best we could to adhere to the official compiler rules of every object being the same, including its references. While we didn’t hit it 100% (due to the large amounts of work it would have involved in one or two situations), we wanted to make this release feel as official as possible, even if users would never feel the impact of these changes.
Design issues
This DLC had a lot of design issues that we put significant effort into fixing, in order to make it feel a bit more modern.
Lack of audio
In the original Pinnacle Station, simulator maps had no music, and most enemies had no audio (grunts, barks, etc). It was pretty boring to hear your gun shoot for minutes while Ahern yells at you the whole time. We decided to add music to each map to make it more entertaining to play, which had a surprisingly profound effect on how enjoyable each map was.
We don’t know much about ME1 or LE1’s audio system, ISACT, so editing audio is impossible. We know most of the information required to change audio, but there is unknown data in an object named BioSoundNodeWaveStreamingData, which seems to be required to make things work. So we had to limit ourselves to the original versions of audio in the game.
We tried to pick tracks that felt appropriate for the map theme. All maps except Warehouse have a second track that is switched over to as the combat intensity picks up, and it makes a world of a difference in how fun the scenario feels. It’s one of the best new features in my opinion.
Kill volumes
Kill volumes were a significant problem when porting this DLC. In the original DLC, the maps had a bunch of kill volumes just outside the playable area, which was so enemies don’t fall out of the map and survive.
These kill volumes did not discriminate who touched it, and would immediately destroy any gameplay pawn that touched them. On top of looking pretty jank when you punched someone into a railing and they just disappeared immediately, it also had a pretty unfortunate side effect of also deleting Shepard and squadmates too. If Shepard is deleted, the game crashes shortly after. This could happen if you were ragdolled into it, or tried to use console commands to move through the air, such as ‘fly’.
There are invisible ledge meshes placed into each map that are designed to prevent the player from being able to walk off the ledge into these volumes, but due to what were essentially rounding errors when our tools converted these meshes from ME1 to LE1’s format, there were gaps in coverage (due to changes in kDOP). This would constantly lead us to game crashes as we would walk into what we thought would be solid, but instead wasn’t. This was one of the first things we had to fix.
In our remastered version of Pinnacle Station, these kill volumes no longer do anything to Shepard, in the event you somehow are able to touch them. Additionally, we changed the behavior to cause killing damage to other creatures, rather than destroying the pawn, which means:
- Enemies that touch it will die and have the normal death fade
- Your squadmates will unfortunately be having a permanent nap for the remainder of the scenario if they touch it, as they will be killed as soon as they are revived
The second point we may address in a post-release update, however, we have not been seeing squadmates touching these volumes unless you use the in-game console and get out of bounds, which cause your squadmates to teleport into a kill volume.
Difficulty scaling
The original Pinnacle Station had significant difficulty issues on both the Casual and Insanity ends of the spectrum, depending on the game mode.
Volcano Hunt Insanity
This scenario was extremely difficult because of the map design. Spawn points were so spread out that getting to enemies often takes significant amounts of time, which you don’t have a lot of in this game mode. Coupled with the time to kill on this difficulty, you had to nearly be perfect.
We’ve toned this specific scenario’s difficulty down a little bit by reducing the decay of time awarded per kill, which should take a bit of pressure off. There is still significant difficulty, but we don’t want it to feel impossible. This only applies to Volcano Hunt Insanity.
Survival engagement
Survival mode has seen significant changes in our version of Pinnacle Station that results in increased difficulty. Survival mode is based on waves – after you kill all enemies from a set of spawnpoints, it goes to the next wave, which has harder enemies. As the scenario progresses, it gets more and more difficult, and eventually you are overwhelmed and the scenario ends.
Except, if you don’t kill enemies, the waves don’t progress very fast. If an enemy takes no damage for a while, the game kills them and spawns a new one (thinking they might be stuck somewhere). By simply not engaging with enemies, you can make harder enemies take minutes to spawn, which results in an easy win. This made it super easy to cheese, especially with ME1’s poor AI. This is definitely not Mass Effect 3 multiplayer.
In our version, we’ve made it so that enemies who have not been killed after about 25 seconds will charge the player. This makes them rapidly close distance and stay within firing range of the player. It greatly increases the difficulty, which is likely what the original mode was intended to feel like. It is still fully winnable, but there’s a lot less standing around waiting to shoot.
We will likely refine this change in future updates.
Survival duration and Casual
If you play well enough, Survival can go on forever. Even with the new engagement changes, you can still be hard to kill, especially with rapid health regeneration. In fact, on Casual with Soldier Rank 6, you were practically impossible to bring to 0 health – which means you couldn’t finish the scenario without having to use the exit button, which counts as a loss!
We added a system to slowly decay the player’s healthgate the longer the match continues. The healthgate system in LE1 greatly reduces damage Shepard takes when their health would drop below 25%. Certain types of damage ignore this system, like rockets, but most weaponry is affected by this system. The result is that you could regenerate health faster than you would take it, and would constantly be stuck around 25% or more health.
This decay system doesn’t kick in until about a minute and a half into the match, to make sure you have a chance at topping the scoreboard. We don’t want to punish players, but we want the game to increase in difficulty over time. When the round finishes, your healthgate is restored back to normal. We even coded it so that if a mod changes the default healthgate, our system will respect that value.
This change allowed players to be killed on Casual (so they could win the scenario), and also made longer sessions get more difficult. Who would have guessed a game being too easy would make it impossible?
This change is applied on all difficulties, but only on Survival mode.
Smoothing out the jank
I do not think it is a surprise to anyone who has played the original Mass Effect game that there are lots of ‘jank’ moments – like modal LOADING dialog boxes, textures pop-in, and audio cutting off at times. These problems are everywhere in the original Pinnacle Station. We spent considerable effort trying to minimize them, to make for a better feel to the DLC.
- We preload files that we know will appear ahead of time to minimize the amount of LOADING dialogs that show up. If you mash your way through things like the scoreboard, the files may not load in time and you’ll still get them, but for the most part they should be gone.
- Texture pop-in should be greatly reduced. This is a very common problem in ME1. We identified moments where we could load in textures that we knew were about to be shown on screen, as well as making use of black screens and blocking for texture load to force the game to wait until textures have streamed in.
- We fixed poor lighting in a few areas that seemed like they were missing lights, like when Ahern gives you his special mission.
- We fixed strange things such as replies on the conversation wheel changing positions depending on which conversation option you last chose.
We fixed a bunch of other small issues, some of which are shown below:
Bonus content
During the development of Pinnacle Station for Legendary Edition, we had to comb over just about every part of the DLC. There was some interesting discoveries, including an easter egg and quite a bit of cut content (that is for the most part not usable).
Ahern’s easter egg
There are 3 voice lines for Admiral Ahern that he says when you shoot the viewport window while in the simulator. This window is in the top corner of every map. It has a 1 in 20 chance of triggering a voice line, so it takes several shots to trigger one of three random lines.
Given that you are timed in most missions, they start immediately, and on some maps it’s hard to even see this window, and that it takes multiple bullets to trigger the line typically – it is possible that nobody has ever found this easter egg. One of the lines Ahern delivers is one of my new favorite lines of his.
Cut content
This DLC seems like it was much larger in scope during development and had to have almost all of its story cut for unknown reasons. There are some non-finished conversations with Vidinos where he badmouths you, which we may still implement as an an ambient voice line in a future update. There are a lot of interesting small things, such as how Bryant was at one point seemingly in the role of Ahern, before he got demoted to having just a couple of voice lines.
One item that was restored was the turian bombers on Ahern’s map. Every 30 seconds or so turian ships will fly in and bombard the battlefield. I imagine this was cut due to the lack of warning when it occurs, but they don’t do much damage and create something interesting on his rather mundane mission you have to do.
Issues with our version of Pinnacle Station
While we put a lot of effort into making this DLC an improvement over the original, without actual tools and source code, there is no way we could make everything better, or even equal. If we had the tools do this, we would love to properly remaster this DLC.
Things that would have helped would be an in-game shader compiler (that outputs a local shader cache file, like ME1 did), the remaining piece of information we need to edit ME1 audio (how to generate BioSoundNodeWaveStreamingData objects), and a way to compute pre-baked lighting. Being able to generate cover data would also have helped a lot, but for this project we improvised.
Performance
Due to having to dynamically light nearly everything, performance suffers pretty heavily on some maps when the game is played using older graphics cards. Unfortunately, without the actual unreal development tools, we have no way to compute prebaked lighting, which would solve pretty much all of the performance issues. As a result, users with graphics cards lower than a RTX2070 or AMD RX6700 will likely have some framerate issues if you try to go above 60fps.
We are working to improve performance by seeing if we can convert more lightmaps, but this will take engineering time that simply is not available before launch. The type of work we are doing with lighting is not something that has been done at this great of a scale in our modding scene.
While the framerates may not be the best in the launch version, we did put some significant work into improving performance:
- We cut dynamic shadows, as they are not necessary on almost all objects. We may selectively turn some back on where they would be noticable. This only affects objects that cannot move, such as level geometry.
- We ported lightmaps from ME1 for meshes that had the same amount of vertices. For the most part, these look correct, but a few stand out as not being 100% accurate.
- We took the ME1 version of a few assets, such as stones and rocks, that make up large chunks of geometry on some maps. These objects we found don’t need to have as many triangles to still achieve an indistinguishable look, but using the ME1 mesh asset reduced the amount of vertices needing shading by tens of thousands on some maps. It is unlikely players would even notice which assets we did this on. Post launch we will likely look at doing this for more things on the more problematic maps.
In developer versions of this DLC, I had a NVidia RTX 3080 that could not even reach 70fps at 1080p. With optimizations we could reach 1440p 120hz pretty reliably on most maps.
Cover system
I will admit, I haven’t actually really played any of the Legendary Edition games. To me they are pretty much the same games I’ve modded for nearly a decade, which I’ve also only played through like once or twice (though I did play like 4000 hours of multiplayer, almost all of which was modded). That said, I still really like these games, and the challenges of modding them – finding creative solutions to problems when you have a mostly rigid set of constraints.
I’m not sure if the enemy AI improved in LE1, but they still seem as intelligent as a can of beans, which is about how I remember them from ME1. There are some oddities in how the AI pokes out of cover in our ported cover, but I don’t think this is too much of an issue besides being cosmetic. The AI could be more intelligent if we had a way to compute the dangerousness of a cover slot (a place where AI can take cover) when compared to another cover slot on the map.
Localizations
In the initial release of Pinnacle Station for Legendary Edition, we are only supporting the English voice audio. There is full text localization for German, French, Italian, and Spanish. We will update the release with audio support for other languages in the future, however there was not time to implement updates to VTest to account for localizations, as it’s quite complicated, and we had to do a ton of work to get English dialogue not getting constantly cut off.
Not porting assets correctly when accounting for localizations means you end up with a scoreboard in another language, or Ahern speaking french to you in a German language game. We also need to find some localizers to translate the DLC’s text into Russian, Polish, and Japanese, as those languages don’t appear to have been supported in the original version.
Conclusions
This has been the most ambitious modding project I’ve taken on before, as it touched pretty much every aspect of design. We had to design multiple new custom classes, code a very complex porting pipeline, improve our tools to find assets easier, invent new debugging tools, and more.
I didn’t cover everything in this post, like how we had to adjust the length of conversation matinee’s due to some strange bugs, or how we couldn’t get BioActorFactory to work at all for some reason, which is why the ‘bitsplosion’ effect on enemy death is missing. But I hope this was an informative behind the scenes look at how this was DLC was ported and improved.
We plan on updating the mod to further polish it, as well add some quality of life things, such as a weapon store on the station and adding in a bit of the cut content where it makes sense.
We hope you’ll try it out Pinnacle Station for Mass Effect Legendary Edition, and see what some extra polish can do for a DLC that originally didn’t seem to get much!