top of page

Acerca de

aw2-logo.jpg

Asgard's Wrath 2 - Combat and Systems Design

About Asgard's Wrath 2

Asgard's Wrath 2 is an award winning AAA VR Action game developed by Sanzaru. Asgard's Wrath 2 was the launch title bundled with the Quest 3, and had one of the highest scores of any VR game (acquiring a 10/10 at IGN) and won multiple awards.

I joined Sanzaru out of college as a Junior Designer about halfway through development. By the end of development, I had been promoted to Combat and Systems Designer and had ownership of the majority of standard enemies, as well as two bosses.

When working on Asgard's Wrath 2, my primary jobs were enemy design and implementation, blueprint scripting of misc features, and bug fixing. The game was developed for both the Quest 2 and Quest 3 platform using Unreal Engine 4.

Enemy Design

I joined Sanzaru halfway through Asgard's Wrath 2's development cycle, and within a few months I found myself in charge of the design of all our humanoid non-boss enemies. These make up the vast majority of the enemies players encounter during the gameplay and the game is heavily combat-centric, so a lot of time was spent on refining these.

 

When I took over humanoid enemies, the first 9 enemies were in a fairly finished and the remaining 14 had finished art but no functionality. The first 9 I maintained as we improved upon all humanoid enemies, but the last 14 needed designs from scratch.

 

These 14 enemies represented several unique challenges.

  • Firstly, they needed to use the created art assets with at most slight tweaks.

  • Secondly, we had severe performance restrictions on how many enemies could be spawned at once, meaning all of these enemies needed to work in ensemble combat of between 3-5 enemies (depending on the area) while ideally having several that were interested as solo fights in low enemy density areas.

  • Thirdly, these 16 enemies were split into 3 different groups and belonged to different regions. Each of these regions were played as different characters, with extremely different kits. However all of the enemies could be fought by any character in the post-game and in a roguelike mode attached to the game. Thus all enemies needed to be interesting and fun to fight for all four characters (including a character who was almost purely ranged and a character who was almost purely melee). To add to the challenge of this, the development of the original 9 enemies was done under the assumption that the only character fighting them would be the purely melee character. This meant there was no experimentation done on how to make interesting ranged enemies yet, and that the original 9 needed to be retrofitted to be interesting to fight with ranged weapons.

  • Lastly, Asgard's Wrath 2 was a VR game. The design-space for action VR games is still fairly new and ill-defined so most of the time when I wanted to do something, if we hadn't done it in Asgard's Wrath 1 then it hadn't been done before anywhere in VR.

 

 

 

 

Sakhmet Faction

 

 

 

 

 

 

 

 

 

 

 

 

 

Footage courtesy of "A Wolf In VR"

 

 

 

 

 

 

 

 

I began with the Sakhmet enemy faction. This faction is the primary enemy faction in the second region, and during normal gameplay is primarily fought with the second player character: Cyrene. Cyrene's kit involved a quick firing ranged weapon with heavy homing on the projectiles, the ability to turn said ranged weapon into a shield temporarily, and a melee weapon. This left three notable challenges that needed to be overcome for this faction:

  • Due to scope limitations, I was given the direction that this faction needed to mostly re-use art from the first enemy faction (the "Set" enemy faction). These enemies needed to clearly differentiate themselves, as the player would have been fighting the Set enemies for over 20 hours when they reached the Sakhmet enemies.

  • Cyrene's strong ranged power meant that I needed to discover how to create engaging ranged combat using our existing systems.

  • These enemies still needed to be interesting to fight for the other 3 playable characters.

 

The first step I took with these enemies was to sit down with the designer of Cyrene's kit and work with them to define a desired playstyle for her. This ended up being a hybrid ranged-melee playstyle with an emphasis on using her tools to avoid damage, as she had an easy time dealing damage. I translated this to two behaviors which defined the Sakhmet faction:

  • Enemies should dart in and out of melee, forcing the player to suddenly defend themselves from melee attacks then returning to range so the player can hit them from range again.

  • Enemies should primarily use telegraphed, high damage AOE attacks at range. This meant that a player who fought enemies at range would need to constantly dodge the AOEs.

 

