Creating a Combat system prototype

Made by Stijn Peperkamp

Table of contents

  1. Introduction
    1.1 Inspiration
    1.2 Scope
    1.3 Goal
    1.4 Research Method
  2. Process
    2.1 Research
    2.2 Testing
  3. Features
    3.1 Base features
    3.1.1 Stances
    3.1.2 Attacks
    3.1.3 Counters
    3.1.4 Health system
    3.1.5 Stamina system
    3.1.6 AI
    3.1.7 Hit reactions
    3.1.8 Parry
    3.1.9 Combo system
    3.1.10 Sound
    3.1.11 Targeting system
    3.2 Additive features
    3.2.1 Camera shake
    3.2.2 Attack lerp
    3.2.3 Camera centering
    3.2.4 Slow on hit
    3.2.5 Ragdoll
    3.2.6 Dashing
    3.2.7 VFX
  4. Design
    4.1 Damage amount
    4.2 Controls
    4.3 Sound, UI and timings
    4.4 Others
  5. Result
  6. Future development
  7. Sources

1. Introduction

1.1 Inspiration

I have personally always wanted to create a combat system. I just never had the time to fully focus on it. This semester gave me the perfect opportunity to finally work on this combat system. But why do I want to make a combat system? The answer to this question is quite simple. I like playing games with a good combat system. Some examples of good combat systems (in my opinion) are God of War, Assassin’s creed and Horizon Zero Dawn. I like the stickiness of God of War, it also makes the player feel strong. Assassin’s creed has great stealth gameplay, but I also really like the melee and bow combat. AC has multiple ways to shoot bows or fight with different weapons, the hit reactions also really sell the impacts of the hit. For Horizon Zero Dawn I really like the fights with the AI, where you have to destroy parts of the enemy. Personally I would love to be able to create a combat system like these games have, as it would make for a good portfolio piece and it seems like great fun to create it. 

1.2 Scope

The combat systems of the games I have mentioned above have been created by entire teams and took more time than just 5 weeks (S.M.S, 2018) (U.Q, 2018b). This is why I will have to pick certain features of these games’ combat systems and implement them into my own combat system. I will not be able to create a fully fleshed out combat system in 5 weeks but I will strive to create a working, playable prototype of a melee combat system.

1.3 Goal

My goal for this semester is to create a prototype of a combat system that consists of more than just pressing the left mouse button to use a single attack. Many tutorials about combat systems do not delve any deeper than what I described above. A successful end prototype will have features like: the player has multiple different attacks, the player can counter and parry, the player can dodge, a combo system must be present as well as a health system and correct hit animations have to be played upon hitting characters. For more in depth features I will look at the blog by Jason de Heras, one of the combat designers of God of War. 

To make it clear, I intend to be able to technically create these features, designing comes second in terms of priorities. (I will still spend time on design of course). As for the design, I would like the combat system to feel challenging and fun to play. I want the player to feel strong but he should not be unkillable. I will also make this system in the Unreal Engine as this is my preferred engine. I would like people to feel: wow, this is cool. I will try to focus on recreating the design of the combat system of God of War from the blogpost of Jason de Heras. I chose God of War as this was the system that gave me the feelings I have described above.

To define my goal as clearly as possible: I want to create a prototype of a combat system that I can use as a base for a rpg game I would like to develop. This means that I want to have a solid base with at least two methods of fighting. A solid base to me means that the player’s actions have enough feedback, this could be through hit reactions, sound, etc. The player should also be able to attack, parry, counter and dodge. All of these features should be technically sound and modular so new fighting methods can be added quite easily. 

1.4 Research Method

My research followed the DOT framework (The DOT Framework – ICT Research Methods, z.d.). I started by defining my goal, which can be read above. I then started doing field research about the kind of system I wanted to create. I also searched for examples of games that I thought had great combat systems. I basically collected a bunch of info and analyzed them. For example, I watched a few GDC videos to get to know how combat systems are designed (Fishman, 2021), (Sheth, 2021), (Zimmerman, 2022). I then moved onto ‘workshop’ which is part of the DOT framework. Here I started making prototypes and collecting feedback from peers. I tried to implement as much feedback as I had received from my guildmates.

