top of page
WIP Icon.png

Hollowborn

Gameplay GIFs

Check out my full playlist:

YouTube Playlist

Note that this page is undergoing updates and the project is a WIP.

Overview

This was my final year university project (FYP) submission and I am continuing development on it now. ​I am making a Souls-Like Combat Prototype that includes action melee-combat, damage resistances, weapon infusions, RPG stats, and more. I am aiming to prove that satisfying melee combat can be achieved with minimal development resources and no prior experience. I will be updating this page as the development process continues.

This project has given me experience with developing a melee combat system, making design documentation, complex system structure, and game feel.​

Role: Solo Developer

Genre: Action RPG, Fighting

Engine: Unreal Engine 5

Team Size: 1

Duration: 30/09/24 - Current

Platform: PC 

Year: 2024/2025

In the projects development, here are some of the key systems I will be developing:

  • Complex Damage System - Separate damage depending on resistances, for example an enemy may be weak to lightning damage but strong against fire damage.

  • Action Combat - Combat controller, animation cancelling, motion warping, motion values, input buffering, lock-on, and more.

  • Debug Menu - A simple debug menu that allows for rapid iteration and testing.

  • RPG Stats & Weapon Infusion - A levelling system akin to that in Elden Ring where each level scales specific stats and the ability to change the damage type and scaling of a weapon by infusing it.

  • Enemy AI - Two enemy types and a separate boss enemy AI.

Complex Damage System

This sections covers the development of the 'complex damage system'. This is essentially a system that allows all actors to have a resistance profile with defence and negation to various damage types. For example:​​​​​​​​​

image.png

The Banished Knight armour set (Fig.1) from Elden Ring has high damage negation â€‹against physical damage and slightly lower elemental negation. The goal is to achieve a similar system to this, whereby each enemy or armour set can have completely different strengths and weaknesses to each damage type.

​​

Immediately I realised that this should be made into a component, because

I want all actors to have easy access to using it:​​​

Fig. 1

I formulated that damage should be calculated as follows:

DmgOut = (DmgIn * Motion Value * Negation) - Defence

​

This would apply for all damage types separately as one's magic resistance will be different to their fire negation and defence. So the incoming damage may be physical and magic damage, meaning that the damage in will be split into two separate calculations and then added together at the end for the total damage.

image.png
image.png

Fig. 2 shows the resistance profile structure that is contained within this BPC_Resistances actor component. I have used maps and enumerators here with default values to ensure that once this component is created, this is how their default resistance profile will look.

​

From this, designers can easily tweak the defence or negation to specific damage types for various entities in the world, be-it the player, or the enemies.

Fig. 2

This was cool as I was able to make my target dummies weak or strong against various damage types, however I discovered a big glaring issue with this system. It was easily possible for the player to deal ZERO damage to an enemy. 

​

For example if the player does 200 Physical Damage. If the negation is 20%, and the defence is 200:

​

Dmg Out = (200 * 0.8) - 200

Dmg Out = 160-200 = -40

​

This is bad design as the player should never be dealing 0 damage to an enemy unless it has been specifically intended. So after some research into Elden Ring's damage calculation I discovered this:

[Elden Ring Wiki]

​​

Damage Calculation

This is the actual damage calculation formula that it uses. By keeping everything multiplicative, rather than subtracting a flat amount of defence, this ensures that the formula will result in damage that is always greater than 0. The only time this won't be the case is when the negation is 100%.

 

You may have also noticed the new variable called the "defence multiplier", and this is calculated from the attack ratio:

​

Attack Ratio Calculation

So the attack ratio is essentially the incoming damage divided by the defence, and then from this value the defence multiplier is calculated:

image.png

Elden Ring calculates the defence multiplier by splitting the attack ratio into separate calculation brackets. The reason for this, is that these formulas join together to form a graph shaped like this:

image.png

This system works perfectly and ensures that damage is more balanced and almost never 0.

​

Here is what this looks like in Blueprints:

Click images to view in greater detail

Damage Calculation Blueprint SS 1
Damage Calculation Blueprint SS 2