To do this, I recycled the enemy melee behavior of the Set enemies (since that was already proven out) and added behavior to the enemies to cause them to dart in and out of melee range. I then developed different 1-2 ranged attacks for each Sakhmet enemy to create a variety of attacks to dodge across the 4 enemies. Lastly, I gave each enemy a unique role they could play in an ensemble composition. Sakhmet Hunters became the standard trash mob, with an extremely lethal but easily dodged ranged attack and a particularly high frequency of jumping between melee and ranged. Sakhmet Overseers became the artillery, constantly raining damage while hiding behind other enemies. Sakhmet Commanders became buffers who prefer to try and jump to ranged and force you to deal with a melee combatant. Sakhmet Trappers became melee specialists who will disable your follower (a powerful allied combatant who is always around) if they engage the follower, making them particularly high priority to take down. This created a good toolkit for encounter designers to play with in terms of making interesting combats. Encounters felt significantly different when you changed even one enemy in the composition and positioning of the enemies could also be quite transformative to the dynamics of the combat. These enemies also supported melee only and ranged only playable characters, as if the player forced them into their preferred range the enemies would stick to that range and fight there for a bit.

 

There was only one problem, with only the Sakhmet Hunters as trash mobs there wasn't enough variety for quickly killable enemies to scatter throughout the level. The solution to this was the introduction of the Sakhmet Hellion. This enemy is a simple exploder-type enemy. When it sees the player it'll run into melee range and explode, dying and damaging the player. The player could respond to this by dodging out of the explosion, or by hitting the enemy. Hitting the Hellion at any time knocks them backwards and causes them to explode early (potentially damaging their allies). This meant Hellions were both interesting wrinkles to spawn mid-combat and good trash mobs to scatter throughout the level (making the level feel alive and lived in without meaningfully slowing down the player, as they were instantly defeated on taking any damage).

 

Undead Faction

 

 

 

 

 

 

 

 

 

 

 

 

Footage courtesy of "A Wolf In VR"

 

 

 

 

 

 

 

 

 

Once the Sakhmet faction was done, I moved on to the Undead faction. This faction is the primary enemy faction in the fourth region, and during normal gameplay is primarily fought with the fourth playable character: Djehuty. Djehuty's kit involved a variety of unique tools. With a ranged weapon which consumed his own health (but regenerated it with repeated melee hits with the same weapon), a medium range whip (which was much longer range than melee attacks, but not a true ranged attack), and the unique ability to charm an enemy, taking them over completely. This left two notable challenges for the Undead enemies:

  •  The faction needed to support Djehuty's psuedo-range, psuedo-melee playstyle where his best range was between the standard melee and ranged ranges while also still supporting the ranged only and melee only characters.

  •  Between Djehuty, his follower, and his ability to charm 1 enemy at any given time Djehuty will often only be threatened by a single enemy at a time. Meaning all of Djehuty's enemies need to be interesting to fight alone (and have ensemble capabilities that are still effective if they're not directly targeting Djehuty).

 

As with the Sakhmet enemies, I began by sitting down with Djehuty's designer to determine his intended playstyle. While less defined than Cyrene's, we settled on Djehuty having a slower and more measured combat pace focusing on making major decisions (such as who to target and who to charm). With this, I decided on the faction identity:

  • Individually strong enemies. Unlike other factions which have a clear escalation in mechanical complexity from trash mobs to elites, all but the basic Undead have elite-levels of mechanical complexity (and even the basic Undead are stronger than the trash mobs of other factions). This also means that all enemies are worth charming.

  • Mechanics centered around decisions on which enemy to focus (or charm) first. This meant mechanics that incentivize or pushing killing certain enemies, and mechanics that make enemies trickier to target.

 

I began with the Undead Crawler. The Crawler is the trash mob equivalent. It's primarily melee similar to many of the Set enemies but features a larger melee range (due to it's substantially taller height) and a much more aggressive attack pattern. To keep it in Djehuty's preferred range, it likes to perform attacks which involve leaping forward and backward, but doesn't stay out of melee range for long. To give it an interesting complication when it comes to prioritization, killing an Undead Crawler without slicing it's torso in half will cause it to crawl along the ground towards the player. If it reaches the player without being hit again, it roots the player for several seconds (a very dangerous condition in Wrath's combat).

 

