Untitled Gnome Gname
Top-down puzzle/adventure game, heavily inspired by Untitled Goose Game.
Developed over 9 weeks full-time as our graduation project.
Made in inhouse engine Monostein (C++/DX11).
Written in C++ using an entity component system, custom navmesh export from Unity and custom Behaviour Tree Exporter.
The C++ file which by calling a macro, constructs the entire Behaviour Tree of Sandra, the troll child.
This game was created over 9 weeks of full-time development (and some unkown, additional crunch time) as our final graduation project from The Game Assembly in Malmö. It's heavily inspired by the hilarious game Untitled Goose Game but instead of a goose as the protagonist, the player takes on the role of a forest gnome who is determined to create as much mischief as possible to a troll family and their homestead. It's humoristic and visually pleasing. The game side is developed using an Entity Component system called EnTT. I mainly focused on the AI systems, audio integration in close cooperation with the excellent music composer Elvin Matz, puzzle implementation and general progression in the game.
The AI systems: For this project I created a Behaviour Tree Exporter in Python which could export visual Behaviour Trees in Draw.io to a ready-to-use C++ file. When run in the AI system, this file then constructed a corresponding Behaviour Tree which was already created in my Specialisation. During the entire project, I worked closely with one of the level designers in order to support and implement what he wanted in order to design the AI visually. This turned out to be very educational and fun! Feel free to check out his page: Gabriel Hector.
As the player progressed through the game, completing puzzles and pranking the trolls, different Behaviour Trees were unlocked and used. Everything created in the above mentioned way. Since we used a data-driven approach, the trolls were identified as trolls if they had an AIControllerComponent and then updated in an AI system by simply running the desired AI methods such as "AcquireItem", "Chase", "Idle" etc. The trolls navigated on a custom navmesh which was created in Unity and exported to our engine. They use a standard A*-algorithm with path-smoothing also created by me in a previous project.
The audio implementation: The audio was implemented by integrating Wwise in our engine. Since I had already done this in a previous project, this part was done in no-time. The audio in the game is 3D and spatialized.
I worked in close cooperation with a composer from Malmö Academy of Music who composed the music in the game. We wanted the music to be dynamic and closely connected to the behaviour of the trolls. So I instructed the composer to create one bottom layer of a single track and then four additional layers which could be stripped away and added dynamically depending on how close the trolls are to the player. The trolldad, Torbjorn and his child, Sandra, had unique leitmotifs (or musical themes) which all could be combined into a single track if both trolls were present near the player. This was done by starting the layers simultaneously in the sound engine and then interpolating the music volume over how close they were to the player. This both made the musical experience more dynamical but also helped the player to identify if the trolls were close (in which case he might want to hide in a bush or try to provoke them!). For me, this was very exciting to implement since I love both audio implementation and AI. The final result can be heard by downloading the game from itch.io.
Here, Torbjorn has noticed that the player is attempting to steal his watering can. This watering can is very precious to him and he immediately drops everything in order to pursue and reclaim it! The player's movement is slower when carrying heavy objects so this particular situation looks grim for the player. He'd better drop the can and hide in one of the bushes instead.
The puzzles: I also implemented a lot of the puzzles in the game. Most of them featured moving an object into an area, triggering something. Since we use PhysX for the physics this was easily achieved by adding a rigid body component to objects and checking if they intersected with certain trigger areas. We had some problems making the objects not acting up when they were carried by the trolls or the player. We had to use sockets in the animation files where we could offset item positions to make them appear as being held by someone. When they were to be released, we once again turned on collisions and gravitation after a short delay (in order to prevent them from bouncing off into the distance).
Audio: Martin Mossberg
Music: Elvin Matz