Then, once I thought my product was somewhat presentable, I let my guild members and other students test my product. This is also part of the DOT framework, called showroom. For more information on how I have done my research or the steps I have taken, please read the next chapter; Process.

2. Process

2.1 Research

Kicking off this individual assignment started with doing research of course. I wanted to find something I could use as a base. I had the idea to use the Advanced Locomotion System v4 (ALS). This was a system I had also used during my internship at KeokeN Interactive. During this internship I had to make multiple different movement mechanics and I also had to use ALS. ALS is a free asset on the Unreal Engine marketplace that is a base for animation systems (LongMireLocomotion, 2017). It comes with a basic character that has a bunch of animations already implemented like walking, sprinting and crouching. It also already takes care of foot IK and has a mantling system (which I do not intend to use). The system itself is quite sophisticated, but does not have any gameplay features, except for the mantling system.

I also searched for some tutorials to get me started. Many of these were quite lacking but I did find one which had a lot of potential. This was a tutorial series by DeathDiary (2020). It uses ALS to create a combat system. It covers subjects such as a focus system, hit reactions, weapon switching and adding stances to ALS. This tutorial series taught me a lot, especially about the hit reactions, which seems to take any combat system to a higher level.

I ended up changing and rewriting the code for many of these features from the tutorial series to make it more efficient and modular. The hit reactions for example used a bunch of arrays to decide which hit reaction should play. It was also bound to the current stance (default or sword). This meant that when getting hit by a sword, the sword hit reaction would play, even if the player needed to play the default hit reaction.

For this system I would also need some animations and other assets. All of these have been bought or found for free on the Unreal Marketplace. For animations I am using: 

The base animation system: https://www.unrealengine.com/marketplace/en-US/product/advanced-locomotion-system-v1 

Punching animations: https://www.unrealengine.com/marketplace/en-US/product/fighting-animset-pro 

Sword animations:https://www.unrealengine.com/marketplace/en-US/product/longsword-animset-pro

Bow animations:https://www.unrealengine.com/marketplace/en-US/product/ghostsamurai-bundle

Counters:https://www.unrealengine.com/marketplace/en-US/product/one-hand-sword-attacks-and-finishers

https://www.unrealengine.com/marketplace/en-US/product/hand-to-hand-finishers-volume-01

Damage:https://www.unrealengine.com/marketplace/en-US/product/frank-damages

Sound: https://www.unrealengine.com/marketplace/en-US/product/ultimate-sfx-music-bundle-everything-bundle

Character: https://www.unrealengine.com/marketplace/en-US/product/mercenary-warrior

2.2 Testing

Once I finally had a product that was ready to be tested, I created a survey. I made several questions and had the testers answer them and provide feedback. What I have done with this feedback can be read in the upcoming chapters.

These were the results of my survey:

3. Features

In this chapter I’ll talk about the features I have created. I will show code snippets, videos and explain a bit how the feature works. The code in the videos might have exaggerated values as it could be easier to show the feature.

3.1 Base features

3.1.1 Stances 

Before working on this feature I first had to do some research. For my combat system I wanted to have multiple stances, but which ones should I choose? My eventual goal for this project is to make a small expandable RPG game demo. I would like there to be magical monsters and human foes. Eventually I would like to add a reputation meter. I would like to have different methods of fighting that are best for each opponent. For example, if you were to kill a human foe with a sword during a bar fight, this would decrease your reputation and so a fistfight where you knock him unconscious would be better. For monsters that should be killed, a melee attack would be better as it does more damage. But what if the enemy is far away or is flying, how would you hit him then? Because of this reason, a ranged attack is also needed.

To have come down to this conclusion I have looked at multiple games, such as The Witcher 3, Assassin’s Creed Odyssey, Ghost of Tsushima, God of War and Middle Earth: Shadow of War. The reason why I have looked at these games is because I really enjoyed playing them and because they are hugely popular and successful (Assassin’s Creed Odyssey (App 812140) · Steam Charts, z.d.) (God of War (App 1593500) · Steam Charts, z.d.), (Middle-EarthTM: Shadow of WarTM (App 356190) · Steam Charts, z.d.), (The Witcher 3: Wild Hunt (App 292030) · Steam Charts, z.d.).

