Deep dive into the SFV GUTS

Everything started from a tweet from Javits about “which CA kills better”, legitimate question due to GUTS scaling. I assumed it was an easy one at first, but it took me quite a while. So, I thought I should describe it thoroughly because it shows how I work out these questions and you should learn one or two interesting things.

Maybe you’re already lost with the terms I’m using so let’s back it up.

The question: is it gonna kill?

In some fighting games (e.g. Guilty Gears, Street Fighters), when you hit a low-life opponent, you will deal less damage. It makes the opponent harder to kill, this is usually called the GUTS scaling.

Other factors may contribute to scaling your damage: combo count, crumples, mode activation… but I will not go down that road here.

In SFV, the most powerful moves are the Critical Arts, they can deal up to 44% of damage alone. But when you are close to the kill, as noted earlier they won’t deal their full potential. The real question is: how much?

Each CA is generally composed of multiple hits, here are some examples:

  • Balrog (Boxer) deals one massive 330 points blow
  • Juri deals 4 times 60 points then a final hit at 90 points
  • Chun-Li deals first two kicks at 30 and 20 points, then 34 lightning leg hits of 5 points and finally a 110 points strike.

If you count everything, all those critical arts deals 330 points, but the way they are dealt is vastly different. Unfortunately, the Guts scaling is applied on each hit (contrary to what I thought initially), so if you strike plenty of little hits, each of them will deal less and less damage. Conversely, if you just strike once, Guts is applied once with hopefuly a nicer Guts scaling.

The problem we are trying to solve then is the following: what are the health limit for each CA? Consequently: what are the best CAs under low-life conditions?

Know your damage.

First, we need some data. I need to establish the list of all Critical Arts and the detail of each hit. As far as I know, this list doesn’t exist as of today. Even the madmen behind FAT didn’t list this.

We could go inside the game and collect the data. Yeah, we could. But you’re not on anyone’s blog here, if something can be automated, it will be! I used the game data files to trace all the hitboxes used on each move that is classified as Critical Arts. As you may know, I know those files really well.

Excerpt of the script output of the hitbox damage tracing for each CA

Friendly advice: don’t do this! A SFV move respects a script that is full of conditions and branches that may or may not be executed in-game (proximity conditions, hit conditions etc…). For instance, during the Chun-Li, if only the first hit whiffs, it will use a completely different hit pattern. So let’s narrow down the list: I will only look at full damage CA. If there are legitimate variations (e.g. with V-Trigger activated) I will obviously take them as well.

With some fiddling with my extraction script and some cross-checking with FAT, I’m able to provide the list of all CAs and all the hits.

Hit in the Guts.

Secondly, we need to know exactly how Guts scaling works. Fortunately, I did this research a while ago when looking at the damage scaling system for sfvsim. Here are the rules:

  • If life ≤ 15%, apply 75% scaling
  • If life ≤ 30%, apply 90% scaling
  • If life ≤ 50%, apply 95% scaling
  • Otherwise apply 100% scaling

Notice one thing: those rules are based on a percentage of the maximum hit-points that the opponent can have. For instance, Cammy has 900 maximum HP, if she has 150 HP left the scaling will be 90% while Ryu with his 1000 maximum HP, will be at 75% scaling for the same life left.

Side note: decimal values on the life bar

We are talking about 90% scaling of hits but sometimes those can be 5 points only as we have seen. Did you know that all the resources in SFV are actually decimal? They are built on top of a fixed point system which makes the computation of the damage reliable and stable. So when a scaling is applied no rounding is performed and we (almost) don’t lose some precious precision.

Note for curious computer scientists: it is based on two 16 bits integer, the first one is the integer value, then the second one represents the unsigned fractional part. As an example: (3, 6553) represents ~3.1 because 6553 is ~0.1 * 65536.

But what about F.A.N.G.?

I didn’t talk about it but he is a pain in the *rse, isn’t he? The peculiar aspect about FANG is that he poisons his adversaries. But, as we know, poison is not lethal, therefore the total amount of poison cannot be taken as a reference. That is why we have to decompose when the poison is applied first, for how long, and what is the damage after the last hit. Here’s how FANG CA works:

  • It launches the opponent in the air for 40 points. Poison is not active yet.
  • Then it hits with a ball of poison 6 times for 42 points. Poison is active right after the first ball.
  • Poison hits 0.1 point per frame for a total of 10 seconds
  • Each ball hit duration is 19 frames total
  • Guts scaling is not applied on the poison damage

Using those values, we can compute that the lethal damage of the poison is actually 292 + 19*5*0.1 = 301.5. Obviously, this will need extra care.

Now what?

Well, we live in the 21st century, we have access to machines capable of doing literally billions of operations each second, so let’s program! Assuming that I am able to replicate the exact damage computation of SFV, then I can try all values of the opponent life bar and see what happens for each CA. If you don’t know how to program but you have some spreadsheets skills, you can do it yourself.

Let’s plot the damage of the 3 CAs we have seen earlier: Boxer, Juri and Chun-Li. The vertical axis represents the damage and the horizontal axis represents the opponent health. I added a red line representing the kill zone, if the damage line goes behind this limit, the opponent is dead.

CA Damage vs Opponent Health for Chun-Li, Boxer and Juri.

As you can see Boxer’s damage (1 hit) respects the scaling steps strictly, while Chun-Li’s damage (37 hits) will have a more gradual decent. Juri will be affected as well but in a more discrete manner.

Wait what?