Below are snippets from the defense multiplier calculation:

image.png
image.png

From now on, I will ensure that any damage systems I make are multiplicative!

Action Combat

This sections covers the development of the combat controller in Hollowborn. This is a section that will be iterated upon the most, so the information here may be due an update.​​​​​​​​​

​

​

Locomotion:

So far, I have added 3 types of locomotion:

1. Weapon Sheathed

2. Weapon Drawn

3. Locked-On

Weapon Sheathed:

This uses the new Motion Matching animation system from Unreal Engine 5.4. It looks amazing, but didn't look right while holding a big longsword, hence I just kept it for the weapon sheathed movement.

Note: These GIFs may be subject to change

Weapon Drawn:

This is a basic blend space between the idle and running animation.

Locked-On:

This uses a more advanced blend space based on the direction the player is currently holding as well as their current speed. You can see the lock-on in action, and the character strafing around it. The player can sprint to temporarily give them control and break free from the locked rotation.

Combat:

So far, the combat follows the typical souls-like principles leaving for heavy and deliberate feeling combat. Here are the light and heavy attacks in action:

​

You can see that the heavy attack can be charged for a short duration and released for lots of damage. The second part of the combo has knockdown power hence launching weaker enemies that get hit. â€‹â€‹â€‹

​

​

Then I have also added sprint attacks:

Sprint-Light: Whirlwind Attack ​​| Sprint-Heavy: Shoulder Tackle

I wanted these attacks to act as gap-closers to engage a fight. Motion warping has allowed this to come alive by essentially adding additional root motion to the animation so the character moves forward during the attack.​​

Attack Struct

Click image to view

in greater detail

The above image shows the current structure that I have for each attack. It contains key information to play such as which animation montage to play, what camera shake and sound to play, as well as its motion value. Motion values are something that I discovered when researching, and they are essentially a multiplier on top of an attack. They are often used in combos where the first attack does 100, the next 102, the next 105, and then the final hit of the combo chain has a motion value of 110 meaning that it does 110% of its normal damage. This helps me setup and be prepared for when I do add combos.

Blocking:

The combat has offensive actions but only a roll as the defensive action, so I decided ​to add blocking. Blocking allows for slower and more tactical gameplay that helps to give the player time to breathe and counter attack. You can see it in action below:

Here you can also see the enemy attacking the player. The motion warping helps the enemy to track the player's movement so that the attacks connect with the player more consistently.

[Attacking while a character is blocking will make the attack bounce off. This helps to reduce light attack spam from the player (as the enemy can block too) while also giving the player a defensive option at the loss of stamina and health]

​

This is actually something that has now changed. Bouncing off from an enemy's block felt long and disruptive to the flow of combat. To fix this I made the block knock the enemy backwards and make them take reduced damage.​​

​​

​

​

​

​

​

​

​

​

​​

​

​

​

​

​

​​​​

I have made blocking consume some health based on the defensive power of the weapon. Moreover, stamina does not regenerate while blocking. This is to prevent blocking constantly making it riskier. Blocking can be countered though as it consumes stamina on a successful block based on the strength of the attack. If stamina reaches zero, the character will be guard broken and vulnerable to damage. It would be idle to allow the player to critically hit or "backstab" an enemy from this position to reward them for this, however this was out of scope for the project. Below shows the guard break in action:

​

​

Input Buffering:

Successfully making a souls-like combat system relies on the controls being highly responsive. Input buffering is crucial to make sure that the combat system does feel responsive. I have added input buffering for attacking and dodging. This is done using an Animation State Notify that toggles a InputWindow Boolean via an interface. Below you can see it in action:​

As you can see, you can chain dodges together before the previous animation has finished. This allows for the masterful art of panic rolling! (A key feature with a very high skill ceiling!) Seriously though, this makes the game feel twice as good already and will help towards my goal of making the combat feel satisfying. As I have discovered with this project, game feel is not just about particles, camera shake, and sound, it is also about how responsive and smooth the controls feel. Can the player do what they are intending? If not, why? Is it frustrating?