These games all have multiple weapons for melee attacks and have a ranged attack, some even have some magic included. I would like to have at least different melee attacks and a ranged attack. This is why I ended up with a fist stance, a sword stance and a bow stance.

These stances all have movement animations and different attacks, the attacks will be explained in the next subchapter.

3.1.2 Attacks 

Every stance must also have some attacks. Without attacks this would of course not be a combat system. So for each of the melee stances I wanted to add some light and heavy attacks. Currently the only difference in light and heavy attacks is that heavy attacks deal more damage and take a little longer to do damage. I am not happy with this current design. I would eventually like to implement something more like Ghost of Tsushima where the heavy attacks are a block breaker (Fishman, 2021). At the moment my AI cannot block however, so this is not a valid option at the moment. In the next video the light attacks for the stances will be shown first then afterwards the heavy attacks will be shown.

There is also one special attack implemented. This attack can be used if the attack counter is full. This counter can be filled by hitting the enemy.

I had first implemented these attacks by filling a lot of arrays with different animations for each stance and each attack type. This was very inefficient and made everything messy. I had to find another way to implement this and did some digging in the engine. Eventually I found datatables, which seemed very useful for this situation (Wadstein, 2017).

In the image above the datatable for the attacks can be seen. I can add light and heavy attacks to each stance and add as many as I like. In the blueprints below I show how I get the correct row out of the datatable. I basically filter through the datatable by checking which stance(overlay) is being used. Then later, in the next image, I filter it based on if the user wants to light attack or heavy attack.

Filtering through rows
Getting the correct montage
3.1.3 Counters

Next I decided I wanted some finishers and counters. Currently these are two paired animations that have to be played at the right time and distance. For its implementation I made yet another datatable, but this time I also added a distance variable for each counter. I also made sure I could filter if I needed to play a lethal or non lethal animation.

Getting the correct counter

In this blueprint I once again filter through a datatable but this time I check if it should be lethal or not. Then I get a random counter to play if the stance (overlay) of the animation is the same as the current player’s stance.

Counters can be done by pressing the right mouse button at the right time. A UI will popup when the enemy is about to attack, when the player right clicks when this UI occurs, a counter will be done. If the enemy is low on health a lethal finisher will play.

I decided upon this as I wanted to implement the counter system of the Assassin’s Creed series (endmover, 2013). I’d have to say I feel like I succeeded in this, I am however not satisfied with how it works as it can be exploited quite easily. Some testers have also voiced their opinion on this and would also like to see it reworked, they liked how the attacks looked and that it worked quite well, but it was too easy. So in the future I will have to rework these counters and maybe try something more like how God of War does it by adding a stun meter(God of War: Finishing Move – How to Make It? – God of War Guide, z.d.).

3.1.4 Health system

Adding a health system to a combat system is a very obvious choice, how else would we know if the player or enemy takes damage or dies. All of the games I mentioned previously have a health system incorporated, so I decided to make my own simple system. It could be a very basic system as making a very complicated, well designed and unique health system was not within the scope of my project.

For the health system I basically create a max health and current health value for each actor. If any damage is taken I simply subtract the amount of the current health. If the current health is zero or lower, it means the actor has died.

ApplyDamage

The above blueprint shows the ApplyDamage function. It basically does a bunch of checks to see if damage can actually be taken. If it can, then the amount will be checked, if it is below zero, the character should die.

OnDeath

On the blueprint above the OnDeath function can be seen. This function is called in the ApplyDamage function if the character’s health is zero or below. The OnDeath function removes the enemy out of the enemy array if he has died, it also causes the character to ragdoll.

3.1.5 Stamina System

The stamina system is a system that works similarly to the health system. I am using this system to make sure players cannot dodge endlessly. After some feedback from my testing results I have also added stamina depletion to the heavy attacks. This was done to have a reason for fist combat since you cannot endlessly swing your sword anymore. 