Next came the Undead Cursed. The Cursed is less aggressive than the other Undead enemies, but is invulnerable while it still has any allies alive. Additionally, it's uniquely able to melee attack you while another enemy is engaged in melee. Something no other humanoid enemy is able to do. This leaves it as a persistent annoyance the player has to manage (potentially by charming it or siccing a charmed enemy on it).

 

Undead Devourers went the opposite direction. Every time another enemy is killed, the Devourer's gain health (potentially healing above their starting health) and getting bigger. If three enemies are killed, the Devourer enters an enraged state and becomes significantly more dangerous. The purpose of these enemies was to give a clear priority to focus on first. Of course, the player could intentionally enrage them and charm them to quickly clean up the other enemies.

 

The Undead Wraith is the only true ranged combatant of the faction. It has the ability to turn invisible but is very fragile, meaning that when they appear it can often be to the player's benefit to quickly prioritize them before they disappear.

 

Lastly the Undead Forgotten is uniquely a melee flying enemy. It features the ability to teleport, allowing it to effectively force the player to suddenly deal with it (despite nearly never being the highest priority to defeat).

 

Due to the overlapping mechanics, the Undead enemies were very different to fight with different compositions. Additionally, player choices on which enemy to charm could drastically change the flow of any given combat, which was one of the primary goals. The Undead enemies are notably harder to fight than other factions, but given that they only appear near the end of the game this was a desirable outcome.

 

Surtur Faction

 

 

 

 

 

 

 

 

 

 

 

 

 

Footage courtesy of "A Wolf In VR"

 

 

 

 

 

 

 

 

The last faction worked on, as well as the most challenging, was the Surtur faction. This faction is the primary enemy faction in Muspelheim, and during normal gameplay is primarily fought with the third playable character: Alvilda. Alvilda's kit primary revolves around her bow, a pinpoint accurate ranged weapon with several different trick arrows. While Alvilda has access to a shield, melee weapon, and mine the shield and melee weapon were difficult and awkward to use in most circumstances. The mine saw some use, but the kit truly revolved around her bow. This left a single major challenge for these enemies:

  • Alvilda's kit is almost entirely ranged, meaning the enemies need to be interesting to fight with almost no melee combat. However, the enemies still need to be fightable with melee playable characters.

 

As with the other factions, I began by sitting down with Alvilda's designer and discussing the desired playstyle for her. The actual desired playstyle changed several times throughout development, but kept the throughline that the most unique component of Alvilda was taking time to aim with her bow. Right from the get-go with this, it was clear that the Cyrene approach of constant pressure and having the player focus primarily on avoid damage wasn't going to work. After some experimenting, I settled on the following faction identity:

  • Intermittent attacks that force the player to dodge, creating a pattern of "aim -> fire -> reposition -> repeat".

  • Enemies have long windows of being stationary to allow the player time to aim.

  • Enemies have weakpoints, and hitting the weakpoints expedites combat significantly.

  • Enemies are individually weak, relying on numbers more than other factions.

 

The Surtur faction also had an additional wrinkle added. In all regions, there were additionally non-humanoid enemies scattered throughout the world. These served primarily as trash mobs, as we learned early on players struggled with blocking and parrying smaller non-humanoid creatures. These non-humanoid enemies were hostile to both the player, and humanoid enemies. However in Muspelheim this was different. Fictionally all life in Muspelheim was created by the region's big bad, Surtur, to be his army. Early on I proposed that the Muspelheim non-humanoids should be part of the Surtur faction rather than separate from it. This meant the Surtur faction had less humanoid enemies, but had 2 non-humanoid enemies as part of it which added wrinkles. While I made the original design for the non-humanoid enemies, they were iterated on by other designers quite a bit to the point where I can't in good faith claim ownership over their designs. As such, I'll cover only the humanoid enemies in this section.

 

