top of page

AIE Major Producion

Haem

Haem is the game created by myself and 6 others over the course of 4 months.

​

Haem is a third-person Rogue-like dungeon crawler game. The player must fight their way to the bottom of a procedurally generated dungeon in a single life - gaining weapons and godly abilities along the way - to become a demigod.

unknown.png

Within the project, I was responsible for player movement, character combat, and status effects. This involved creating combat that could be used by not only the player, but AI, which was being made by another teammate. It also meant my system for effects needed to work on anyone and be caused by anything.

​

I would say that I successfully reached these goals, with Status Effects becoming a modular system I have dropped in other projects on multiple occasions.

Status System

One of the largest features of Haem was the status effects system. Spells, Items and Characters all uses this system to affect the player and AI. This meant the system had to be completely modular and reusable no matter what was going to use them.

​

The system works by utilising two main parts, a script which handles all the status effects, and a script for the status effects themselves.

CharStats

CharStats is a script which goes onto any living creature which status effects get applied to. It has a list of status effects and a dictionary of all stats. As outside sources apply statuses to this character, the list gets expanded, and automatically removed when the status ends. The dictionary gets edited by statuses on the list, and other scripts that relate to movement, combat and many more reference the contents of this dictionary.

​

For example, this dictionary contains an effect for movement speed. The script CharacterMover does checks for movement, and checks the modifier of movement speed on CharStats. It then uses this value and increases the base movement speed based on the values recieved. This way, the system is completely seperate from other systems, but others can use it if they would like.

​

Some of the other effects possible are: Roll Speed, Melee Damage, Spell Damage, Spell Cost, Healing Amount, First Light Attack Damage, Final Light Attack Damage, Attack Speed, Weight, and MANY more!

Spr_ToreduSpyglass_Trinket.png

Status

Status is a scriptable object which outside sources use. The have three different functions which handle the entire script. ApplyStatus is called whenever a status is applied, UpdateStatus is called every frame the status is active, and RemoveStatus is called when the status ends. To apply statuses to a character, all that you need to do is reference the CharStats and call ApplyStatus, the rest is handled for you no matter the status. In order to get the statuses to do something, derived versions of status are created.

​

In most cases, making a new status to do something takes at most three minutes due to the modularity and simplicity of the system.

​

Since a lot of the statuses were designed in very specific ways, the system had to do a lot of things. Some statuses would only end on a condition (you get hit, you cast a spell, etc). So to get this functional, each status has an optional list of signals. Now, whenever CharStats recieves a signal, it loops through every status effect and sends the signal to that status. Statuses can now compare that signal to their list, and if it matches, the status ends (This system was later reused to allow statuses to do other things when a signal was recieved).

​

There are more derived types of statuses, but below will cover the three most common and how they work.

Buff

Buff is the most common use of the statuses. Using the large amount of possible effects, this script changes the characters stats based on what is passed in.

​

The status can either be a percentage increase or a value increase, negative values can also be passed in.

​

For example, when praying at Grubo's shrine for the second time, you get a buff that permanently removes the amount of weight you are affected by 40%. So the buff object was created, given the "timeless status" bool, and weight was selected as the status to change. Now similar to magic, the player is less affected by weight when they pray.

Damage over Time (DoT)

Spr_PrayerBeads_Trinket.png

DoT's do exactly what the name implies, it does damage to the character over a set amount of time. 

​

You can set how much damage the DoT deals per ticks, how frequent the ticks are, and can even get as specific as deciding whether the ticks deal true damage. In most cases, when the character takes damage, a DoT is applied to them which only ticks once.

​

For example, a scratched spell regeneration deals negative damage to you over time. A DoT object was created, and the frequency was set to 1, meaning every second, you would take a hit of damage while the status was on you. The damage was set to -5 and suddenly the spell would heal you over 10 seconds.

Aura

Aura is a status that keeps another status applied while this one is applied. It has a variable for another status, and resets the internal timers on them indefinetely, until this status is removed.

​

For example, throughout Haem mountain, there are pressure plates which release gas in a small area. When a character enters this collider, an aura is placed on them, which in turn places a DoT on the character. The Aura's timer gets reset by the collider, meaning the DoT keeps ticking damage. When the character leaves the gas, the Aura's timer is no longer getting reset, so it eventually removes, taking the DoT with it.

​

To do this, an object for the aura was made, and an object for the DoT. The DoT was set up as described above, and the Aura had the DoT dragged into it. Now when the aura gets applied, so does the DoT.

Statuses.PNG

World Interactions

A much smaller system I worked on was general world interactions. While a lot smaller in scope, they feed into the general vibes of the game, and can make or break many players experience.

​

All the small features worked on didn't take much, but all added a lot to the quality of Haem.

Pots

Arguably the most enjoyable feature, pots are a common item scattered around Haem which get shattered on multiple conditions. When a character attacks the pots, when a character rolls into them, when a trap activates, or when a spell is cast, pots will break.

​

The system works by having 2 versions of the pot. A single mesh which is the entire pot unbroken, and a group of meshes representing the pot broken into smaller pieces. When the function Smash() is called, the single mesh is replaced with all of the pieces, and force is added away from the source, creating awesome looking pot smashing effects!

Fall Pits

Within Haem mountain, there are many areas that would normally kill you if you fell down. We added a feature commonly seen in games, where if you fall off the map, the screen fades to black and you respawn back on the ledge. 

​

This feature simply has a collider which looks for a character of any kind. When one hits, the collider will respawn the character back on the ledge if it's a player, and instantly kill it if it's an AI.

Traps

Traps are littered throughout Haem to stop anyone from progressing. There are 2 different types, a spike trap, and a gas trap, but the functionality for dart traps and many more is in place.

​

Spike traps are simply a spike with a collider which will hurt anyone it touches. An animation is triggered when the pressure plate is stepped on, causing the spikes to rapidly extend.

​

Gas traps use the previously mentioned Status System. When the pressure plate is triggered, an aura is created which slowly damages people inside overtime.

​

The dart trap uses components from the spell system. A dart is literally a spell interchangable with blood pillum or fireball. When the pressure plate is triggered, the dart is summoned and given a velocity, it damages anyone it hits.

Elevator

When you fight your way through Haem mountain, you will eventually stumble upon an elevator. Going down this triggers the level generation to generate a new level, so when you reach the bottom, a new level is ready for you to fight through.

​

The system is the most simple out of all the previously mentioned ones. When the player steps on an invisible box, the elevator plays an animation and it starts descending. Half way through, it hits another collider which tells the level generation to spawn a new level.

bottom of page