I am not fully satisfied with this system as it is basically a way to limit the uses of some actions. I simply created this system as it was an easy way to quickly remove the overpoweredness of the sword attacks and the dodges. But in a GDC talk I watched about Ghost of Tsushima, it was said that limiting the use of a fun and effective mechanic is not a good idea, it is better to make the other mechanic as effective and useful instead(Zimmerman, 2022).

3.1.6 AI

The AI was not the focus of my combat system. In general however, if you want to make a combat system, you need enemies to fight. Usually the challenge in melee games is created by the design of the combat system and the enemies (De Heras, 2021). For my project, adding complex AI would be quite out of scope, so I decided to add some basic AI that should not be that strong, they should be there so the combat can be tested.

I made sure my AI inherited from my base character so that it had access to most of the functions the player also uses. I made a small behavior tree with the help of an official Unreal Engine tutorial (Souza, 2020) to refresh my knowledge of them.

AI behavior tree

This is how the behavior tree ended up looking like. There are multiple functions I have created to make this work. There are three states, stunned, attacking and roaming. When the enemy is stunned he should pause the behavior tree and just wait until he is not stunned anymore. The middle part is the attacking sequence. It first sets the state of the AI so he will be in attacking mode, then he will walk towards the player and once he gets in range, he will attack. Afterwards he will walk back and find a spot around the player, which is done through EQS. 

EQS donut grid

The EQS can generate several types of grids around an object(Souza, 2020). I made it so that a donut-like shape spawns around the player. I gave different priorities to the different spots so that enemies will try to move to a spot close to the player where no other AI is standing.

3.1.7 Hit Reactions

Hit reactions were actually a very big priority on my Trello list. In most of the combat system videos available on YouTube, hit reactions are not part of the system. To me, hit reactions always seem quite important to convey the feedback of the player’s actions. It can for example show if an enemy is being staggered or hurt badly. In this case, the player will know his actions have consequences and can elaborate on them further.

For the creation of the hit reactions I mostly used two sources. The first one being the tutorial of DeathDiary (DeathDiary, 2020 )and the second being the blogpost of the combat designer of God of War, Jason de Heras(De Heras, 2021). The tutorial gave me a good start with some okay results. It had brought me further than I would have come by myself. But it was lacking a bit. The hit reactions were for example linked to the stances. This meant that if the player hit an enemy while in fist stance and the enemy was in sword stance, the enemy would play a fist hit reaction instead of a sword one. The blueprint was also very cluttered with arrays which were not great to work with. 

I decided to make the system more modular and readable. So I added the hit reactions into datatables as well. This eliminated the arrays but I still had to filter through them to get the correct one. The stances were now also unlinked, which was great.

The most important part of the blueprint code of the attack tracing for getting hit is this:

This calls multiple different functions to decide the hit reaction that should be played.
Getting the correct hit animation.
Getting the correct row.
Getting hit function.
Deciding the hit reaction to play.

These are all functions I have made by myself to get the correct hit animation to play. In simple terms, I filter through the datatable to get the correct animation, check if the player is parrying or not and then make sure the correct animation is being played.

3.1.8 Parry

After making the hit reactions, I also wanted the player to be able to parry. Most of the code for creating the parry system is very similar to that of the hit reactions. It is even part of the same datatable, as parrying an attack also requires a hit reaction to be played. Otherwise there would be no feedback, animation-wise, to show that the player has parried an attack.

On the image above the data from the hit reaction datatable can be seen. This snippet shows the row for right side hit reactions. 

3.1.9 Combo System

For the creation of the combo system I first watched some videos on how to tackle this. I watched many videos of different creators. In the end I watched two of them completely as I thought the quality of those systems were quite good. These videos were: https://www.youtube.com/watch?v=UI7mjCLknws&t=63s and https://www.youtube.com/watch?v=Pkt5NOvkPRY . In the end the first video was too much based on his own project and the second video ended up being a bit too basic. Nonetheless, I still learned the general grasp of how to create a small combo system from these videos. 