Debug Menu

This sections covers the development of the Debug Menu for Hollowborn. The Debug Menu is a small feature that will allow testers (including developers) to quickly adjust things via a UI pop-up menu. This will allow for rapid testing and iteration - it's best if I show it via some examples:​​​​​​​​​​​

Teleportation:

This allows the player to easily traverse the play space in a few clicks rather than running around everywhere.

Stats:

This allows the player to adjust their characters stats from some pre-set profiles, or by directly setting them. You can notice the health and stamina bars dynamically adapting to the changes in Vigor and Endurance values.

Weapon Infusion:
This allows the player to infuse their weapon with the ailment of their choice. Doing so will adjust the damage types of their weapon as well as the damage scalings.

Implementation:

I have created modular buttons for each of these sections as you can see by the videos above. This is an example for how I made the stat profiles modular. I first created a widget blueprint, added a button and some text:

image.png
image.png

So now a designer can directly set the colour and text of the button, as well as its stat profile when placing the button in the debug menu:

image.png

Click images to view

in greater detail

That is just one example where I have made buttons very modular and re-usable; the rest of the buttons are very similar.

RPG Stats & Weapon Infusion

This sections covers the development of the RPG Stats & Weapon Infusion system in Hollowborn. I have already partially covered these in the Debug Window section so check that out if you haven't already.​​​​​​​​​​​

​

The stats in the game are the same as what you can find in Elden Ring. Vigor scales health and Endurance scales stamina; these dynamic bars can be seen in the section above. On the other hand, we have the damage scaling attributes such as Strength, Dexterity, Intelligence, Faith, and Arcane. I needed my weapon to be able to switch damage types and scaling types based on what the current infusion type was. Again, these will be the same as Elden Ring - Heavy (Strength scaling), Keen (Dex), Magic (Int), etc.

​

This was complicated and hence I had to do a fair bit of research into how scaling is performed. I discovered that when you infuse a weapon, its base damage and base scaling will often decrease, meanwhile, a new damage type is added, and new scaling is added. To do this I made something called an Infusion Profile, which can be set in the weapon's data table:​

image.png

This is the weapon data table that stores all the relevant information for each weapon. 

 

For this project, I will only have one weapon as otherwise I may require more animations that I have not sourced yet. However, I have designed it so that any weapon can be added to the project easily as long as the corresponding animations are provided

At the bottom you can see the "Infusion Profile". This infusion profile contains all the information relevant to the weapon for each infusion type.

​

So essentially if the weapon is infused as Heavy, what is the base damage, what are the new scaling values and types, is there any status damage like bleed, or frostbite?​

Magic Infusion:

Click images to view in greater detail

Magic Infusion

Blood Infusion

Bleed Infusion

So these scaling values are what relate to the grades that you see in menus: S, A, B, C, D, E scaling.

image.png

So as you can see, a weapon can have damage that scales with Strength, Dexterity, and Arcane! However, it is important to note that there are a lot of different cases. For example, lightning damage is affected by Faith and Dexterity, whereas Holy has only Faith Scaling. The physical damage of the weapon will still scale with Strength and Dexterity as normal.

 

Moreover, bleed and frostbite build-up both scale with Arcane. So 60 arcane would mean that it is now actually 120 bleed build-up per hit rather than 60.

Elden Ring's scaling is a little more complicated than mine. This is an example graph for the vigor scaling:

​

image.png

Again, this appears to be some sort of brackets/formula's being concatenated to create the desired fall-off curve. Elden Ring has soft caps for scaling, like you can see the decrease in scaling after 60 Vigor is reached. ​

​

I went for a simpler approach due to the scope of the project, and just made used a logarithmic formula to create a small amount of fall-off.​

image.png

y = 520 log (x+5), where log is base 100

​

This graph makes sure that at 0 Vigor, the player’s health is at 180 and then at 100 Vigor it is approximately 525. But it is not quite as customisable as that in Elden Ring where they seem to use the brackets technique again.

bottom of page