Howl of Iron is a 3rd Person Action Adventure game mixing a thrilling HUNT & COMBAT gameplay.

The player takes control of Vincent Volk, a renowned engineer and former Red Gear worker who has lived a hard childhood and after suffering the loss of his loved ones, his wife and daughter, because of carbogenosis, he decides to completely dehumanize and transfers his consciousness to a mechanical werewolf. With his mechanical body he threads to destroy everything that once harmed him and consummating his revenge.

Howl of Iron was developed as the final thesis of my games programming master degree. It has been developed by 17 students of 4 different master degrees: game programming, game art, game design and production. We have developed the game in 9 months using Unreal Engine by 16 Gears.

You can find more information about all projects in its itch.io website and the source code in this link.

  • Developer : 16Gears
  • Engine : Unreal Engine 4.27
  • Languages : C++, Blueprints
  • Role : Gameplay & AI Programmer

My Contribuctions

We created our own perception System. During two weeks my team have try to create a well-functional system. After a few tries we created a modular system that allows us to create different types of perception that increase the float value of the detection. We created 2 types of components: DetectorActorComponent and DetectableActorComponent, with this we can create different types of detectable actors like the player or even the dead bodies of the other enemies that warn others of the position of the player.

 

First, we created the detection module, in wich,  we start with the calculation  the distance between the player and the enemy, if the distance between them is near enough, then it will raycast to check if the enemy can see the player.

 

 

Another module is NearPerception. The module increases the detection value if the player is in range, we use it to detect the player when is in the enemy’s back. Another type is SoundDetection, the module is activated when the player does some action or ability, calls a detector actor if the enemy is in range, and sends to the enemy the increased value from the sound. Also each type of detection has a weight to allow the Design departament to change the values when they want.

In this game we have three types of enemies. I developed the «Hunter». It have a 3 states that manage the behavior of this enemy. His first state is Patrol, in it, he follows the route around a square, when he see or heard something he start the alert State where he increase his movement speed and also have more vision range. When he completely sees our character enter combat mode, in it, he changes his movement set and uses different weapons depending on the distance or the immunity state. When our main character is near he uses a FlameThrower, in a middle distance he uses a ShotGun and when Vincent is too far our Hunter will use an electric projectile, if it hits it will reduce the movement speed of our main character.

Also we have to create our own decorators, services and tasks, this is one example of one decorator we have to create.

Another perception is NearPerception, it increases the detection value if the player is in range, we use it to detect the player when is in the enemy’s back. Another type is SoundDetection, when the player does some action or ability, it calls a detector actor if it is in range, and sends to it the increased value from the sound. Also each type of detection has a weight to allow the Design departament to che the values when they want.

During this project we have a problem with the optimization of the game. Our environment was procedural and small pieces, in our first map we have 40000 actors in a scene. I develop with other programmers a tool that allows us to group and merge actors in the scene. We inherit from BoxTrigger and make some filters to select actors. The first method is to select all that is inside the trigger, the second method filters actors by staticMesh, it only selects the actors that have the mesh filter, also we upgrade this filter to become an array filter and use it with two or more static mesh. The third method is similar to the second one, but it is filtered by Material of the StaticMesh, also it was upgraded a few days after with the array filter. The last mode allows us to create Instantiated Actors, it creates an Actor with the Instanced Actor component and copy the transform of the selections to the component. After two weeks with this tool, we reduced the actors in our map from 40000 to only 7000 actors in editor, with this we upgraded our performance by around 10 ms and allowed us to reach 60 fps in game.

 

       

In this game we play as Vincent Volk, a mechanical Werewolf. We use the Gameplay Ability System to develop our combat. We created different abilities for each hit of our character, this can allow us to make different powers in each hit in our combo system, also we create different state abilities that allow us the behaviors mentioned in the Section “Enemies Behavior” like Combat state or Immunity State. More stuff was a long list of tasks than we developed to allow the Design departament create difficult abilities or actions in an easy way in Blueprints. After this project I can say I have a very good experience using the Gameplay Ability System and I’m looking forward to starting a new project using it.

This is some example of one of our abilities:

Also we have to create so many gameplay tasks to do specific things that our designers ask us to create like this: 

During the development we need to create paths for the enemies’ patrols so we created waypoint tasks. When the enemies arrive at a waypoint it triggers all the HIWaypointTask that are instanced in the waypoint, with this we can allow the enemies to play animations or wait time on the waypoint. Also with this, our design team can create his own conditions like go across a trigger to start the patrol.