Basically, what a combo system is, is a system that lets you play different animations after the player wants to attack. Usually this is based on timing and it can be as expansive as you would want. I decided to make this system quite modular so it would work for every stance and light or heavy attacks. Currently there is a list of animations that can be played (from the attacks datatable), it checks the current attack animation and simply moves onto the next one. The different stances and attacktypes have been separated so that the player can combine attacks like so: fist light attack 1(fla), fist heavy attack 1(fha), fha2, fha3, fla2, sword light attack, etc. 

Attacking sequence
Getting combo animation
Deciding next combo attack

In these blueprints the most code for the combo system can be seen. It shows the filtering through the data, getting the correct animation and counting up the different combo counters.

3.1.10 Sound

Sound is something I added quite late into the project. For the sound I first looked at what actions could use sound. Most importantly all the different attacks needed sounds as this would provide more feedback. During my first test I also got feedback that sound could improve the game feel a lot. For the sound I made a function that could be called on every animation at certain frames to play a sound. I made this function as it could be used for any animation and any sound. I simply made some variables public so I could change the sound and the volume.

AnimNotify PlaySound

The blueprint above shows the code for playing the sound. I now needed to add this to all the animations.

I also needed to do some research about which sounds should be played. For this I massivegwatched a couple of videos about the combat systems of the games I have mentioned previously(De Heras, 2021)(MassiveG, 2018). I first listened to these videos in slow motion with my eyes closed and afterwards I watched them at normal speed. This way I could figure out what kind of sounds are mostly used.

My conclusion was that the most important sounds were the grunts for attacking or getting hit as well as impact sound and wooshes for swords or punches.

Animation sequence with ANPlaySound

Above an animation sequence is shown. It shows the amount of notifications (mostly sound) that are being used for the punch out attacking animation. I had to do this for all the animations I wanted to have sound.

As for how I got these sounds, I first did some research on asset packs on the Unreal Marketplace. I found the ‘Ultimate SFX & Music Bundle’ which I then bought on sale (SideArm Studios, 2021). I then imported these into the engine and made audio cues out of the .wav files. To make sure the sounds would not sound repetitive I added multiple similar sounding audio wavs and added a modulator to randomize their pitch and volume within a certain range.

On the left an example of one such audio cue is shown. This particular cue shows the five different audio wavs for sword impact on flesh. It then gets a random audio wav out of the wav and puts it through the modulator.

The sounds can be heard in most of the example videos.

3.1.11 Targeting system

Most combat systems in the games I have mentioned previously also have some sort of a targeting system. This can be a manual or automatic system. In the blogpost of Jason de Heras he shows the locking system of God of War. With the DeathDiary tutorials I had gotten a base for the targeting system. This was however running on the tick function (update for Unity users). This is something that should be avoided as much as possible to reduce the amount of times a function is called. So, I decided to change the way targets are acquired.

I have added a big sphere collider to the player and when it collides with enemies, it adds them to the array of enemies. If they die or leave the sphere, they will be removed from the array. This means that I only have two times when I should be adding enemies instead of constantly checking within Tick. The blueprint below shows the collision events.

Overlap events

There are also two ways to focus on enemies. One is by getting the player’s movement input and the other is by getting the player’s looking direction. If the player is moving his mouse more than a specific value, then the autofinding of enemies is being done by getting the enemy that is the closest to the looking direction. Otherwise, if the player is not moving his mouse much, the player’s WASD movements decide which enemy to target.

Deciding if the player should autofind.
Getting the correct enemy to focus on.

In the first part of the video I am getting targets with the camera. Afterwards I barely move my mouse and am targetting through the use of WASD.

3.2 Added features

As these features are smaller, I will describe them in less detail. These features are additive as without them the combat system would still function. Without these features however, the combat system would feel more basic and less impressive, so they are still very important.

3.2.1 Camera shake

Using camera shake was an idea I came up with after watching videos about the de herasGod of War combat system from the blog of Jason de Heras. There is not a specific topic of camera shake on his blog but when slowing down the videos, I did notice some camera shake happening when hitting an enemy. I also watched videos about Assassin’s Creed odyssey and saw they were using very subtle camera shake in some attacks as well (MassiveG, 2018). I felt like this gave the hits even more impact, so I decided to add camera shake to the hits.

