Welcome to my portfolio, you'll find my best projects!
I am looking for a position where I can combine my technical skills and my game design knowledge in a team project.
Looking for mainly a Technical Design opportunity, I also have a generalist profile: I like to touch to everything in game development.
Team Size: 12 ⏱️ 9 months 🎭 Programmer
Team Lead of the graduation project, initially a Serious Game about the water management (and wastes). After many iterations looking for the fun, I decided to shift it to a Puzzle Game while using most of the implemented game mechanics.
The player must distribute efficiently the water across a growing city by making a pipe network and managing wisely its resources to build it.
The more water you use, the drier the land becomes.
The game's origin is from a Game Concept I've presented at the end of my 2nd Year and it has been selected out of 14 other game concept.
I wanted to build a game that make the player aware of the water uses and wastes in cities.
Problem: Large project with 4+ people working on the engine simultaneously, requiring an efficient and easy-to-use structure.
Solution: I've setup a Data Asset to control the game's core settings:
I also enabled designers to test custom games configurations in their Dev Folders via a "Custom Dev Config" node, which overrides the default Game Config Data asset when launching their custom launcher.
Solution: I created a Data Asset similar to the Game Config for the User Interfaces: this allow for centralized UI management, simplifying changes to elements like:
Problem: The game requires multiple levels sorted by difficulty, determined through playtests.
Solution: I created special Level Data Asset to store level information, and are then managed inside the Game Config Data Asset. This enables designers to sort levels dynamically, automatically updating the "Level Selection" interface.
I'm considering using the Asset Registry to automate the entire process, removing the need for manual designer actions.
Bonus: I manage level references using Soft World References instead of level names, making them more visual and easier for designers to manipulate.
Problem: The team sometimes works on the same level, editing multiple buildings, order of spawn, adding dynamic events.
After sculpting the landscape, the level designer must configure the water data of the level.
Solution: I created a "Water Lake" actor that controls this data, allowing the designer to setup: its volume, scale and level (water height).
The Water Area Radius interacts dynamically with landscape textures and foliage, making them "dry" when water is depleted.
Solution: To streamline the workflow, I set up actors that allow designer to:
The spawn order ensures buildings and obstacles appear in a designated sequence during rounds.
Problem: Designers need to test level rules variables quickly without manually editing Blueprints.
Solution: I created a "Game Manager" for each level that:
The Designer inside the level objectives array can set the resources given to the player during each new rounds. We used to manually setup the required count (score given by connected houses) to access the next round, it is now calculated automatically based on the house's round index.
The "Completion Objectives" system lets designers define goals for earning stars at the end of a level such as:
I wrote an automatic landscape to eliminate tedious manual painting, as none of us had strong painting skills.
Since automatic landscape painting is GPU-intensive, I used Runtime Virtual Texture to optimize performance.
Problem: This broke my previous "drying" effect since the shader forced a "static" texture.
Solution: I replaced the shader code with a cheap decal material, which desaturates the landscape Virtual Texture data, restoring and even improving the drying effect.
As the automatic landscape painting shader is heavy, I've used Runtime Virtual Texture to make it cheaper for the GPUs.
Problem: Houses needed visual feedback for their automatic connection
Solution: I created a decal shader that:
I wrote a C++ plugin while keeping the project Blueprint Only, reducing project size and preventing designers from needing manual recompilation (or setting up UnrealGameSync).
Problem: Unreal Engine always opens game on Primary Screen, opening the windows at an undesired location or resolution.
Solution: I' created a node with an algorithm that:
Bonus: I added an event handler to resize the window to the current monitor resolution when moved manually (or via Win + Arrow keys).
Problem: Needed quick and easy analytics from playtests.
Solution: I wrote a Blueprint node (later expanded with Blueprint Libraries) to send gameplay analytics to a Discord server via webhooks.
Getting player save files via bug reports interface allows valuable debugging and analytics. I considered developing a separate tool to scan save files, extract player data, and generate statistics.
While gathering Analytics, I wanted to be able to have the player end screen to directly save the path he did to complete the level, which is a valuable data for the team.
In order to keep the player's memory low, I've wrote a blueprint node used to safely delete file if they exist on the game's save folder: which allow me to make a screenshot of the player's viewport and delete it after the analytics being sent.
This was the hardest part of the project, requiring multiple iterations. The final approach is a chain reaction system.
Houses automatically connect to the nearest pipe and consume water during the "Processing Water" phase of the pipe.
To align with the puzzle gameplay, I retained the chain reaction system but forced 100% water transfer to each section, with only house consumption affecting the Water Lake volume (used for score calculation); as water depletion wasn't a core mechanic in the puzzle gameplay.