Designing Combat in Dante's Inferno

As lead combat designer on Dante’s Inferno, it’s my job to work with a bunch of other departments to try and craft the overall combat experience. This includes building out Dante’s attacks and abilities, while at the same time trying to craft fun and challenging enemies and bosses to take on throughout the Inferno. So I figured for a first blog post about combat, it would be good to explain (sort of) how that work gets done on a day to day basis.

Thanks to our team of awesome gameplay engineers, the combat designers and animators on Dante’s Inferno are able to create new attack moves pretty quickly from scratch. This means if someone has an idea for an attack that Dante should have, or we want to try out an idea we’re not sure of, it’s really quick and relatively cheap to experiment. This is amazingly helpful as it allows us to quickly weed out ideas that simply won’t work, without investing days or even weeks into something we’ll have to literally throw out later.

To get a sense of how that process works, here’s the rough process we might use for building a standard attack for Dante.

Creating a New Attack

We start by creating a “move” in a script file which is essentially just an animation for the character to play. The “move” itself might look something like this:

CreateMove( MoveName = Dante.LightAttack01, AnimationName = scythe_attack_animation_01
((
--stuff this move should do gets added here.
))

Next, we hook it up to a button by creating what we call a “Branch.” A branch is basically an event that responds to something the player does. or something happening in the game. In the example below, this “Branch” is selected when the player pushes the “X” button.

CreateBranch( BranchFrom = Dante.Idle, BranchTo = Dante.LightAttack01
((
Event=X_Button
))

So now in game, when I push the X button this is what I get:

 

 

Making the Attack Work

The next thing to do is make the move attack enemies, collide with breakables, etc. The way we handle that in Dante’s Inferno is to attach what we call “Shapes” to our weapons.  It’s the combat designer’s job to turn them on and off depending on the speed of the move, specify how large they should be based on the weapon, etc. Once we create this shape and attach it to the move, we can visualize it in game to test it out:

 

 

Attack Presentation

Now that the move works, we need to add all of the stuff that will make it feel satisfying to use. We call it presentation, but these are really the key elements that will make combat fun or not. There are a ton of these elements, but the three I find most important are:

1)    Visual Effects

A good weapon trail will make the animation read better, demonstrates where your weapon is swinging from a functional standpoint, and all around just makes the attack “feel” more powerful.

Death’s Scythe

We choose the color scheme of black and gold for Death’s Scythe for a couple of reasons, but mainly because we felt black was the best representation of Death and gold matched the primary color of the weapon. Together they give the weapon a distinct look that both fits thematically and reads well visually in a large variety of environments.

2)    Hit Pause

This is a cool technique that has been around since the Street Fighter days, and is pretty common among 3rd person action games and 2d fighters. Basically, we freeze Dante and his victim for a near instant on the moment of collision in order to exaggerate the impact. It may sound subtle, but perhaps no feature adds to the general “feel” of combat like hit pause does.

3)    Enemy Reactions

Without strong enemy responses to Dante’s attacks, every attack would really start to feel the same. The animation team in Dante’s Inferno has gone to great lengths to provide dozens of unique enemy reactions based on Dante’s different attacks. And of course, last but not least, blood is always important. Don’t ever forget blood!

Here’s what the same attack looks like with all the bells and whistles added –

 

 

  • Rate:
    • 1
    • 2
    • 3
    • 4
    • 5