Creating camera shake with Unreal Engine is very easy, you just have to call the function ‘Start Matinee Camera Shake’ and add your camera and camera shake asset. These camera shake assets can also easily be made and modified.

On the image above the light attack camera shake can be seen. There are several options to change the camera shake. I decided on using a more subtle shake, using only the camera’s rotation instead of its location or fov. The shake has a short duration and also a very short amplitude. This was done to make sure the shake wasn’t too overpowering.

3.2.2 Attack Lerp

This is a feature I read about in the blog of Jason de Heras. It causes a combat system to become more user friendly as judging an attack’s reach becomes easier. It also causes the system to feel more sticky as the player literally gets suctioned towards the enemy(De Heras, 2021). 

To create this I reused some code from the counters. Because for the counters you get moved to a position in front of the enemy. This is also something I need to do for this attack lerp.

This is the part of the code that moves the player forwards toward the enemy. The part below makes sure the player moves back when he is too close. This is done to prevent the player from attacking literally in front of the enemy.

In the video, the distance of the attack lerp is exaggerated so the effect is easier to see.

3.2.3 Camera Centering

This is another feature I have read about in Jason’s blog. According to him, camera centering is a very useful feature as it reduces the cognitive load of the player. Cognitive load has to do with the fact that the brain can only handle so many things at once (Mind Tools, z.d.), so reducing the amount of things the player has to think about, will ease the player’s technical burden(De Heras, 2021).

In the blueprint above I get the rotation for when the camera should be centered. The camera centering makes sure that the camera will be behind the player while attacking without the player having to move the mouse. It will smoothly interpolate into position.

In the blueprint I calculate the direction between the player and the focused actor. Then I add a distance to make sure the camera is set behind the player. Then I find the lookat rotation from that camera location towards the player so that the camera will focus on the player.

3.2.4 Slow on Hit

In his blog, Jason also talks about adding hit pauses. This makes it seem like the hit truly connects and really has an impact. A hit pause is exactly like the name suggests; when an attack hits, pause the animations for a short time to really sell the idea of the moment of impact. I have tried to implement this exactly how it is described above.

Slowdown function
SetNewPlayRate function

The above blueprints show multiple functions. In SetNewPlayRate I set the new play rate of the animations of both the attacker and the victim. I can lower this or heighten it to make animations slower or quicker. Then I have a delay, after which I reset the play rates. This makes it so that the animations are slowed or fastened at whichever time I choose. At the moment I am using a very low value for both the delay and the playrate to create the effect of having the animation stopped for a short while.

In the video, the duration of the slow on hit has been exaggerated to show the use of the feature. To see how it normally looks, take a look at the video on the result chapter.

3.2.5 Ragdoll

Adding ragdoll is a somewhat small feature that does add to the feeling of powerful hits as it can make whole characters just go limp. I use this feature whenever a character dies to simulate actual death as there is no control over body parts anymore. I also use it for some animations where I feel like characters should get knocked out.

To actually add in ragdolling was quite simple as it is a feature that is part of the ALS V4 system. To make it work I simply had to fix some collisions, as weird bugs occurred when making a character ragdoll. For example, the player would get forces upwards if he hit a falling character that was ragdolling. To see an example of the ragdolling, look at the video for the health system.

3.2.6 Dashing

Dashing was added into the prototype because during a test I got the feedback that the player should be able to move more and evade enemy attacks. At the moment it is not that necessary to dash because the enemies’ damage is not that high and the player should still be able to move out of the way of enemies, as well as parry or counter their attacks. 

Nonetheless, I still added a dash. Some of the previously mentioned games have evades or rolls. These generally use animations but I did not have access to these kinds of animations, so I decided to use a little bit of VFX instead. 

3.2.7 VFX

In the end I did not have enough time leftover to implement a lot of VFX. This will be something I will have to add in the future. I did still manage to add VFX for the special attack and the dash though.

4. Design

The design of the combat system is an important part of the system. During this project this was not my focus however. Nonetheless, I have still tried to do some designing. While I would like to improve upon this in the future, I did have to make some decisions during the five weeks I have been working on the prototype. In the upcoming subchapters I will explain my thought process and highlight some examples of the choices I have made.

