SPIRITBOUND ODYSSEY
AI Designer
SpiritBound Odyssey is a 3rd Person Platformer, created by a team of 7 including me using Unreal Engine 5.1. The game involves 2 playable characters. The player is required to swap between both characters for completing puzzles, platforming and combat in order to progress in the game. My personal responsibility was to design and program all enemies including the bosses of the game.
My Contribution
***Demonstration for work done below is in the video above**
Thaddeus (Boss)

Attacks
In its first phase Thaddeus attacks using swing and slam attacks. The player is required to use ground smash to pin Thaddeus' arm on the ground when it slams its arm. In its second phase, Thaddeus shoots projectiles that cannot be deflected.
In its First Phase, the slam and sweep attack animations were created using elaborate timelines for each socket on its arm. The phases and attacks were carried out using the Behavior Tree (AI) system. The attacks in both phases use code I implemented to track the player. In the second Phase, the arm canon uses the tracking code to face the player and launches a projectile using its unit direction.


Description
Thaddeus is the second Boss in the game SpiritBound Odyssey and is found in the 3rd level. It is the first Boss I created for the game using animation timelines and Unreal Engine's AI Behavior Tree system. It is a stationary boss consisting of 2 phases requiring good reflexes to dodge the attacks as well as patience.


Design Decisions
I wished to use the character's abilities to the maximum extent, due to this I decided to make Thaddeus a stationary boss using swings so that the player uses the jump for the combat character which is not often used during platforming.
The ground smash ability was meant to be introduced in that level, therefore I made it so Thaddeus' arm can be pinned using the ability to target its weak spot. In the second phase, the player must play using the Movement Character to stay true to the design pillars requiring both characters to beat the game. Since the movement character excels in Parkour I decided for Thaddeus to launch projectiles that would test the agility of the player using dash and double jump.
Enemy in The Industry (Boss)
Description
Enemy in the Industry is the third and final boss of SpiritBound Odyssey and is found in the 5th level of the game. It is the second Boss I created. I created the boss using various child actors as its components such as the laser and the spiked ball. I programmed it's attacks using simple rotation, however I used complex timers to randomize attacks and adjust the speed for necessary feedback.

Attacks


In its first phase Enemy in the Industry attacks using 2 gears. The first gear has a spiked ball attached to it which the player can attack in order to deflect it back to the boss. If not it damages the player, similarly the second gear is at the bottom and has a laser connected to it, over which the player is required to jump.
The boss' first phase was programmed using randomized timers that would switch the rotation of the gears to throw off the player with the help of functions created to slowly accelerate and decelerate the gears as well as switch their directions, since the laser and spiked ball required different code to deal damage or be reflected, I created them as separate classes and programmed them and then added them as fields to the class of the boss.
In the second phase, the boss' gears have been destroyed, this causes the boss to resort to attacking the player using ranged tracking projectiles. The projectiles are verticle and they hit the player from above. A drop shadow appears to make the player aware of where the projectile will land.
Design Decisions
The plan for this boss was to master all the mechanics the player has learned and make use of all of them from shielding, to jumping to attacking I did this by creating a stationary boss as before but testing their abilities a bit harder, requiring them to make split-second decisions to jump over the laser, shield or attack, hence 2 gears that attack at the same time instead of one arm like the previous boss. In the second phase, I decided to verticle projectiles to make it harder for the player to jump recklessly because they will end up colliding with the projectile.

Rogelio (Boss)

Attacks
Rogelio has only one phase since it is a tutorial boss. It acts similarly to any other enemy. It follows the player using path-finding code and navmesh and possesses a behavior tree AI system, as well as a custom state machine that switches states according to values such as health and distance to the player.
Once in range, Rogelio uses melee attacks to damage the player which can be avoided by getting behind Rogelio. Occasionally Rogelio will use a ground slam move which will be an AoE attack on the ground over which the players must jump to avoid getting hit.
Description
Rogelio is the first boss of the game and appears in level 1. It is the third boss I created. Rogelio initially was a regular giant enemy but I decided to incorporate him into level 1 as a tutorial boss to give players a challenge, adding an extra move for them to dodge and with a bigger health bar so they can practice avoiding enemy attacks.


Design Decisions
As mentioned previously this boss was initially an enemy type but later on implemented as a boss due to there being a boss in every odd level (1,3 and 5). I wanted to set players up for future bosses, which is why this boss is not stationary so players learn not to stay in one position and to keep moving. The boss' huge health bar also serves as a practice against regular enemies allowing the player to test and try out strategies against potential enemies. I added ground slam to help with their jump timings so they are more prepared to jump with he combat character aginst future bosses. (Thaddeus' sweep, and Enemy in the industry's laser).
Enemies
Ranged Enemy

The ranged enemy is the first non-boss enemy type I created. I used a default unreal engine character and then programmed my ai controller which I later added to it for carrying out its behaviors and pathfinding as well as detouring from obstacles. The ranged enemy using Unreal Engine's Behavior Tree AI System which I programmed using a blackboard of variables that it tracks to carry out its behaviors. I created a state machine for its different states such as idle, attacking, chasing, fleeing, and dead, and their animations as well as their priorities. The ranged enemy chases the player till it's close enough to shoot a projectile at the player that can be deflected right back at the ranged enemy. Once the player closes on the ranged enemy, they will begin to flee in the opposite direction.
Shielded Enemy
The shielded enemy is the second non-boss enemy I created and is a child of the Ranged Enemy. It was made for the player to utilize their ground slam ability. The ranged enemy will chase the player and will attack once in range, the shield can be broken using the ground slam ability as displayed on the shield, once the shield is broken the enemy will start running away from the player and will be unable to attack. After 5 seconds the shield will regenerate and the shield behavior will continue. While the shield is active the shielded enemy will take 10% of total damage.

Basic Enemy
The basic enemy is the fourth non-boss enemy I created and is the child of the Ranged Enemy. The basic enemy is the first type of enemy the player will encounter to introduce them to the combat system. The basic enemy follows the player and once the player is in range, it will start attacking them at a random time in a fixed interval.


Explosive Enemy
The explosive enemy is the third non-boss enemy I created and is a child of the Ranged Enemy. Later on in the game, as the levels get more difficult, the size of the encounters would gradually increase. When there were too many enemies for the player to handle, they would make use of the exploding enemy to clear out larger groups of enemies. The exploding enemy will chase the player, once it is in range, it will start flashing and continue to chase the player, after 5 seconds it will explode destroying itself and applying massive damage in the radius to enemies and the player.

Basic Enemy
The heavy enemy is the fifth non-boss enemy I created and is the child of the Basic Enemy. The heavy enemy is similar to the basic enemy, however, it is much larger and moves slower than the basic enemy. The heavy enemy has twice the amount of health as the basic enemy and deals slightly more damage. The heavy enemy was used to make players use entire combos and to add variation to enemy combos.
Systems
Inventory System
The inventory system was initially created by me for consumables and a shop system that was going to be a part of the game. This is why initially the inventory system was created using a map of objects (items) and integers (their quantity). And made use of various functions to display their description, their quantity, and type of item. Eventually, the shop system and consumables were cut from the game leaving us with coins and treasures that could be mapped using strings and integers.


Interaction System
The Interaction System was created to allow the player to use objects such as Levers, Pushable boxes, doors, use keys etc. I created it by using sphere traces that are launched from the front of the player every 0.25 delta seconds. I created the parent class of interactable objects with existing functions to show the HUD and carry out print string functions that can be overrided. However, since this is a dual character game, the traces are activated only when the player possesses the character and they are disabled in the inactive character.