About
As a fallen shieldmaiden denied Valhalla, you awaken in Helheim with nothing but your hammer and fury. Fight through the undead hordes and reweave your threads of fate.
Project info
Team size: 17
Duration: 14 weeks
Engine: BGGE (Custom engine)
Contributions
Symmery
Player
Boss AI
Enemy AI
Debug Gizmos
Player
I worked on the player with Frederik Bjerno and Jonathan Karlsson.
I implemented the abilities, animations, and other gameplay features like health and interacting with scripted events.
I love trying to make the game feel as good as possible to play and I feel that often times small things can make a big difference. And for this project I got to add a lot of polish for example stopping time for 0.1 sec when hitting something to add that extra feel of impact.

Basic attack
Abilities
Example of things i worked on with the abilites is :
dealing damage, playing animations, shooting projectiles and handling input.

Slam

Shield throw

Leap

Warcry
Scripted event
For the scripted I handled activation of the scripted event, player movement and playing the animations.
Activating the scripted event was done using a trigger sphere that the level designers placed.
The movement was a little tricky because the player had to fall from one navmesh to another. This was done by removing the old navmesh and then moving the player using a curve until she reaches the ground where we switch to the new navmesh.

Boss AI
The boss was built on a state machine. For example the boss had states for the different attacks, idling, changing phases and more.
When working on the boss I handled creating the AI, playing animations, dealing damage and spawning enemies
Attacks
The attacks for the boss are randomzied between the swipe and the thrust attack.

Swipe attack
The swipe attack is a simple distance check from the boss to the player. This attack is meant to force you to walk back to dodge.
But when polishing the game I added the ability to jump over this attack with the leap ability. Most people thought this was a fun and rewarding thing to learn.

Thrust attack
The thrust attack checks a rectangle area in front of it when dealing damage. This attack is made to just miss the player if you walk sideways.
Phase change
When the bosses health reaches 66% it goes into phase 2 and when its health reaches 33% it goes into phase 3.
Both phases summon a shield weaver that blocks all damage to the boss.

Phase change (2nd phase)
For the second phase it start doing the swipe attack.

Phase change (3rd phase)
For the 3rd phase the boss increases its attack speed.

Removing the shield
To remove the bosses shield you have to kill the shield weaver currently shieling it. When polishing the bossfight we noticed that the swipe attack cant reach the player when she is attacking the shield weaver. Therefore I made it so that the boss only uses its thrust attack when you are attacking it.
Enemy AI
I mainly worked on the interactions enemies had with the world. For example combat with the player, healing and following other enemies, exploding barrels and more.
Below are the enemies I worked on.

Bloater
When alive the bloater only runs to you and attacks. But when it dies the bloater explodes, dealing damage to everything in its range. Including enemies. Playtesters struggled to escape the explosion in time, so as polish I added a little delay of about 0.2 sec before it actually explodes, giving the player a little more time to just escape the explosion.

Shield Weaver
The shield weaver was the most complex enemy to code. It actively tries to shield the enemies closest to it. Then following them but keeping its distance by following the enemy furthest away from the player. Once the enemies shielded by it have all died, it will run away finding other enemies to shield instead.
Gizmos
I created a simple tool for drawing gizmos in our engine.
This was used to more easily test and visualize things.
In Spite it was used for visualizing the navmesh, lights, attack ranges, triggers and more.

All functions for generating gizmos


A special thing about my gizmos is the bool “aDrawInUpdate”. This is something I came up with for our gizmo system. It was implemented for increasing performance and keeping gizmo draw calls low. If the game is in its initialization state which is when the levels are being loaded; you can put “aDrawInUpdate” as false. This will put the gizmo in a seperate vertex and index buffer from the ones with “aDrawInUpdate” set to true. Which is great because gizmos like the navmesh wont ever change and are very large. So it saves a lot of time not having to recreate that gizmo every frame and all those gizmos can be rendered with one draw call.
