RUAIRI O'KEEFE
Software Engineer
UNNAMED METROIDVANIA
Engine: Godot
Languages: gdscript
Project: Personal
Status: indefinite hiatus
A "top down" metroidvania project, built in my free time as I taught myself how to use Godot. The majority of the initial work was done in Godot 3, but the project was later transferred to Godot 4. This project has gone through a few iterations with several major changes as time went on.
This project features procedural animation, a dynamic wind system, enemy behaviour, item acquisition and light puzzle mechanics.​​​​
The player character uses a mix of keyframed animations and procedural arm animation to allow 360-degree aiming. This was achieved with an inverse kinematics solver that follows the hand position on each weapon as said weapon orbits around the player character. Weapons are a mix of projectile-based and hitscan based on the type of weapon.
The wind in-game uses a noise texture to determine the wind speed and the direction it is travelling. This wind is then used to determine the trajectory of the rain, the movement of the fog, the movement of plants (which use ik) and the movement of lightweight particles.
Enemies in-game use a state machine to determine if they are attacking, fleeing or idling. The probe enemy will orbit the player at a distance while taking pot shots, occasionally daring to charge them and knocking the player back if they get too close. Enemies spawn based on triggers that detect when a player is close and lock the player in a room until all enemies are dealt with.
The player can collect a mix of weapons, which can be switched between once collected, upgrade items that add abilities and fragments, which serve as a currency. Weapons and items need to be manually collected when the player is close, but fragments will automatically fly to the player and be collected if they get close enough.
The original version of this project was a roguelike and had a level generator that would construct a level from a series of prebuilt rooms with randomized elements (items, enemy placement, decorations). However, this required a lot of effort to create enough unique room layouts to be interesting, and to reign in the scope of the project I decided it would be better to instead create a static map. Later, as I was working on lighting improvements, I found that the light masks were not working well with the tile layout in use. Due to this and some other factors including audio improvements in Godot 4, I decided to port the project to Godot 4 and change the game to 3D with sprites.
This was initially an experiment to see how well a 2D character in a 3D space would play, but due to the benefits of easier lighting and level building, I decided to stick with it. After some time, I realised the scope of the project had grown again and wanted to work on something smaller before returning to this project at a later date; as such I placed it on indefinite hold and moved on to the unnamed turn-based RPG.