“Opponents In Crime is an online multiplayer party looter, where up to 4 players compete to see who can steal the most art from the museum in a short amount of time. Players need to focus not only on stealing stuff for themselves but also preventing their opponents from getting score.” 

Genre: Party

Platform: PC and PlayStation

Engine: Unreal Engine

Language: C++ & Blueprints

Duration: 9 weeks

Team size: 16

Link: Itch.io

Opponents in Crime

My main tasks during this project were developing the fog of war system and handling the culling of the walls.

Because the project was multiplayer, many interesting issues arose, making it a very valuable learning experience.

Fog of waR

The fog of war system is built in two parts, where the parts work in tandem: room occlusion and item culling.

Room occlusion
I created a plane with a shader material that covers the map. Using custom maps specific to the currently active room, I mask out the shape of the room from the fog-of-war material.

Item Culling
This system was a little more complex.
Every room had its own actor containing room ID, a list of the entities inside it and its room mask.
I created a transition portal that handled removing entities from the current room’s entity list and adding them to the destination room’s entity list. During transitions, an entity can exist in two rooms at the same time to prevent popping.
All entities were also tracked globally by the game for scoring.

One additional aspect of the item culling is that, unlike the room occlusion, everything needed to be replicated.

Modular wall Culling

The problem I had to solve with the modular walls was that we did not want to use a shader or similar technique to mask out the walls. Rather, we wanted to keep the frame of the room even if the walls were being culled.

I created a base wall actor which different child actors could be derived from. For each piece, you could define the number of connection sockets it would have and assign its models. This enabled us to create all the different shapes we needed.

Each wall piece consisted of a separate model instance for the full version and a collection of model instances for the culled version, depending on its shape and properties.

On enable the piece checks its neighbours and sets the culling model according to the neighbours properties. Corner pieces by default acts as an end to a section, but every piece could be toggled to be a end to section or not. That gave the designers full control and the ability to shape how the wall sections was gonna look.

To check whether a wall section should be culled, I performed a cone-shaped trace from the camera toward the player. If the trace hit a wall piece, it triggered culling for that piece, which in turn notified its neighbours to cull as well. This process continued recursively until it reached the end of the section.

General Contributions

Apart from my main tasks and bugfixing, I also did a bunch of other small tasks. Some worthy mentions is the sewer fasttravel and the item drop off zones.