Damage Scaling (also known as Proration or Damage Dampening) is a mechanic that is seen in many fighting games, which limits the amount of damage a combo can do.
Damage Scaling refers to the fact that, as combos become longer and longer, the damage dealt by each hit will decrease. This prevents combos from becoming too overpowered. Many games have different implementations of damage scaling, but the most common methods include the following:
Damage Scaling by Number of Hits
The most common form of damage dampening, and the easiest to implement in M.U.G.E.N. As the combo's hit counter increases, the damage for each successive hit will be decreased by a cumulative fixed percent until it reaches a pre-determined minimum value, which determines the absolute minimum damage a hit can do. This method usually results in moves with multiple hits doing less and less damage with each hit, even during the same attack.
Examples: Capcom Fighting Jam, Marvel vs Capcom 2
Damage Scaling by Number of Attacks
Similar to Damage Scaling by Number of Hits, except that damage is decreased by a fixed percent for every attack used in the combo, rather than every individual hit. This forces the damage of each hit of a multi-hitting move to be scaled by the same percent, as opposed to additional scaling being applied to the damage of each individual hit.
Examples: Street Fighter 4
Damage Scaling by Individual Moves
This form of damage scaling uses an internal counter that is initially set to 100% whenever a combo is not being performed. This counter is multiplied by the damage of each hit of a move in a combo. Each individual move has a unique percent value that is multiplied by the value of the counter on every hit, and sets the counter to this new value, which is then applied to the next hit in the combo.
Examples: Guilty Gear, Blazblue, Melty Blood, Touhou Project
Damage Scaling by Type of Move
Similar to Damage Scaling by Individual Moves, except that the percent values are determined by specific move categories (ie: Light Normals, Medium Normals, Heavy Normals, Specials, Supers, etc) rather than by each individual move.
Examples: Marvel vs Capcom 3, Street Fighter 3: Third Strike
Damage Scaling by Total Damage Inflicted
This form of damage dampening is unique. Rather than scaling damage based on number of hits or number of attacks, damage is scaled based on how much total damage is done by the combo so far. As the amount of damage done by a combo increases, the amount of damage done by each individual hit begins to decrease.
Examples: The Last Blade
Basic Damage Scaling tutorial
In order to add damage scaling to a character, most methods utilize code placed in the Negative States in conjunction with variables. Though there are various methods to implement damage scaling, the following provides a quick tutorial on how to implement such a feature. For the purpose of this tutorial we will be using fvar(10) as our variable, but you can change this to any unused floating point variable depending on your character's needs.
In the character's negative state (preferably -3), apply an AttackMulSet controller, using the variable you chose earlier. This will cause the character's attack value to scale up and down as the damage scaling variable changes.
[State -3, Attack Scale] type = AttackMulSet trigger1 = 1 value = fvar(10) ignorehitpause = 1
However, this will only affect the character's attack values, and not any Helpers or helper-based projectiles created by the character. To rectify this, in each helper state that contains a Hitdef, the following AttackMulSet controller must also be added:
[State 1010, Helper Attack Scale] type = AttackMulSet trigger1 = 1 value = root,fvar(10) ignorehitpause = 1
In the character's negative states above the AttackMulSet controller we added earlier, we must now add a way of changing the damage scaling variable to suit our needs. For this tutorial, we'll be using a system that scales damage based on the number of hits. As such, add a varset controller that affects the value of your variable as follows:
[State -3, Variable Scale] type = varset trigger1 = numenemy fvar(10) = fvar(10)*(0.9**(enemynear(0),gethitvar(hitcount))) ignorehitpause = 1
The above will scale the damage done by each hit by 90% for each hit. The first hit will deal 100% damage, which each hit after dealing 90%, 81%, 72.9%, 65.61%, 59.05%, and so on. You can play around with these values if you feel that the scaling is too restrictive or too lenient.
Lastly, we must make sure that the damage scaling resets to 100% when the opponent is no longer being comboed. To do so, reset the variable as follows:
[State -3, Reset var when the opponent recovers] type = Varset trigger1 = numenemy trigger1 = (enemynear,movetype!=H) trigger2 = !numenemy fvar(10) = 1 ignorehitpause = 1