4.1 Damage amounts

I have been trying to recreate the difficulty of enemies from the blogpost of Jason de Heras about designing easy enemies. In this post Jason highlights the Draugr and explains its behaviors. To get the correct damage amounts I have first checked how many times these enemies should be hit before they die. This was around 5 normal hits of Kratos. So the damage amounts I am using will take down the enemy in about 6 to 4 hits. The sword takes down an enemy in 4 slashes, while punching, which is weaker than the sword, takes it down in 6 hits.

4.2 Controls

To create the controls I am using, I have done some research on popular control schemes and the most easy to use keys. I have found that there are some keys that are easier to use as primary controls. More about this can be read in the source used for this research: ‘Designing Game Controls’ by Andrew Dotsenko.

I have tried to use all the primary keys for the actions that should be done more often. I have also tried to use the control scheme that a lot of rpg games use. Meaning that the left mouse button is used for attacking and WASD is used for moving, etc.

4.3 Sound, UI and timings

Adding sound in the later stages of the project was done on purpose. I first wanted to make sure the prototype gave enough feedback without sound. I did this because sound can add a lot to a game, but if you add it too soon, you might miss some important elements that make the system better. 

UI was another element that can give feedback to the player. I added UI to make some variables more clear. For example, I added a health bar, a stamina bar and an attack counter. I also added some UI for when the player is about to be attacked. Ghost of Tsushima also does this by adding a white or red spot to the weapon of the enemy(Rosenberg, 2021).

As for the timings of counters, I made sure to look at the average reaction speed of gamers and make sure that the time for counters fell within this value. The average reaction speed is between 300-500 milliseconds(Alford, 2021). With the slowdown I added to enemy attacks as well as the counter timings, the timing should be quite reasonable. For the timing of combo’s I made sure to look at when the animation was ending, to indicate when the player could attack again, as well as the reaction speed. This meant that I added  these triggers well before 300 milliseconds to give the players a fair chance to do a combo without button mashing.

4.4 Others

There were many other things I had to think about. For example: What should the attack range be? How often should the AI attack? How far should the player be able to lerp?

For many of these questions the answers came from testing. If the testers thought a certain distance simply felt right, then this was enough reason for me to use that distance.

5. Result

I am quite happy with what I have achieved in these five weeks. I think my project has been quite a success as I am well on my way to create a very good prototype for a combat system. I have gained a lot of new information and am going to continue working on this project. The system has a lot of features implemented quite well as they are very modular. There are also some features I am not so sure about like the stamina system. Features such as these will need another check. The features that have been implemented can be read about in chapter three.

The end result of my combat system can be seen in this video. A demo can also be played by downloading the zip.

A playable demo can be downloaded here: https://drive.google.com/file/d/1ShqKJ80rDsDPD64JXXjvtOwCiNet2KPi/view?usp=sharing

For anyone who will download the game here are the controls:

6. Future development

I intend to continue developing this combat system and implement it in a rpg I will create. I would like to add a lot more features. Things like different stances and weapons. For example, adding spears, axes and shields. This should be somewhat simple as the hit reactions should already work, I would only need to find appropriate animations and edit these with my code. I will also have to improve the AI and add a lot of different enemy types.

I will also need to rethink the stamina system, as well as think more about design in general. For these five weeks I had to rush some design decisions as otherwise I would not be able to finish what I had planned. I will take more inspiration from the GDC talks about God of War and Ghost of Tsushima as these go really in depth on how to make a good combat system (Fishman, 2021) (Sheth, 2021).

7. Sources

S.M.S. (2018, 20 april). God of War Credits. mobygames. https://www.mobygames.com/game/playstation-4/assassins-creed-odyssey/credits 

U.Q. (2018b, oktober 5). Assassin’s Creed: Odyssey Credits. MobyGames. https://www.mobygames.com/game/playstation-4/assassins-creed-odyssey/credits 

LongMireLocomotion. (2017, 27 januari). Advanced Locomotion System V4. UnrealEngine. https://www.unrealengine.com/marketplace/en-US/product/advanced-locomotion-system-v1 

