
This game was created in 72 hours by a team of 4 students from e-artsup school for the Global Game Jam 2026. To address the theme "Mask", we chose a conceptual approach: instead of wearing a physical mask, the player "masks" frequencies of reality to navigate their surroundings.

Color Shifting
Color shifting is the flagship mechanic of this game. The goal: to enable dynamic terrain modification through state changes. Combined with parkour gameplay, it had to be intuitive, clear, and fast-paced.
I implemented this using a parent class and an event dispatcher. When the player presses the input, a color wheel appears. Once a color is selected, the player broadcasts a signal to indicate the color change. All relevant objects receive this signal and update themselves accordingly.

To ensure the player always knows which color is currently selected, a color-coded vignette effect is applied via Post-Processing. Additionally, to polish the experience, object opacity interpolates over a few hundredths of a second. This ensures a smooth transition while maintaining the responsiveness required for parkour.
To ensure optimal resolution, the grid displayed on all color-reactive objects is procedurally generated via this HLSL code, allowing for total control over cell size and thickness.

Wall Climbing
The goal of the wall climbing was to create a movement mechanic that depends on the context in which it is used, based on the object's geometry rather than invisible triggers, allowing for better system scalability.
This makes it possible to add a forgiveness mechanic if the player misses an obstacle, while making movement more dynamic and allowing for alternative paths.
The implementation of this mechanic is extremely straightforward. When the player presses the jump key, we perform capsule traces the exact size of the player to check for clearance. If there is no space, nothing happens; if there is, we use a Timeline to move the player from the initial input location to the capsule's target position.

Just for fun, I also tried to implement the same mechanic but in C++ this time

There was still one problem, however: what happens if the object moves? With the previous approach, the player would climb in mid-air and fall, watching the object move away without them.
To fix this, when we verify that the climb is valid, we store the hit actor in a variable and calculate the target climb position in local space relative to that actor. We then transform these local coordinates back into world space based on the actor's current position.

How i made some of the levels, with examples
Level Design
The first step in level design for a room is to start by defining a design intent. This provides a clear direction for research, environmental storytelling, and the challenges within the room.
For this room, the design intent was a maze. Looking at the image provided, you can see that I chose a large-scale room, which allows me to explore a wide variety of branching paths.
At this stage of the game, the entire exposition and validation section of the EVC (exposition, validation, challenge) is completed, and the player is able to understand and use every mechanics of the game.

The question is: how do you create multiple paths within the same room? To achieve this, I simply isolate each path and treat them as individual rooms. This allows me to apply the EVC system and focus on the challenge by implementing one EVC sequence per path.

For example, here we have two different EVC, each targeting a specific skill. Except for the last one, which is the same. what that mean is that when I'm going to drawn the critical path of each path, I can overlap that at this location.

Test 1

Test 2
As previously mentioned, the two paths intersect at the grey circle before merging back into the same path, mirroring the example above. While the effect might seem subtle with only two paths, adding a third or fourth path quickly creates a maze-like feel.

So, after implementing the EVC framework for the other paths and drawing them out, we arrive at the maze from the original design intent. Next, it’s time to bring everything into Unreal Engine, then test and iterate over and over again.

Working on this project was a blast, and I learned so much in the process. It really forced me to move fast and iterate rather than getting stuck in my own head. I’m very happy with how it turned out, though I think I played it a bit too safe with the scope. Given the time I had, I definitely could have squeezed in an extra level or a new mechanic—a lesson I’ll be taking with me into the next project!