The Surtur Charger, the Surtur faction's trash mob, was the first enemy up and where much of the experimentation happened. Several different iterations were tried before settling on a simple enemy which does two things: Charge then fire a fast moving projectile, and charge then fire an orbital laser beam. With a weakpoint on it's head that gives 3x damage, the player is encouraged to take their time to aim and hit the weakpoint while the Charger is charging one of it's attacks, then dodge immediately after firing to avoid the incoming attack. The orbital laser beam was including primarily for variety and spectacle, but it also serves to block of an area of the combat arena for a time. This isn't super relevant with just the Charger, but it complements a later enemy, the Constructor.

 

The next enemy was the Surtur Constructor. The elite enemy of the Surtur faction, the Constructor needed to be a high threat enemy (being the only high threat enemy of the faction). Now typically when trying to increase threat to a ranged player character, we'd want to increase the pressure on the player by increasing the frequency of attacks. However Alvilda needed significant time allocated to aiming, so that wasn't really a viable approach. I opted instead to make the Constructor transform the battlefield, providing threat by virtue of limiting the player's options. The Constructor only has 3 abilities, but they're all aimed at limiting the safe space the player can stand on the battlefield. The Constructor's first ability was a simple slow moving, but unblockable AOE projectile. As with other Surtur enemies, the goal of this attack was to force the player to immediately reposition. The second ability was to form a barrier between itself and the player. This barrier blocks player ranged attacks, but doesn't block enemy attacks or movement. This effectively forces the player to reposition, and cuts off an option of a space for them to reposition for the immediate future (if they want to attack the Constructor and anything near it at the very least). It's last attack is to create a turret. These turrets spawn over it's head and it can have up to 3. These turrets are constantly firing in sequence if they exist (i.e. 1 turret fires once every 3 seconds, 2 turrets on the 1st and 2nd out of every 3 seconds, 3 turrets every one fires second). These turrets do not aim directly at the player nor do direct damage. Instead they leave a long lasting damaging pool at a fixed distance from the Constructor in the direction of the player. The turrets can be destroyed by dealing any damage to them, but they're weakpoint sized and thus require taking a moment to aim in order to accurately hit them. The effect the Constructor thus has is to completely transform the battlefield, despite being primarily a support unit to other units. On it's own the Constructor is quite weak and easy to kill, when paired with allies though it becomes easily the strongest non-boss unit in the game. The player has to deal with the barrier, keep the turrets under control, and avoid the damaging pools on the ground. All while dealing with other enemies. As with all Surtur enemies, the Constructor has a weakpoint on it (placed on it's chest). As an aside, I consider the Constructor the most successful enemy I created given it's relative simplicity and impact on gameplay.

 

The last, and hardest, enemy built for the Surtur faction was the Surtur Wrecker. Originally designed as another ranged enemy, I was given the directive to design one humanoid Surtur enemy as a primarily melee enemy. This proved to be tricky, as Alvilda has very few tools to fight in melee range effectively. More than any other hero, she struggles against the enemies of other regions, and with the Surtur enemies even a single traditional melee enemy at the wrong time was often enough to raise the difficulty of an encounter too much. After a lot of experimentation, the design I landed on was to make Wreckers spawn as a weak ranged enemy. They're of minimal threat, just firing simple and weak ranged attacks at the player. However once the Wrecker takes any damage, if it survives that damage it heals to full health and enrages, becoming a melee attacker. At this point, it will constantly run down and try and melee attack the player. However with it's unusually low health it's typically easy to dispatch. It's weakpoint is placed on it's chest, partially covered by the shield it's passively holding. This makes the weakpoint more difficult to hit, as it's only fully exposed when the Wrecker is attacking (instead of always) in order to make the weakpoint harder to hit. If the player does hit the weakpoint though, it's entirely possible to one-shot the Wrecker with some skills unlocked. This is intended in order to reward players who are careful with their aim. Effectively, this makes the Wreckers reinforce Alvilda's precision identity. If the player recklessly shells out damage, they'll likely trigger the Wrecker at an unexpected time and have to deal with the extra pressure of a melee enemy bearing down on them. Meanwhile more careful players can avoid triggering the Wrecker's enrage until they're ready for it, eliminating high priority threats or using the mine to create a trap for the Wrecker first.

 

Throughout the whole process I had been checking to ensure that all playable characters could fight all enemies (even if some were more difficult for different characters). Throughout this, I was able to get all characters to feel good against all enemies. All except Alvilda. Alvilda had a significantly harder time against all enemies other than the Surtur faction, and after talking with Alvilda's designer I was told her kit was locked down and unlikely to change. Throughout the process I had been trying to figure out a good way to make Alvilda feel good against other enemies, and during the creation of the Surtur enemies I finally hit on a good solution. I applied weakpoints to all enemies, but only when the player is playing as Alvilda. Any attack on these weakpoints causes a major flinch, giving the player a second or two to breathe, as well as the 3x damage multiplier present on the weakpoints on Surtur enemies. This didn't completely solve the issue, but it brought Alvilda's combat strength within acceptable parameters without impacting the relative strength of any of the other characters.

 

Conclusion

Overall the enemies of Asgard's Wrath 2 were well received by players. While our combat was a bit on the complicated end, players who played past the tutorial raved about our VR combat, calling it the best non-shooter VR combat out there. Enemies played a large part in this, with their complex interactions such as parries and deflecting projectiles, and were highly successful despite effectively being designed for four different games and combat systems simultaneously.

Most of the videos in this section were clipped from the Youtube channel:

A Wolf In VR

 

Commentary, opinions, and views are his and his alone.

I used these clips due to the high quality recordings coupled with gameplay by someone unrelated to the development of Asgard's Wrath 2.

Boss Creation Details - Corpse Eater

One of my first major tasks as a designer on Asgard's Wrath 2 was to implement two bosses, the Sakhmet Bruiser and the Corpse Eater. Of these, the Corpse Eater was the one I was given the most creative control over as well as the one with the most interesting story.

The Corpse Eater was originally going to be fought by Abraxas, the primarily melee playable character of the first region. When I began work on the Corpse Eater it had a finished model and a smattering of animations, but was largely undefined in terms of design. As a giant bird, it's initial design revolved around it initially staying in the air and flying out of reach of the player, leaving the player reliant on parrying projectiles back at it in order to stun it. After stunning it, the player would use their grapple hook to pull it to the ground, then fight it on the ground where it would be dramatically weaker and within melee range. After a time (or health threshold) it would ascend back into the air. Like most of the bosses in Asgard's Wrath 2, it was a fairly simple affair focused more on spectacle than difficulty or unique mechanics.

This was working pretty well at the time. However many months later the story and quests around where the Corpse Eater was located got reorganized. As part of this, Corpse Eater got moved to the second region and became side-content instead of main quest. This had two immediate impacts: Firstly it being in the second region meant that it was most likely the player would fight the Corpse Eater as Cyrene (who had a completely different kit) rather than Abraxas. Secondly, since it was now side content that meant players could ignore it initially, then come back later after finishing them main quest, at which point they would be able to play as any character (the characters are locked during story, but unlocked after finishing the story). Thus the Corpse Eater needed to be redesigned around Cyrene's kit, but also needed to be beatable by every playable character.

Given the Corpse Eater's already "complete" state, not much time was given to change it so I had to figure out how to retrofit the boss with as little work as possible. Re-using attacks and animations where possible became the name of the game here. The first thing I did was change the paradigm of when it was flying versus on the ground. Abraxas needed to ground the Corpse Eater to do appreciable damage, Cyrene didn't as she has powerful ranged attacks. Thus instead of leaving the Corpse Eater flying until the player grounded it, I changed it to swap between flying and being grounded every few attacks. I also reduced the number of attacks the player could stun it during in order to ensure the player couldn't stunlock it for the whole fight. This created a better scenario for Cyrene and matched her playstyle of outputting constant damage while dodging enemy attacks. This was enough to make it fun for Cyrene, but it made it a struggle to fight the enemy for Abraxas and Djehuty. I increased the windows that players had to stun the Corpse Eater and generally lowered it's health. The idea behind this was to reduce the amount of cycles of "stun -> do damage -> avoid damage -> repeat" that melee characters had to do to complete the fight. This made the fight fun for Abraxas and Djehuty at the cost of making the fight very quick (albeit still dangerous) for Cyrene. The last step I did was to implement some new tech to increase the damage the Corpse Eater took while stunned, then increase the total health again. This helped bridge the gap, making the fight be about the same amount of time for melee and ranged characters and thus fun for all.

In the end, the Corpse Eater got moved to yet another point in the story too late for it to be fixed. This was fortunately still in the same region, but players are nearly universally overleveled when they fight the boss. Despite that, the boss is still fun and a good showcase of adapting to a changing situation while reusing as much work as possible.

Boss Showcase - Sakhmet Bruiser

The Sakhmet Bruiser is a early boss fought mid-way through the first region of the game.

 

 

 

 

 

 

 

 

 

 

 

It was also re-used as an optional challenge mini-boss later on in the game.

This fight was notably harder and intended to be a challenge, as Cyrene has less tools to deal with the Bruiser than Abraxas does.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Footage courtesy of "A Wolf In VR"

Elemental Enemy Variants

Near the end of development of Asgard's Wrath 2 (with about 2 months remaining till gold) I was asked to design and implement the elemental enemy variants. The spec was written for these and there was a partial implementation in place, but with 6 variants of 23 enemies that meant that I needed to find a way to implement 138 new enemies in an incredibly fast manner. To add to the difficulty of this the spec and partial implementation hadn't been touched since the beginning of production, and thus were often incompatible with the design direction we ended up with (as an example, Wind variant enemies were originally supposed to block all projectiles from being fired by the player. However we now had ranged characters who had almost no melee attacks at all). To further increase the difficulty of achieving this in time, I had some very specific requests from studio directors on how some elements of this work that prevented me from completely genericizing the functionality. Things like elemental variants having new attacks (which necessitated changes to the AI script for each variant). This is all to say, that I needed a plan on how to make this even possible.

 

The first thing that I did was begin figuring out how to achieve the primary goal of elemental enemies (introduce as much variety as possible into the enemies the player fights for 100+ hours in the game) with the time I had left. I first began by reworking each element to have a passive ability that would be transformative in fights. Some examples of this include the Life enemies, which would periodically heal their allies (and thereby became the highest priority target) and the Death enemies, which would project a zone that did continual damage over time until the player destroyed it with a few ranged attacks (thereby forcing melee characters to use their limited ranged tools for a short time to create an opening). I was unfortunately limited by director mandates here, so not all of them were as transformative as I'd like, but it was enough to add a sizeable amount of variety.

 

I next dealt with a problem I had already anticipated, which was that some passive abilities weren't fun on some enemies. For example, a Life variant Undead Cursed would just be an invulnerable healing beacon. Making fights significantly harder without adding any new interesting dynamics. For cases as egregious as the Cursed, I special-cased the interactions to be unique. However I still needed to deal with the fact that some abilities are just flat out less fun on some enemies. As such, I created an encounter design rule that each enemy would have a primary and a secondary element. All enemies would support all elements, but only the primary and secondary elements would be actually optimized to be fun. Furthermore, only the primary element would get new attacks added to their AI script. I then divvied these elements up into regions, so that players could match their elemental damage to the region and make sure they were properly equipped to do more damage (rather than just randomly having buffs or debuffs to their weapon as they encountered random elements, as the original spec called for).

 

At this point I had the bulk of the core design implemented, and this was within two weeks. I next moved on to the time consuming part, adding new attacks. With the change to only neededing to add new attacks to the primary element, I only needed to add a single attack to 23 AI scripts. A much more achievable number than 138. Adding the new attacks, iteration, and tuning only took another two weeks. Leaving me done with this in plenty of time to change my focus to fixing the bugs in enemies that popped up in the final stretch of development.

 

While not a system I'm a particular fan of in Asgard's Wrath 2. The Elemental Enemy Variants were a good showcase in adjusting a design to be a reasonable scale for the timeframe it needed to be completed within. While having the original 138 fully fleshed out variants would absolutely have been better, it was an entirely unachievable goal within the timeframe given and thus I adjusted it into something achievable.

Enemy Design
Enemy Design: Undead Faction
Enemy Design: Surtur Faction
Enemy Design: Sakhmet Faction
Boss Creation: Corpse Eater
Boss Showcase: Bruiser
Elemental Enemy Variants

© 2026 — Joshua Butner.

bottom of page