The DOT Framework – ICT research methods. (z.d.). Ictresearchmethods. https://ictresearchmethods.nl/The_DOT_Framework 

DeathDiary. (2020, 4 augustus). Combat System with ALS v4 Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=eq5njm7v5GM

Zimmerman, C. (2022, 2 maart). Master of the Katana: Melee Combat in “Ghost of Tsushima” [Video]. YouTube. https://www.youtube.com/watch?v=1ih5BxnJu2I&t=20s

endmover. (2013, 11 januari). Assassins Creed 3 – COUNTER KILLS [Video]. YouTube. https://www.youtube.com/watch?v=R4D1DU5YtPA&t=1s

Wadstein, M. (2017, 27 april). WTF Is? Get Data Table Row in Unreal Engine 4 ( UE4 ) [Video]. YouTube. https://www.youtube.com/watch?v=3VF41mAgG8w

God of War (App 1593500) · Steam Charts. (z.d.). SteamDB. https://steamdb.info/app/1593500/graphs/ 

Middle-earthTM: Shadow of WarTM (App 356190) · Steam Charts. (z.d.). SteamDB. Geraadpleegd op 11 april 2022, van https://steamdb.info/app/356190/graphs/ 

The Witcher 3: Wild Hunt (App 292030) · Steam Charts. (z.d.). SteamDB. Geraadpleegd op 11 april 2022, van https://steamdb.info/app/292030/graphs/ 

Assassin’s Creed Odyssey (App 812140) · Steam Charts. (z.d.). SteamDB. Geraadpleegd op 11 april 2022, van https://steamdb.info/app/812140/graphs/ 

Fishman, T. [GDC]. (2021, 12 november). Honoring the Blade: Lethality and Combat Balance in “Ghost of Tsushima” [Video]. YouTube. https://www.youtube.com/watch?v=dKS2kaI3aXE 

Sheth, M. [GDC]. (2021, 5 november). Evolving Combat in “God of War” for a New Perspective [Video]. YouTube. https://www.youtube.com/watch?v=hE5tWF-Ou2k&t=93s 

God of War: Finishing move – how to make it? – God of War Guide. (z.d.). Game Guides. https://guides.gamepressure.com/god_of_war/guide.asp?ID=44356#:%7E:text=When%20the%20enemy%20stun%20bar,to%20continue%20attacking%20the%20beast

De Heras, J. (2021, 22 december). Combat Design Blog. Jason de Heras. http://jasondeheras.com/blog 

Souza, P. [Unreal Engine]. (2020, 25 november). Unreal Engine AI with Behavior Trees | Unreal Engine [Video]. YouTube. https://www.youtube.com/watch?v=iY1jnFvHgbE 

SideArm Studios. (2021, 10 juli). Ultimate SFX & Music Bundle. Unreal Engine. https://www.unrealengine.com/marketplace/en-US/product/ultimate-sfx-music-bundle-everything-bundle 

MassiveG. (2018, 30 september). Assassin’s Creed Odyssey: HUGE 300 Soldier Battle Gameplay (Spartan Conquest 4K) [Video]. YouTube. https://www.youtube.com/watch?v=OCPMdir00YI 

Mind Tools. (z.d.). Cognitive Load Theory: Making Learning More Effective. https://www.mindtools.com/pages/article/cognitive-load-theory.htm 

Dotsenko, A. (2017, 29 maart). Designing Game Controls. Game Developer. https://www.gamedeveloper.com/disciplines/designing-game-controls 

Rosenberg, A. (2021, 29 oktober). “Ghost of Tsushima”: How to master the virtual samurai ways. Mashable. https://mashable.com/article/ghost-of-tsushima-guide-tips-combat-stances#:%7E:text=If%20you%20see%20a%20small,counterattack%20if%20you’re%20lucky

Alford, A. (2021, 31 januari). How to increase reaction time in gaming. Dot Esports. https://dotesports.com/general/news/how-to-increase-reaction-time-in-gaming#:%7E:text=While%20the%20average%20FPS%20player,times%20between%20100%2D250%20milliseconds

Related Posts