Team of 6
September 2017 - June 2018
Game design and programming
Aube is a student project made during my bachelor 2 year. It's an action-adventure game, where the player embeds a robot carrying a baby throught a desert of sand and ruins of an old civilisation, trying to reach an old sanctuary, to eliminate the entity that brought the world to ruin.
Aube was my first video game project made with a team, therefore was also my first experience as a programmer in a team.
Early in development, we, as a team, settled on clear intentions that would guide us for all aspects of the game.
We wanted the game to feel noble and elegant, contrasted heavily by intense and short gameplay sections where all decisions mattered.
The game is based around combat. We were inspired mainly by fencing : two opponents waiting a long time before attacking, waiting for their enemy to attack, or make the wrong move to punish it quickly. In combat, all the protagonist are slowly walking, but very fast when attacking.
To answer to this kind of combat, we created a controller easy to use with a few actions, all assigned to single inputs : the robot can run, attack, block, dash, and clone itself.
All of these actions have a clear purpose in combat, attacking enough an enemy will eventualy kill them, blocking an attack will stun the attacker, dashing allows the player to reposition themself, and the clone serves as a lure, to force the enemy to make a mistake.
As a programmer, I had to code most of the features of the game : from the controller to some in-game UI, with some special interactions with the environment.
But my biggest challenge on this project were the AIs. Before Aube, I had never coded any AI in any of my projects, and had barely any idea of how they worked in video games.
After some research, I learnt about behaviour trees and tried to begin prototyping the first enemy using them. However I felt like tweaking them would be too time consuming.
I decided to make the game's AIs utility based. Each AI has a set of available action they can do at any given time frame, and will decide which action is the best based on utility values linked to each actions. The utility values of each actions were calculated based on different variables :
- The environment : the AI would see if it was possible for it to go forward or backward, left or right depending on the obstacles around it and its distance from the player.
- The player's actions : the utility of the blocking action went up the closer the player was to the AI, same for the attack utility if the player just attacked or blocked, because it meant that they were vulnerable for a few seconds.
And lastly, the AI preferences : each AI had a value of aggressivity, fear and patience, which were used to modify the calculated utilities values. Aggressivity modified the attack and forward dash values, while patience modified the wait value. During combat, each AI had a "stress" value, that would slowly increase with time and with each hit they took. Once that value was high enough, the enemies could be killed and were a lot more aggressive in combat.
When all of those systems were ready, I spent most of my time fighting against the 2 most common enemies of the game to tweak them.
Looking back on them, I realize that utility based AI can be very powerful as long as the AI has a decent amount of different actions they can do, otherwise they will just repeat themselves without feeling really "alive".
This is the reason why I made sure, with the other designers of the team, to give the final boss much more action than the other enemies of the game.
Alter-ego, the final boss, had all the basic actions of an enemy, plus 4 special moves : a shockwave that pushed the player away, an energy projectile, a dashing clone, and the a clone encirclement.
With all those actions having their utility values, it was surprising to see Alter-ego come up with "combos" of his own, only based on the paremeters I gave him.
He would for example attack the player, then instantly shockwave to get to safety, and directly throw a projectile at the player because he could not attack yet and was at a correct distance.
Alter-ego also has, along with the stress value, an anger value, that increases with each hit it takes. This anger value would affect the way it fought, the higher it was, the more active Alter-ego became.