there was a sale price i believe, we'll fix it right away
very cool but subscribe to pewdiepie
Anton Gonzalez and Andrew McLennan-Murray talked about the way they are building Dark Souls-inspired game Dungeonhaven with Unreal Engine 4 and some clever procedural tech.
Andrew McLennan-Murray and I met at an Unreal Meetup in San Francisco and were discussing how much two people could potentially do with Unreal Engine. We did a bunch of prototyping and eventually decided to iterate on the theme of exploring dark fantasy dungeons. As we tried out different mechanics and art styles and tested them with players, we discovered what people enjoyed most about the game.
And now surprisingly for us, we recently won Nvidia EDGE award so it’s a good sign we are on a right track with this.
The pre-production involved a lot of trying different things. In our early designs, for example, we were doing a lot of procedural generation. We had these completely procedurally generated infinite dungeons where everything was placed at runtime including lighting. Making art for them was a huge challenge. We heard from players that the procedural levels weren’t that fun, so we decided to take a more hand-crafted approach to level design. Andrew is a huge fan of Metroidvanias and wanted to capture the feeling of terrifyingly lonely exploration. Once we decided on that and started exploring the theme of the dungeons having a sentient core, everything started to come together, but we had to be willing to walk away from what we’d already spent time building.
We knew we are a super small team, but we also didn’t want to sacrifice the quality of a project too much. The goal was to finish the whole demo in about half a year working basically in our free time, and that meant we have to be fast and efficient. So it was understandable from the start for us that we will have to use modular approach and re-use as much as we can. Since it’s a dungeon we’ve figured out that mostly it will be rooms and hallways, so it was fairly easy to reuse stuff, but In order add some spice we decided to break it up with some open areas and caves. And of course, we had to build few unique pieces here and there. I personally would love to push it so much more, but again we had to keep ourselves within a certain deadline because otherwise, it’s really easy to get carried away and end up not finishing anything at all.
In order to make it all happen I made a quick rooms mockups to test it out, and then I’ve built a few pieces of walls and columns and broken versions of those to use to construct those rooms. I then used those elements to make big rooms blueprints, that contain smaller walls segments blueprints and used those as construction lego blocks to quickly do the whole dungeon layout.
It also helped me in a way that if I use some room twice if I make the change to the core room layout, I have those changes across all the rooms of that type I have. And that was a good base to start iterating on it and making those rooms look unique. And also blend them in with open areas across the map and with each other.
Also, I made some unique elements like statues or tomb and used few Megascans assets for open areas. Substance products were a great help here since I’ve been able also to make a material/tiling texture library for this project and be really fast with texturing similar type of objects. Then I just had to spend some time to make a good heightmap blend landscape shader and come up with a good master shader for all the static meshes.
In the end, it was just the matter of combining it all together into more or less believable environment.
Storytelling for me is a really important piece of any space you build. So the main idea was that those spaces are that it’s abandoned dungeon where many people died when they did try to capture the dungeon core powers. It was supposed to look cozy but dangerous at the same time, because the core is inviting you to challenge the dungeon, so you fall into this trap and it can enslave you get your soul. That’s the main reason I chose warm inviting colors in overall with a lot of traces of fallen warriors who did try their luck but never succeeded.
I wanted to show it as a faraway place deep in the desert, that is sort of hard to find. That dungeon used to be more epic before but now since nobody really has captured it in a long time, nature is slowly overtaking the space and destroying its walls and ceilings. And only the dungeon core itself using those captured souls keeps it running and functional. That’s the reason why you see fire pit’s and torches as well as wooden supports on a broken wall in abandoned place. The dungeon core needs to make sure you get to it so it can enslave you. But again it doesn’t let you just walk to itself. You have to be worthy and prove you can get through all the challenges before dungeon traps you in its walls forever.
In order to support it a bit more, I’ve built those mysterious tomb areas and scary looking ritual places. Last boss level is in another dimension where the dungeon core summons its greatest champion as a final defense, but also a test to see if your soul is worthy of consumption.
It’s all basically set dressing supportive elements across the whole thing. Our dungeon mostly consists from stone and sand, but in open areas, I felt that it would make sense to have some mud and plants here and there to break up the overall look again. So you feel a little bit refreshed when you come out to the open area and see some color variations. A lot of areas are closed and considering it’s abandoned place it wouldn’t make sense to have sources of fire there, but that is a fire dungeon core, so I just used that fact to explain why we see torches and fire pits all over the place with a fire that never stops working. Fire dungeon core is supporting it. We will not be able to get away with that for other levels most likely, but I had this option in this scenario so I used it.
As for the enemies and dead bodies again being smart with an idea that dungeon core enslaves those who try to capture its powers, we were able to use same mesh for the enemies and for the bodies lying down in blood. Basically, enemies you fight are those who lost to the dungeon and got revived later on to fight for the dungeon itself. So what I did is made a few death poses for the enemy mesh and turned it into a blueprint with a few blood decals on top, so I can place them quickly and change the pose fast anytime I need. Then I scattered them across the dungeon. It’s a small detail but it added so much to the feel by the end.
Lighting is actually fairly straightforward in this project. I wanted to build a warm environment, so I just used 1 directional light source as the main light source for everything and inside of dark caves or rooms it was always a combination of a sun and torches/fire light sources. All the torches were set to stationary, so it was quite challenging considering you can have more than 4 of those overlapping, but I managed to pull it off by making some of the most crucial torches/fire sources stationary light sources, and some of them static where you don’t notice it that much. Also, capsule shadows helped a LOT in many of those cases.
I didn’t really set any high values on lightmass, since the level got pretty damn big. So I didn’t want to bake it for 20 hours every time I have to change something and keep the settings fairly normal. That approach for sure had some problems with the end result here and there. Like some of the areas were not getting enough GI so they were way too dark, or in overall if outside areas were good, but then all inside rooms and hallways were way too dark again. So I had to “fake” it all adding small movable point lights with no shadows in some of the dark spots to solve this issue in a fast and cheap way. Plus to that, I post process volumes were a big help for sure to make sure I can tweak each and every space section individually, tweak GI and lighting, and add some color tone.
So, in general, it was a main quick overall pass with global lights and settings and then individual tweaking across every space.
Also, the character sometimes was way too dark in some of the areas, so I ended up putting a separate light source in our character blueprint, that affects only the character and casts no shadow. It’s constrained to the camera so no matter from what angle you look at the character and no matter how dark it’s around he always gets some amount of lighting at least. And never goes pitch black.
The Dungeon Core is a really critical piece of the story and gameplay, so it was important to make this unique. It’s the living mind of the dungeon, the big reward for beating the boss, and a key moment in the hero’s quest, so it made sense to give it some careful thought and time.
We’re still experimenting with different choices here, but currently, we’re looking at giving the player the ability to traverse between different worlds by using a device which will allow them to access an area we’re calling “The Dungeonhaven.” The idea is to allow the player to visit or revisit any part of the game at any time, even the final boss. Some areas might be very difficult without certain powers or require certain abilities to access, especially secret areas. Making the final boss accessible very early on essentially makes most of the game optional, but good luck beating the final boss without any powers.
For materials, I made a few tiling textures either from scratch in substance designer or mixing/adjusting up some substance source textures into something I need for the landscape. I have a master shader for all the static meshes I have in a dungeon since I wanted all of them to be more or less one tone and covered with dust. After that, I was just making instances from the master shader for every other mesh. Also made a couple of grime decals I use pretty much everywhere to break up the tiling textures or repetitive patterns a bit.
Many shaders use displacement too. I had some of the walls as a tiling texture plane and then broken pieces as individual bricks with the same material. In order to blend them better together I enabled displacement on the walls, so they don’t look too flat, and it did add a lot to the feel. Floor uses displacement too to help with sandy areas and tiles.
Typically you want to have the least amount of master shaders to save some resources. In general, I tend to love keeping environments fairly simple, not introducing too many color themes. I personally like things to be simple and calm color wise. Nothing too crazy or too contrasty colors. I try to stick to 1 max 3 color tones in 1 picture and prefer to play with lighting to make it look more interesting. Sometimes I introduce new colors ofc, but I try to choose them wisely for points of interest or focal points of the composition.
I tried to keep everything pretty simple, probably the most interesting is the procedural sand/dust shader that was part of my main master shader for static meshes. I made it to immerse all the static meshes into a sand setting the best way possible, and then I was just tweaking shaders to have more or less of that in indoor vs outdoor areas.
Also, that shader has a functionality to use vertex paint using the height map for texture variations. It did let me breakup the tiling textures in some of the spaces alongside with grime decals. I used it mostly on the floors since those are not landscape in the rooms and hallways. But also had to do the same sort of shader for landscape material blending based on a height map.
Another interesting thing would be blood mask that is used to reveal blood that covers the character based on the amount of damage done or received.
We were able to use some of those meshes co kitbash our character and then I had to add some additional pieces that were missing (mostly cloth elements) and do low poly mesh, UV’s, texturing, rigging and hook it up to animations in UE4.
Here are some breakdowns for that character:
Mostly it was possible because I was able to put most of the important stuff into a blueprint and then use it in some other blueprints that were like construction blocks for the dungeon. I made a few rooms blueprints, and then made sure that global BP consist from other BP’s to make it the easiest for me to edit. It had a downside of having difficulties in regard to vertex painting but I was willing to pay that price in order to finish the demo faster.
So, for instance, I turned the torches and fire pits into blueprints with a light source and particle system in them. And also made a few walls sections blueprints. And then use those BP’s inside the global room BP. That way when I constructed the basic dungeon layout with those rooms, every time I wanted to make a change to the light source or wall sections it was automatically updated everywhere.
Overall when you are in a small team like ours efficiency is key and it’s smart to reuse when it makes sense. You should think of ways to make everything look interesting without building new unique assets each and every time you go to the new space of your level. Otherwise, it just takes too much time and when you are the only one doing art, it can easily overwhelm you, and then you get depressed with the amount of work you have to do and then things just never get done 😀
I’m not sure how it is for everyone, but for me, as more, I spend time on something as harder it gets to keep going because if I don’t see the progress fast I keep thinking about how much more is left to be done and it gets me sad. And being sad is never good for the end goals. So instead of thinking how to make the best level ever, I prefer to think about how can I finish that level in a reasonable time and make it look interesting enough. I think it’s the key for small teams like us in order to reach to the finish line.