Development of Duality

Creating an unforgiving void


Duality started as a project for a 30 hour game jam, featuring early versions of the first and second level with preliminary assets. Following an initial warm reception to the thematics of Duality, the game was fleshed out more, with many scrapped ideas from the jam period being implemented.

Many of the concepts and some of the levels were co-designed with a collaborator who was primarily working out of engine. Having equal say in the project lead to a lot of heated discussion about the direction the project should go (primarily aronud the Karma system and how that would impact a playthrough).

The biggest design hurdle was one I wanted to avoid entirely. The implementation of “powers” to diversify the different routes rubbed me the wrong way. I didn’t think a game like this should have action elements, this distracted from the puzzle gameplay. Some games handle this gracefully, but the ones that do tend to have larger development cycles. I was pushed back against this at every point, and eventually implemented powers that served a purpose in the puzzles as well as a way to deal with the entities.

In the first implementation, the two powers were identical, and simple reskins of each other. The second iteration, the “good” power moved in a straight line, and the “evil” power was lobbed. In the final iteration, the good power still moved in a straight line but it must be charged first, and can fire multiple shots if fully charged. This helped give the "good" power a learning curve, since it was capable of stopping the entities in a single hit. The “evil” power kept it’s lob (although it was given more of an arc), and was better suited to being simpler to use since players would often be frantically attempting to kill as many entities as possible if they were on the evil route.

Optimization



The biggest technical goal and challenge for this project was including a large number of GPU instanced mesh particles, including particles instanced on moving skeletal meshes, while maintaining performance targets across a wide hardware range. These particles were created with the Niagara particle system in UE4. A scalability system was introduced to cull non-essential particles entirely on low end hardware, and greatly reduce the number of visible particles on essential systems. The goal was to make sure the game could run on a Nvidia MX 940, with the target hardware being in the GTX 1060 range. On lower end hardware, the realtime shadows generated by the particle entities are entirely faked with a shader applied to the dynamic (shadowless) point light.

Fireball Evil Particle

Players on the "Evil" route will unlock the ability to throw fireballs to solve puzzles or deal with entities.

Fractal Particle

Mesh particle which replicates itself in a fractal pattern.

Particles

Skeletal mesh based Particle Entities, affectionality referred to simply as "Entities" during development.



The art style for Duality was primarily developed as an attempt to create high fidelity props that primarily relied on procedural grunge created with smart materials in Substance Painter. Important meshes were created with a high-to-low poly workflow, but simpler props only had a low poly mesh, with normal map details created with masks and hand painted. Repeated asset reuse worked in favor of the project as the surrealism of the game's world was developed. Many props and materials are instanced to further push performance.

The lightweight nature of the project on lower end hardware made it a prime canditate for real time ray-traced effects. Real time raytracing was included late in the project's development, but performed exceptionally well even on lower end ray tracing compatible hardware. The benefits of this system were especially apparant with the emissive lighting of the player's attacks, and the particle entities's glowing core.

A big inspiration for this project's development pipeline was previous efforts in the Source 2 Engine with the Half-Life: Alyx modding SDK. Source 2's BSP based developmemt approach goes a step beyond just greyboxing and made rapid iteration easy, so I wanted to try to replicate that in UE4 wherever possible. Assets and materials were designed to be modular and reusable from the beginning. I also developed a wire scattering tool similar to the one available in Source 2.

I handled the programming, art, and much of the design for this project.
The project was conceptually co-designed with Joe Mullis, who also handled the music and much of the audio.