Last week I released Domus Mortem and I wanted to make a post to detail all the work that went to it, as well as the lessons learnt from the project. There is a lot to talk about, so sit tight and let’s get started.
So this project is a paradox. It was meant to be made as a test to see all systems that UEFN provide in terms of gamedev. How does it fare, can it be sustainable?
So in order to do this, I ve set my self a deadline and decided to work on recreating a project. So I grabbed my Domus Mortem build from Gameglobe (game was made 10 years ago), started a Youtube stream and gave myself 2 months.
In those two months, I had to develop around 7 core areas to fully complete the game. The scope was to recreate my 10-year old project in a very polished and immersive way, using all the new tools at my disposal. I had a YT video of the old project (since the servers of Gameglobe are now closed) and a general idea of the theme and mood.
So first of all I wanted to add voice work. So I looked around the web for potential candidates to help me voice the main protagonist lines. I found Eleven Labs and using their free license I managed to make all the voice lines I needed for the game. I then recorded my own voice, added filters and made Willow’s voice, and payed a voice narrator to perform the Good ending narration part (22$ iirc).
I started working on the intro cutscene area first, which I managed to fully complete in one YT stream, then spent the next day doing the cutscene. I did the sound design by using purchased sound libraries in a DAW that I have, and for everything else (like the player crawling out of the car) I recorded sounds using GarageBand in my iPhone and sent them through email to my PC.
(audio was removed from this clip because of an issue I later encountered with PS5 and Switch, but this is the moment you crawl out of the car)
Music was composed in FL Studio, using Omnisphere as my core VST plugin, because it features a lot of immersive soundscapes. That’s how I added the sounds of mandolin, string tremolo and all ambient effects. The soundtrack was made in the same file so I could easily reuse the same instruments and effects.
All was well, but it was time to do lighting.
I started experimenting with Lumen, but quickly run into an issue with volumetric lights and their setting to remove scattering (didn’t work in live edit onwards). I also didn’t want to custom full custom lighting as the settings are global (whereas day sequence device allows zones) + I love Fortnite’s TODM settings. So after spending 2-3 days, I found a setting that I liked with lighting and went with it (it would change later on, on platform testing)
It was now time to start building the exterior and the manor. Exterior was another YT stream worth of work, then I started working on the soundtrack of the game, because the first jumpscare was quickly approaching.
After moving to the interior, I had to build the space on a different part of the island, so I can re-use the memory/texture budget for assets. Therefore, I added a transition cutscene where the player knocks, then enters. I later also added a loading screen, because transitioning areas on Switch creates player jitter and assets plop into existence, so I hid all behind a HUD being a black loading screen.
I was polishing the entire thing as I was designing it, so I don’t have to go back later on. I like to work that way because it motivates me playing and seeing how the game looks, as well as knowing the overall project % for completion.
So I started the first jumpscare sequence and decided to learn to import characters and animate them. I got access to the Willow skin as an fbx file, so I edited her to remove all holsters she had and her pink collar, then after a lot (and I mean a lot) of experimentation, I manage to make her use the skeleton of a UE4 mannequin, which meant that any imported animation will be used by her without IK retargeting (honestly if you asked me how I did it, I don’t know cause Mixamo couldn’t autorig her for the life of me). Anyhow, after a lot of errors and a lot of rollbacks (I used Smart SVN btw to keep track of revisions), I finally managed to make her animate like a UE4 mannequin. It was then that I needed animations and a way to control them.
I found a cool zombie animation pack in the UE marketplace and decided to purchase it (16$ iirc). The animations were great and fit right into what I needed. However, I need to do tweaks, I had no idea how. I never looked into control rigs, so I never used that workflow. What I did instead was to create a UE5 project, load all the packs that I purchased, and do what I called post-production edits, before they were exported (not migrated, that doesn’t work) to UEFN. So my first case was that I wanted Willow to hover in the air, looking possessed. I did that by grabbing one of the idle animations of the zombies and then adding an additive layer blend as a key on the animation, inside UE. Then, the only way I found how to send that to UEFN was to export the preview mesh. And thus, a new workflow was born.
Oh btw for the entire logic of the game I used event binding. Super easy to learn, use and iterate upon, so I didn’t touch Verse unless I needed something that couldn’t be done in another way (love it, I am an artist at heart). Without it this project wouldn’t have been made most likely, as there was a lot of replication in the mechanics that I wouldn’t want to open Verse to have to do (like placing triggers, cinematic sequence devices and audio player devices).
I did mess up something with the model in the UE project so there is a little bit of stretching in the limbs, but it worked like a charm once I imported it in UEFN. Took me a while to understand that you need to assign a skeleton in import settings for everything to work correctly, and if you mess that up you can mess all animations that share that skeleton (bit destructive IMO).
Now it was time to start working on gameplay elements. I needed two interfaces for the game; one for keys and one for clues. I decided to start working with HUD message devices to pull everything off, worked for the most part (more on that later), but the limitations quickly started to hit as we could only have 4 different things displayed at the same time (not sure why, this is very limiting for HUD). So in order to work around this limitation, I made a chart for all elements that would display in-game ever, then made sure to give priority to the elements that mattered. Also made sure I changed the z-order of elements in the widget so they sort correctly.
Keys HUD:
Clues HUD:
Now in order to do widgets, I had to link one to a HUD message device and have it show on an event. To workaround the limitation of layers, each HUD was always one layer and everything was baked into it (for example, there were 6 different clue HUD message devices, and each time you found a new clue, the next one would fire up). Same with keys (because you always get them in the same sequence).
The clues HUD was created by drawing different interface elements in Photoshop, then putting it all together as one in the end. The reason I did that was to scale accordingly to any resolution without elements stretching. However, what I didn’t anticipate was that the HUD message device would display fullscreen only if the user had their hud scale to 100%, if they had a lower setting it would like this instead:
and using Verse didn’t allow me to display custom images, so I had to go with this limitation unfortunately (which made it into the final game) which also affects loading screens, as you can see what is happening in the background and it looks weird. After communicating this issue with Epic, they marked it “by design”, so I want to still raise awareness that this is the top #1 issue for HUD for me atm.
So moving forward, I started working on finding clues, and how you would toggle the interface. We currently don’t have a way to use a new key prompt to track/do things
in UEFN, so I decided to use Verse to track when a player crouches and enable the menu. This is the code:
This was not fun to do, it took me 3 days to figure out because there are a lot of peculiarities in using code and there is not one good place that mentions how to use the API (digest doesn’t cover full usage, covers only syntax) and all errors looked the same.
Also if you know Verse, you ll wonder why I didn’t use player stassis to freeze the player, and the answer is because stassis is a state, and so is crouch, so there is a bit of a conflict in the original if statement. I made a mutator zone come to the player’s position, and since mutators have a setting for 0 movement, it was the solution. I also hid the player when the menu was open because it looked cool (as if you opened a book).
After that, I started adding the areas where you find the clues. The game was already starting to become very hard to playtest at this point, with 2-3 mins to open/sync live edit changes + the time I needed to go to the area of test from the beginning of the game. Therefore, I created a debug area outside the map to test all the verse code and make sure it wont break even in cases where a clue would trigger twice somehow (triggering an array of 7 which is non existent on the HUD messages) as a failsafe.
After all of that was ready, I moved into Niagara particles, because I needed two crucial effects, a dust effect and a smoke effect. Dust effect was easy to make, I drew 2 vectors in inkscape, made a material in UEFN and hooked them up in Niagara. The key there was to spawn them per unit so they don’t spawn unless the particle moves.
That allowed me to make an effect like this:
(taken from a playthrough)
Now the smoke was a different story. Smoke can’t simply be generated in Niagara, is has to be animated as a sprite, frame by frame. But I was fortunate to come across Epic’s free VFX pack for UE5 that contains a great smoke effect, so I grabbed the texture from it and recreated it in UEFN.
After the effects are done, I added a key model and drew the keys for the UI in photoshop, then the key system was ready to go.
Now here is the part where the game enters the spoiler phase, which I don’t want to talk about too much, because it reveals what happens in the game, but in general the game includes all the mentioned workflows and features:
-Around 40 cutscenes (90 cinematics)
-Custom VFX
-Audio design (recorded or produced)
-Audio effects
-Music/ambient score (full soundtrack: https://www.youtube.com/watch?v=LKqg2Njxlv4)
-Animated skins from Fortnite (Willow and DeadEye)
-Camera shakes
-Lumen
-Custom models or repurposed FN models
-UI made with Verse and shown with HUD message device
-Multiple endings and branching paths
-A progress tracker at the end (animated UI)
-Fully voiced character + narration
-45 mins avg playtime
And let’s not forget, this was a sprint with a deadline, so it was made in 2 months, with a 100$ budget + 100$ for the key art, by only one person. I wanted to show the power of UEFN and how powerful it can be where everything aligns, but oh boy was I in for an adventure.
So after the map was relatively done, I gave myself the final deadline and announced the release date. I gave heads up to content creators two weeks before release, then one week before posting the code. In that time, I started platform testing. I started with Switch, and I noticed that audio inside cutscenes will sometimes loop without me setting that up. A FN update came at the time to address it, but it didn’t fully so I had to do something. I ended up baking all audio into a single track, per cutscene, then playing it from an audio player at the time it needed to play in the cutscene. I hope no one has to do that again and audio gets fixed, because it wasn’t fun.
It still affects it as I didn’t want to replace every single sfx in the game, so I only did the large ones.
And now the biggest issue of all, stuttering sequences. I found out that playing on a Wifi connection causes extra issues that cant be seen otherwise and one of them is sequences skipping keys. Since keys in my game also affect gameplay, I d get cases where players would get infinite black screens (due to the fade track skipping the 0.0 key is my assumption). This one was a tough case as it still affects my game and I think it has to do with spatial loading as it happens when players transfer locations when a fade track is active. Anyway, I removed all fade tracks on these transitions (still have to do one more).
So everything is looking great, I redid the fade tracks, redid all audio, redid all audio volumes (did I mention that 1.0 volume is lower in dB than other software, had to tweak per device; 2 for audio player, 3 for sequence audio), I submitted the map to have a version for the Content Creators to play. All works fine, version is approved and now I have an unlisted game that I show to my friends and colleagues. Everyone absolutely loves it and tells me that it’s going to change the scene. I get super motivated so I go even harder on polishing and post another 6 versions for review, all of which get approved except one, but I didn’t bother to know the reason, I had too much to do.
So I hand out the map code to content creators, I announce the release date on my twitter and tell content creators that they can post on Thursday the 15th, when the release happens. No strict time, as long as its the 15th, fair game.
On the 14th, I fix the last bugs and submit a version right before I go to sleep (I am in Europe time).
On the next day, I wake up and I see this:
When pressing on the explanation button in creator portal:
When launching live edit:
^Tile cannot be accessed anymore in creator portal, so I cant revert to a previous version. And all of this without a message telling me what is causing it. And today is the day of release.
Now I contact Halkyon Knight and Alex from Dev Rel and we start going through this together. The game remains locked until the morning of NAW, because the moderator who locked lives there and had to come online (from what I gathered). Through Dev Rel I learn that some poses of Willow outside the map look suggestive (mainly one that comes out of a wall, because she starts bending) and the cutscene where Willow turns into a spirit looks like an “interaction” (to be honest, I did place the spirit model inside the Willow model to show that she is half spirit, but then decided to scrap that, play it safe and swap models). So after a couple of hours, the game tile gets unlocked and I can post a new version. So I fix then publish (takes around 10 mins to do), then I run through moderation again. This time though, the result comes as “error” because I simply moved the flagged objects, or replaced their animations, I did not delete them. So the internal flag the moderator set remained, causing an error in the system and not allowing me to publish. And the worst part, moderation can not be skipped, so we run through it again and again while Epic debugged the error that came up. This already had taken a toll on my release and the sync with the content creators, as the code they promoted was still not working, on a game that relies on day 1 push (due to spoilers).
So after around 10 hrs, the issue gets resolved, but running through the moderation, again and again, made moderators flag even more content. So that meant that even if the error were to be fixed, it wouldn’t work. And best part, no one told me. So the release day, I never actually published.
Next day I have to leave for a business trip, and right before that Epic DMs me that the CTA (Call to action) that I have on the beginning of the game violates gathering of personal information. This line specifically:
But moderation didn’t exactly tell us straight away, they just again locked the project and Dev Rel was in constant communication to find what happened. During the process, I was even told to remove my twitter @, so I can publish. However, I took this personally as I value credits a lot (I have credited everyone in my project at the end) and I thought this was very scummy to ask given there is no rule publicly telling us to remove twitter @s, so I stood my ground and told them I am not publishing, I am going to wait.
On the morning of Saturday (17th, around 2AM) and 3 hrs before my flight leaves, I am finally told what the problem is. So now I am sitting on a laptop that syncs with SmartSVN, trying to publish a version of the game that is untested, cooked from a new device. Even though it took me a good 40 mins to do (UEFN is super heavy to run), I managed to publish. I don’t remember what happened afterwards, as I was too tired to care. I did update the game normally on the same day after I travelled to Croatia though, so the issues were resolved by then. Epic never said a single “sorry” for this btw.
Anyhow, so game is live, people are playing it, all is good and dandy and I am enjoying my time resting.
Game appears first on Discovery under “New in UEFN”. Game averages around 200-300 CCU. I am content with that performance and I am hoping it would get added to more feeds in Discovery since the push from the content creators still applies. However, even though there are 4 different categories for trading content, I never once saw it anywhere else but “new in UEFN”.
5 days later, map gets rotated with a map of a spinning chip (I kid you not, look it up), and it gets the same CCU as me, then mine drops in plays substantially because its now nowhere in Discovery (even though there is a horror row). Also there is no row for single player content, or anything that helps an immersive experience, and since the new economy of Fortnite relies on playtime and not a fee-on-enter, the project will also not pay well compared to other ones.
So in detail:
UEFN:
Powerful, but lots of features are missing
Verse:
Not for beginners or artists
Event Binding:
Great for prototyping, perfect for artists
Niagara:
Powerful, but involves lots of technical terms and weird ways to do things)
Level Sequence:
Veeeery powerful, but not supported fully by Fortnite and breaks often on the interaction with it.
Content submission:
Lots of extra steps, lack of communication, lack of consistency between approvals
Discovery:
Relies too much on algorithms, missing curated content. Currently its either you build meta or you are out.
Economy:
Great overall, but not suited for polished one-off experiences
Overall:
I had fun building Domus Mortem and I am sure the issues I had will be improved in the future, hopefully this post mortem was a useful case study to see the trouble we go through to publish good content, and the return we get from it.
I d like to end this post with a video of Mustard Plays trying the game for the first time. This perfectly encapsulates what I was aiming for, and I feel proud of what I have accomplished. Thank you Epic for giving us all this power to create the games of our dreams, thank you for believing in us.
EDIT: Epic added yesterday a new row in Discovery for 1-player content, and it was the saving grace for this map, as it now picked back up to where it was previously in New in UEFN row. There is also a new category “Best of UEFN” which is also a great solution to add more curated content into Discovery. Both steps were in the right direction as it helps more niche communities flourish and develop a diverse player base that possibly comes outside Fortnite. A win-win! Here is the updated chart of plays:
I also managed to figure out what is causing my level to flag as “Error” in creator portal, so I replaced the assets that had the moderator flags (from the point that the level was disabled, I still couldn’t publish) and now the level works correctly, I fixed all the bugs that I wanted (hopefully, fingers crossed) and I can publish again. Lastly, the live count of players is steady meaning there are no issues with the game:
and playtime is at 17 mins, which is 2 mins lower than it used to be, but that’s because of the rise in player count (and it’s an investigation game, may not be for everyone).