Nomori is a mind-bending puzzle game where you need to control time and space to journey through a shattered spirit world. Take shortcuts through portals, rotate your perspective, and control the flow of time to move forward, whichever way that is.
As the very first intern of this fantastic team called Enchanted Works I was given the task and responsibility to work parallel with their lead developer; Geoffrey Hendrikx. Since I am tied to a NDA, I can not go in depth about certain subjects.
Our daily routine consisted of a stand-up, potential brainstorm sessions and executing the task that I was working on.
My focus points for this internship were game performance, AI (npc, etc.), and bi-weekly reflection sessions.
Within my first week I was able to improve the performance of the project by learning and correctly implementing the pub-sub design pattern. Within the first two months I did a full project refactor with the lead developer which consisted of 3 weeks of code improvements and mathemagical algorithmic solutions.
One of the major performance improvements I did was by creating a sceneloader. This had 2 major iteration in which each had its own flaws. They were able to reduce loading times by at least 90% with the SceneLoader and 99.8% with the ChunkLoader. To put in perspective. A stress testing scene consisting of 3M triangles due to many meshes took 7.4 seconds to load. The SceneLoader required 0.4 seconds in the editor. The ChunkLoader required 2 frames in the editor. This was achieved due to maximal utilization of the pub-sub system by creating our own method execution sequence.
I also focussed on discovering various AI systems. Every week I was given ~8 hours to do research on various AI systems in order to create my own. Quite a few of these can be found on other sections in my portfolio.
My research resulted in the creation of a modular AI system, which has capabilities of an advanced 3D A* pathfinding algorithm. This is at least 76% faster than any other standard 3D node based A* pathfinding solution. It can be up to 92% faster due to a smart corner cutting pattern that I have written. This is also the pinnacle of my internship.
The internship at Enchanted Works was extremely valuable for me. I have learned a ton of things, too many to mention. Writing my own extensions, understanding addressables, all the scene loading possibilities, Unity and its sub systems, etc.
One of my first discoveries was that the loading times could be improved, due to this I asked for permission to work on this. I devised two systems on which the team could vote; SceneLoader (SL) and ChunkLoader (CL). Both had their own pros and cons, and both were extremely fast due to their algorithmic capabilities. The SL switched essentially Scene A to B. Additive scene loading was the key here. Correct utilization allowed me to gain at least 90% performance and decrease in loading times. CL already had everything loaded and switched between active elements resulting in at least 99% performance gains. Due to pros and cons SL was voted as the most practical.
Marnix is the producer of Enchanted Works and alongside with the rest of the team a great inspiration. He and Erik (technical artist) have created many mesmerizing shaders. Out of fascination from us both on the topic he gave me the opportunity to work with stencil shaders. This in return allowed me to combine it with my loaders for a seamless scene transition effect. It did have rendering downsides though.
Within Nomori there will be various entities that will having their own life. Those entities requires AI capabilities in order to respect the environment while being smart and efficient. This resulted in research about various pathfinding algorithms such as: Dijkstra, A*, HPA, Flood Fill, and more. For the 3 test cases I devised A* turned out to be the most practical. On this I made various iterations which consisted of my own take on pathfinding algorithms. Two huge advancements I made were skipping diagonals during the check algorithm for neighbours and skipping nodes search algorithm. My current 3D pathfinding algorithm is more efficient than the standard 2D A* pathfinding algorithm.
In order to optimize my 3D pathfinding solution I came up with a node generation tool which essentially maps the environment to navigatable data in a very quick look-up table. This makes it so that the nodes do the checks for the AI so that when the game is build it will only require to connect the nodes to each other based on its objective.
Out of my fascination for AI I asked the team if they were okay with me creating various types of AI based on my research. I was given the opportunity to create my own unique AI system which is extremely modular and consists of modules. This is inspired by the module package system from NodeJS. The AI sections of my portfolio contain more detail about these systems. The AI systems that I did research about were: Squads AI, Behaviour Tree and Spectacle AI. I unfortunately didn't have enough time to create a proper testing case for the latter, so I did it during my spare time after my internship.
Squads AI clearing state
Squads AI listening to audio to predict where source is
ChunkLoader performance while switching through various levels
ChunkLoader stress testing
SceneLoader with seamless level transition
Stencil shader testing
Testing my node tool to see that it doesn't spawn within meshes
10th iteration 3D pathfinding
23rd iteration 3D pathfinding