Unreal Gold poses an interesting question: "what if enemies in a singleplayer FPS behaved like multiplayer bots?". Instead of large groups of predictable and squishier enemies like in Doom or Duke Nukem, here you get to deal with smaller groups of unpredictable yet tankier foes. They dodge your attacks, move while shooting, lead their shots, and can even use the same weapons that you do. A fight against a single Skaarj Warrior is more dynamic and unpredictable than, say, a Hell Knight from Doom. Yet despite Unreal’s more complex enemy behavior and 10-weapon arsenal with alt. fire modes on everything, it fails to deliver combat with the same level of depth compared to games with more simplistic enemies and weapons such as Doom or Quake 1. Nonetheless, there are still lessons we can learn from this experiment of trying to give FPS enemies “good AI”. Whatever “good AI” means.
Perhaps the most important one is that having complex enemy behavior is not a substitute for good encounter design. Unreal’s levels are on the whole decent when it comes to non-combat elements like exploration and pacing, but the actual combat scenarios themselves tend to be very repetitive. The key reason for that is because for the game keeps throwing encounters with only minor enemies at you (i.e. the enemies that don’t exhibit much complex behavior, like the Tentacles, Slith, Krall, Gasbags, insects and Brutes) while refusing to throw more than one Skaarj (the “good AI” enemies) at you at once up until the last third of the game. This is part of the reason why the ISV-Kran levels being a constant string of 1v1s/1v2s against the Skaarj starts to feel exhausting after a while.
While there’s certainly more ways an encounter with a single Skaarj Warrior can play out compared to, say, a single Hell Knight in Doom, there is still a limit to that. The Skaarj are not *that* unpredictable; their primary behavior still boils down to “get in your face”, “dodge your attacks if possible” and “keep my distance when I’m on low health”. They’re not going to do any high-IQ flanking or strategic camping. Nor should they, as making individual enemies more unpredictable tends to involve making them more RNG-dependent or making it impossible to keep up with them (such as by having enemies move obscenely fast or giving them too many behaviors to keep track of)--making them frustratingly inconsistent to deal with no matter how good you get at the game. Instead, this inherent predictability of the Skaarj should have been compensated for by making you regularly fight groups of Skaarj or Skaarj paired with minor enemies, thus increasing uncertainty without resorting *too* hard to the inherent inconsistency of RNG. A little RNG is necessary to create uncertainty at higher levels of play when you have every facet of the game already down to a T, but too much RNG makes the game incredibly inconsistent to play on low/mid-levels of play, and reduces the relative depth of the game on all levels of play in favor of a few consistent and safe strategies that largely mitigate RNG, as we will see later.
Now, while the last third of the game does regularly throw groups of Skaarj at you, the spaces in which these fights take place fail to make good use of the Skaarj. It’s either because Unreal reuses the same “some Skaarj in a tight corridor” or “a group of Skaarj in a wide flat open field” setup for the umpteenth time, or it’s because of our old friend,
The Door Problem. A lot of fights are going to turn into the same “backpedal behind a doorway and bottleneck a group of enemies to more safely pick them off” if the space allows for it, which becomes an especially enticing option if the enemies have explosive weapons. In these situations the complex behavior of the Skaarj ceases to be relevant: in tight spaces they (and you) do not have any space to dodge and it becomes more of a battle of who can out-damage the other first, in large open spaces there’s so much space to let you safely keep your distance from enemies and pick them off with your hitscan weapons that they don’t have an answer against, and neither do the Skaarj have a good answer against you camping a doorway. Once again we can see that “good AI” is not a silver bullet that will magically improve your game--levels must provide enemies with the opportunities to let their unique behaviors shine.
Such an ideal combat space with the Skaarj involves a relatively constricted area that prevents hitscan weapons from becoming too dominant, it involves plenty of cover to give both player and enemy room to outmaneuver each other and avoid explosive splash damage, and most importantly, these spaces should essentially lock you in so as to prevent you from backpedaling away from any threat. That’s right, I am talking about the **a-word**.
There are a handful of such **arenas** in Unreal which, while badly executed, show a glimpse of potential of what could have been. The first arena in Demon Crater highlights this neatly where you have a space with tons of cover and varying height levels for you and the Skaarj to juke it out. While held back by being able to run past everything into the corridor leading to the basement, it is still conceptually interesting because (ignoring the basement) there is no perfect position in this arena. As you and the Skaarj move about, some positions become more (dis)advantageous and susceptible to explosive splash damage or providing one no space to dodge projectiles. So the northern rim of the arena is raised and allows you to get a good vantage point on the center, but at the same time that rim is narrow and has your back close to the wall, which means that while you can easily dodge incoming projectiles, you can’t easily dodge the splash damage from incoming rockets. The warehouse areas in Dasa Mountain Pass and ISV-Kran Deck 4 also feature similar constricted cover-dense arenas against multiple Skaarj where macro-level positioning matters more, but the former is hamstrung by having too much free space for backtracking, and the latter doesn’t have enough enemies to apply proper pressure on you from multiple directions.
Now contrast all this with the final arena of Demon Crater, which is this big flat donut space with some cover here and there and Skaarj Officers sparsely placed around. Because there is so much free space, you don’t need to be worried about splash damage or being boxed in, and the element of map control is non-existent in favor of circlestrafing being the definite solution for avoiding damage. Were the enemies in Unreal designed in a way where they could prevent you from circlestrafing from long-range or in an open flat space, then this might have worked, but as it stands the enemy roster is best suited for close-quarters arena combat, while the arena design itself is incredibly lacklustre.
Having enemies dodge your attacks like a human opponent in a multiplayer match does make them come off as more intelligent, but in terms of gameplay, it also comes off as *bullshit*. Namely, the way enemies in Unreal dodge your shots is by RNG. The exact moment that you press the fire button, nearby enemies check if shots from your weapon is something they’re allowed to dodge, and then they roll a dice to see if they can do an instant dodgeroll away. In practice, this means that there’s a N% chance (all dodge chances listed here onwards are not accurate and just my best guess) that one shot is basically a waste of ammo. For rapid-fire weapons such as the Stinger or Minigun this isn’t a big deal, but considering most of your workhorse weapons are projectile-based with a low rate of fire, the RNG dodging makes the effectiveness of certain weapons inconsistent, or just makes them plain not worth using at all. For the Eightball this means that your primary fire will get instantly dodged half the time and is usually only any good for its splash damage when charged, whereas for the Flak Cannon primary fire it’s just plain wasted ammo 40% of the time. And when you consider that the time-to-kill on Skaarj is already fairly high (it takes like 3-4 rockets or two Flak shells to kill the lowest ranks), it makes this annoying inconsistency even more pronounced.
Instead of bothering with this game of roulette, what you’ll more likely do is use weapons that enemies aren’t hardcoded to dodge to begin with. So the Eightball alt. fire, on its own useless due to its low projectile speed, now becomes surprisingly useful for one-shotting Skaarj Warriors (after charging 3+ grenades) because they are hardcoded to never dodge grenades. The Flak Cannon alt. fire becomes one of your best options since it kills most Skaarj in 2-3 quick shots from mid-range that will never get dodged, and without needing to be charged like the Eightball alt. fire either. The Razorjack can also decapitate most Skaarj in 2 shots and almost never gets dodged. And instead of bothering with projectile-based weapons, you can simply use your hitscan weapons such as the Pistol, ASMD primary, and the Rifle. The Minigun, despite being hitscan like the Pistol and Rifle, *will* get dodged, but since it’s hitscan you can easily correct your aim when an enemy dodges. Dodgerolls are just a very ineffective method of dodging hitscan attacks because of how the recovery after a roll leaves enemies stationary--having enemies dodge hitscan through erratic strafing would have been more effective. Given how all weapons have their own ammo pools (except for the Pistol/Minigun) and how each ammo type is equally scarce (Flak Cannon ammo is a bit rarer, and bullets are more common), you will always have enough ammo to use a weapon that renders enemy dodging behaviour redundant, which begs the question what the point of using RNG for triggering enemy dodging is.
Before we continue, it’s worth considering whether dodgerolling is the only means an enemy could theoretically react to your shots being fired (not to be confused with enemy reactions *after getting hit*). I mainly talked about dodging here because that’s what most Skaarj in Unreal do, but that’s not the only possible enemy reaction to your shots in Unreal. Skaarj Officers can react to your shots by putting up a shield instead of dodging out of the way, which I’ll touch upon later. To avoid making it come off like dodgerolling is the only possible on-fire reaction an FPS enemy can have, I’ll henceforth refer to enemy dodging/blocking/etc. as simply “reacting” unless I’m specifically talking about dodging or blocking.
Another thing to consider is what the point of having enemies react to your attacks in any action game like this actually is. The immersion-level goal of enemy reactions seems to be to create the illusion of unpredictable opponents that fight like actual human opponents would. I suppose the intended gameplay-level goal of enemy reactions then is to keep combat fresh and exciting, which, more specifically, is achieved by making certain weapons more situational to use. Because enemy reactions usually involve nullifying/countering your attacks somehow, then naturally your weapons won’t be as effective depending on their nature and that of the enemy’s reaction. So projectile-based weapons are more likely to get reacted to from medium range, while hitscan weapons work at most ranges. In this regard, enemy reactions serve a similar purpose to damage resistances/weaknesses and locational weak points (think headshots or weak points on the back). The difference is that while resistance/weaknesses apply on hit and locational weak points apply depending on the angle you’re facing an enemy (you can’t really shoot their head if you’re right below them), having enemies react to your shots depends more on your relative distance, position, and their state. This gives designers another tool to balance out weapons when other tools wouldn’t be as adequate.
For example: the Shock Rifle alt. fire fires a ball which can be detonated with the primary fire to create a shockwave for massive damage. This Shock Combo is incredibly strong, which is why it’s balanced out with enemies having a ~90% dodge chance against it. This doesn’t make it useless--what you have to do is create a situation where the enemy cannot dodgeroll away from the ball. So if they’re next to a wall, then shooting an orb to their other side means that no matter where they dodge towards, they’re always going to be within range of the Shock Combo. This way a Shock Combo can be strong in certain situations instead of almost *every* situation. Giving enemies a damage resistance against the Shock Combo (so it can gib some enemies in a group, but not all) to prevent it from becoming a dominant strategy would work if enemy groups were more diverse, but considering most enemy encounters in Unreal are fairly homogeneous, this wouldn’t really work. Having enemies only be vulnerable to Shock Combos from a certain angle (such as from behind an enemy) is most certainly a valid way of balancing it, but because not every humanoid enemy in Unreal has a means to block frontal damage, the Shock Combo’s usefulness is better mitigated through dodging, which every humanoid enemy is already capable of. Technically you could give every humanoid enemy a means to block frontal damage and it would work just as fine, but I suppose that having enemies mitigate your shots through movement makes them appear more intelligent than the alternative.
Taking all this into account, it would have been preferable if enemy reactions were made semi-random at the very least. So the conditions for a reaction to happen are deterministic, whereas how the reaction executed is partly random. A dodge could be triggered deterministically, but the exact direction of the dodge is influenced by chance. This way the designer has tighter control over weapon balance, while there’s still a degree of uncertainty that prevents the game from becoming too predictable. So the player could also devise more strategies using more weapons instead of relying on chance or a smaller handful of weapons that avoid chance completely. Taking projectile-based weapons for example, having enemies only be able to react to your projectiles after they travel a certain distance would mean that you could consistently use those weapons up close, but whether you would *want* to depends on if said weapon can inflict self-blast damage, or if the enemy is very dangerous to stay close to. Alternatively you could create a situation using a combination of weapons so the enemy cannot dodge projectiles even at long-range (such as having other weapons bait a dodge or cripple enemy movement).
Unfortunately, the weapon switch speed in Unreal is too slow to allow for any weapon combinations that aren’t two fire modes on the same weapon. If you wanted to use the ASMD alt’s ~90% dodge chance to bait Skaarj into dodging to land a guaranteed Flak Cannon shot, or if you managed to launch a Skaarj into the air by shooting a rocket at its feet and want to finish it off with the Flak Cannon mid-air, then by the time you are done switching to the Flak Cannon, the Skaarj will already have recovered and is ready to dodge anything. On top of the slow weapon switch speed you also have long refire times (the delay between shots) on several weapons in Unreal. So if you’re trying to switch weapons right after firing your current weapon--a use case that comes up fairly often--you’re forced to wait for the firing animation of your current weapon to finish before the weapons actually start to switch. With high-RoF weapons such as the Pistol and Stinger this isn’t as noticeable, but with workhorse weapons such as the Eightball, ASMD and Flak Cannon, it certainly is.
The slow weapon switch speed is a problem for Unreal in particular, but first it’s worth explaining what kind of a weapon switch speed fits a given FPS, and why not every FPS needs instant weapon switching. Basically, it’s about whether a game emphasizes split-second decision making (ULTRAKILL, Doom Eternal), or thinking ahead into the future (Final Doom, Serious Sam). In the former a small mistake is highly damaging, but you have more means to mitigate and recover from such mistakes. In the latter it’s the exact opposite; mistakes aren’t as damaging, but they’re harder to recover from in the long-term as they slowly build up to a point where recovery is impossible. This is also reflected in the enemy design of these games: in the former they tend to be agile and harder to predict, whereas in the latter they tend to be slow and predictable. After all, predictable enemies are less likely to push you into making constant split-second decisions when you can see what they’re about to do from a mile away, whereas unpredictable enemies are more likely to do the opposite. Thus, the weapon switch speed (and whether you can cancel the firing animation of a weapon by switching weapons) serves to reinforce the player into either thinking ahead or thinking fast. With a slow weapon switch speed, the player needs to always keep in mind that switching to another weapon leaves them temporarily vulnerable because of the weapon switch delay, and that switching to the wrong weapon can potentially screw them over. With a fast weapon switch speed, it’s simply a matter of whether the player can react fast enough to switch to a more suitable weapon as the situation constantly changes.
Taking this into consideration, one can see why the weapon switch speed in Unreal is a bad fit: the enemies are designed to be agile and unpredictable, but you cannot switch weapons fast enough to keep up with them as the situation changes--which it does constantly. This is not to say that you won’t ever switch weapons during combat--ammo for your current weapon isn’t infinite after all, but the slow switch speed biases your selection away from more situational weapons towards all-rounder weapons that work in most situations, which especially stings in a 10-weapon arsenal as some weapons end up feeling underutilized. Really, the only reason that the weapon switch speed isn’t a more noticeable issue is because of how limited in scope most Skaarj encounters are. Had the encounter design been more daring and engaging w/r/t enemy composition and the amount of enemies, you’d have many more reasons to keep switching weapons--where the slow weapon switch speed would have most certainly been felt.
It’s not only the weapon switch speed that makes it hard to keep up with the Skaarj, but the movement as well. Skaarj are overall faster than you, and when they’re within melee range of you it’s very hard to shake them off. Your best chance of pushing them away is by forcing them to dodge away using a high-dodge chance weapon, which, again, would have been a more viable option had the weapon switch speed not been so low. Otherwise you just have to hope that the Skaarj don’t try to chase you, or that you can cheese them out using level geometry. Jumping as an evasive maneuver also doesn’t really work because of the lack of air control and the pitiful height it covers (which also puts a damper on how vertical combat spaces are allowed to be; there’s no point in verticality if you do not have the mobility options to reliably move vertically). Lastly you have a dodge move as well (basically a short dash), which is pretty much useless because it covers only an incredibly short distance. Dodging is also done with a double-tap input that you’re more likely to do on accident than on purpose, especially in a game like this where you’re constantly changing strafing directions. While there’s unfortunately no one-tap dodge option, you can disable dodging altogether to prevent such misinputs.
Unreal’s direction w/r/t escalation of encounter design isn’t feasible for the long term. Its encounters had to be limited in scope, otherwise the player would be overwhelmed because of the player character’s limited ability to keep up with the Skaarj (like a Souls player character being pitted against Bayonetta enemies). Yet this limited encounter scope also means that the encounters become too repetitive across Unreal’s 8-10hr runtime. Here there are two options for expanding the encounter scope without over/underwhelming the player: either the player character can be given more means to keep up with the Skaarj (greater mobility, faster weapon switching, etc.), or the Skaarj themselves can become scaled down in terms of HP/aggression/reactivity/mobility so that they can appear in greater numbers without proving too much for the vanilla player character’s abilities. Although either option could work, I’d still lean towards the former considering it preserves Unreal’s unique edge compared to other FPS games on the market, what with its deathmatch bot-like enemies.
To sum things up, having enemies behave like deathmatch bots does make for good marketing and an interesting surface-level experience, but it doesn’t necessarily make for engaging gameplay. Enemies, be they complex or simple in behavior, need to be designed around the player’s abilities, and the encounter design should use these enemies in varied and engaging ways. Complex behavior isn’t a substitute for level design, because no matter how complex that behavior is, there will always be a finite range of actions an enemy can potentially perform. While Unreal most certainly stands out with its complex enemy behaviors, they end up feeling inevitably repetitive when the same enemy set-ups keep getting repeated throughout the game.
There are a bunch of other of Unreal’s failings I haven’t talked about yet (the redundancies and imbalances in its weapon arsenal and the design/usage of the minor enemies), but quite frankly I find that is more going into specific implementation details that aren’t as interesting in the grander scope of things. There is also a lot of praise to be written about Unreal’s immersive worldbuilding and implicit storytelling, and the way it does so by respecting the player’s time and intelligence (especially without locking them in a room waiting for NPCs to finish talking), but this is a part of Unreal that has been already extensively
covered by others.