If you paid attention, you should have seen something weird in the Boxer plot near 300 HP opponent health. Javits showed that it works in-game. If you do a Boxer CA against a 301~313 HP opponent, they will die, but if they have 297~300 HP they will live! Obviously this is due to the fact that below 300 HP, the CA will do only 0.90*330 = 297HP. This is mind-blowing and completely counter-intuitive.

I’m going to stress something here: when I stated the rules, nothing felt wrong, it’s when we look at some edge cases that we can see some absurd situations. We can already conclude two astute observations:

  1. Game design is frickin’ hard
  2. This will never be patched

How do you mitigate these kind of issues? This is mainly due to the discrete nature of the scaling. You could have a linear scaling system but predicting the damage of simple moves will be harder. You could have more steps (like Guilty Gear) but there are no guarantee that it won’t happen again. Or you could remove Guts scaling but that’s another debate. Finally, if you change anything here, you will need to rebalance everything because the Guts scaling has major impacts as we have seen.

But really… “is it gonna kill?”

Now we’ve got the methodology to find the kill values for each CA. Let’s plot everything in one handy chart then. For reference, I added the full damage of each CA in the chart.

Maximum health values to guarantee a kill with a raw CA for a 1000 HP opponent

Beware that on those graphs, I zoomed on the most important parts that’s why the minimal health value displayed is 200, don’t be deceived by this false perception of a 50% scaling ratio, look at the numbers.

You will notice that there are actually a lot of green areas (alive zones) and that the Boxer alive zone is not the widest, by far.

What about non-1000HP opponents?

Oh boy, that’s another story. Due to the discrete nature of the phenomenon, it will be very hard to predict the outcome. For the sake of simplicity, I will elude a lot of measures that I did, but you can see the previous chart for all possible max HP values with all the necessary details in the spreadsheet I made.

However, we do want to have a general trends of what are the consequences. So let’s try to understand what is the general impact of a lower max HP.

  • The Guts scaling happens at lower HP values (e.g 50% * 900HP = 450HP)
  • Therefore, the Guts scaling will happen “later” in a chain of damage
  • Therefore, the kill zone will generally start sooner

This is heavily counter-intuitive at first even thought the reasoning is simple enough. For instance, against Cammy (900HP), Kolin will be able to kill her starting 287HP (~32% life). If it was against Ryu (1000HP), the kill would have been guaranteed at 269HP (~27% life). This is a double punishement: as a low-life character you have less life to tank your opponent and moreover they hit harder due to your condition. Conversely, a higher max HP will generally imply a lower kill zone.

Do note that this is only a trend, some damages are not affected by max HP while others change significantly. Let’s illustrate this more concretely with Kolin’s CA. Its damage is (50, 100, 100, 80), and let’s look at a 280HP Cammy.

  • 280HP / Scaling 95 % / apply 47.5 damage
  • 232.5HP / Scaling 90% / apply 90 damage
  • 142.5HP / Scaling 90% / apply 90 damage
  • 52.5HP / Scaling 75% / apply 60 damage

We can see that all the usual scaling steps (300HP, 150HP) are avoided due to the max HP change. That is why the difference with a standard opponent like Ryu is so important. However, having higher max HP will not change anything to this situation. We can confirm this by tracing the plot of the damage against the opponent health.

CA Damage with Kolin vs Opponent Health, visualisation of different Max HP values

What are the best CAs for killing?

As you have seen the answer is more complex. However, it would be a shame to not dress a general top. Here are the best CAs for killing with their kill zones (noted KZ).

  • Birdie CA under VT (KZ 370–373): Few hits, massive damage.
  • Zangief CA (KZ 362–379): Same as Birdie CA but ranges a bit higher for 900-925HP players.
  • The rest of the 400 damage club (KZ ~330–340): Dhalsim Level 3, Kage Demon, Akuma Demon, Abigail VT1. A lot of hits but massive damage.
  • Necalli CA under VT (KZ 316–321): has only few actual hits compared to his normal CA
  • R.Mika CA (KZ 296–327): although she suffers from the large “alive” zone, she has only three hits including a massive last one (180 damage). NB: against Abigail she will have a way harder time because of a -31 difference compared to a standard 1000HP opponent.
  • Laura CA (especially under VT KZ 301–316): She deals a big first hit which compensate for the 6 hits she strikes.
  • Boxer CA (KZ 296–313): One massive hit compensate for his average damage.
  • The efficient 340 club (KZ 305–310): Alex CA, Birdie CA, Dictator CA, Karin CA. Their aim is to hit you a bit and then smash you with a 200+ hit in the end.
  • Akuma CA (KZ 287–303): Same as Boxer but with 10 HP less.

Interestingly, most of those CAs come from the first season (aside Akuma). I don’t know if it’s a coincidence.

I also wanted to point out two outsiders: Kage CA and Falke CA, who have a small kill zone that is above 300 HP for characters with max HP < 1000.

The end.

That was a long one. Sorry about that and thank you for reading.

I detailled everything because I wanted to show that even the most common question like “Is it going to kill?” is VERY hard to answer if you look at it in depth. All I ever wanted was to help our beloved commentators. It turns out, it’s actually hard to predict.

If you do have any questions, ping me on twitter.

Erratum: the first version was missing Abigail CA VT and Birdie CA VT which are resp. 398 and 408 damages so obviously they are in the top scores. It missed because the damage boosts (resp. 6/5 and 8/7) are not yet understood in the game files.