FF7/DamageFormula
Damage Formula's description
0x11:
Prepare Function 0x0 (calculate physical hit chance)
Prepare Function 0x2 (calculate critical chance)
Damage Function 0x1
0xA0:
Prepare Function 0x0 (calculate physical hit chance)
Prepare Function 0x2 (calculate critical chance)
Damage Function 0x1
damage = damage * (1 + number_of_status1 + 2 * number_of_status2).
number_of_status1 are calculated as sum of attacker statuses darkness, slow, silence, sadness, poison, near death.
number_of_status2 are calculated as sum of attacker statuses death sentence, slow-numb.
0xA1:
Prepare Function 0x0 (calculate physical hit chance)
Prepare Function 0x2 (calculate critical chance)
Damage Function 0x1
if current hp less then max hp / 4 then damage = damage * 2.
if attacker in death sentence then damage = damage * 4.
0xA2:
Prepare Function 0x0 (calculate physical hit chance)
Prepare Function 0x2 (calculate critical chance)
Damage Function 0x1
damage = damage * (1 + number_of_dead_player_units).
0xA3:
Prepare Function 0x0 (calculate physical hit chance)
Prepare Function 0x2 (calculate critical chance)
power_modifier = total_level_of_all_enemy_target / number_of_enemy_target.
(this only use enemy units from 4 to 10 that includes in target mask after all preparation)
Damage Function 0x1
0xA4:
Prepare Function 0x0 (calculate physical hit chance)
Prepare Function 0x2 (calculate critical chance)
power_modifier = 1 + (((current_hp * 3) / max_hp) * power_modifier).
Damage Function 0x1
0xA5:
Prepare Function 0x0 (calculate physical hit chance)
Prepare Function 0x2 (calculate critical chance)
power_modifier = 1 + (((current_mp * 3) / max_mp) * power_modifier).
Damage Function 0x1
0xA6:
Prepare Function 0x0 (calculate physical hit chance)
Prepare Function 0x2 (calculate critical chance)
power_modifier = 1 + (((total_ap / 10000) * power_modifier) / 16).
(total_ap is no more than ap needed for max star, so underwater materia won't work)
Damage Function 0x1
0xA7:
Prepare Function 0x0 (calculate physical hit chance)
Prepare Function 0x2 (calculate critical chance)
power_modifier = 10 + (((number_of_kills / 128) * power_modifier) / 16).
Damage Function 0x1
0xA8:
Prepare Function 0x0 (calculate physical hit chance)
Prepare Function 0x2 (calculate critical chance)
power_modifier = 1 + (((limit_bar_value * (limit_level + 1) / 16) * power_modifier) / 16).
Damage Function 0x1
Damage Calculations
For standard damage functions
X0:
- Sets Target's 02h flag to 1. (Unknown effect)
X1:
- If Attack Property "Always Critical" is Set
- Set Critical Damage Flag
- End If
- x = ( Actor's Level * Actor's (M)Attack ) / 32
- y = ( Actor's Level + Actor's (M)Attack ) / 32
- z = Actor's (M)Attack + ( x * y )
- z = z * ( 512 - target's defense ) * Attack's Power
- Damage = z / 4096
- If Critical Damage Flag is set
- Damage = Damage * 2
- End If
- If Actor's Statuses include Berserk
- Damage = Damage * 3 / 2
- End If
- Long_Range = 0
- If Target is in Back Row
- Set Long_Range = 1
- End If
- If Attack is Short Range OR Command is Enemy Attack
- If Actor is in Back Row
- Long_Range = 1
- End If
- If Actor is in Back Row
- Else
- Long_Range = 0
- End If
- If Long_Range != 0
- Damage = Damage / 2
- End If
- If Target is Defending
- Damage = Damage / 2
- End If
- If Target's Back is exposed
- Damage = Damage * ( Target's Back Attack Modifier / 8 )
- End If
- If Actor's Statuses includes Frog
- Damage = Damage / 4
- End If
- Damage = Sadness( Damage )
- Damage = Split( Damage, 0 )
- Damage = Barrier( Damage )
- If Actor's Statuses include Mini
- Damage = 0
- End If
- Damage = Variance( Damage )
X2:
- multiNoSplit = ( ( ( Attack's Target Flags AND Ch ) - 4 ) == 0 ? 1 : 0 )
- Base = (Actor's Attack + Actor's Level) * 6
- Damage = (512 - Target's Defense) * Base * Attack's Power
- Damage = Sadness( Damage )
- Damage = SplitDamage( Damage, multiNoSplit )
- Damage = Barrier( Damage )
- Damage = Variance( Damage )
X3:
- If Attack Properties Damage MP is clear
- Damage = Target's HP
- Else
- Damage = Target's MP
- End If
- Damage = Damage * Attack's Power / 32
- If ActionData[AC] != 0 (?)
- Damage = Damage / 2
- End If
- Damage
X4:
- If Attack Properties Damage MP is clear
- Damage = Target's MHP
- Else
- Damage = Target's MMP
- End If
- Damage = Damage * Attack's Power / 32
- If ActionData[AC] != 0 (?)
- Damage = Damage / 2
- End If
- Damage
X5:
- Damage = (Actor's (M)Attack + Actor's Level) * 6 + (Attack's Power * 22)
- Damage = SplitDamage( Damage )
- Damage = Barrier( Damage )
- Damage = Variance( Damage )
X6:
- Damage = Attack's Power * 20
X7:
- Damage = ( ( 512 - Target's Def ) * Attack's Power / 32 )
- Damage = Variance( Damage )
X8:
- If ActionData[0x230] AND 40h
- ActionData[0x230] = 1
- Else
- ActionData[0x230] = 80h
- End If
X9:
- Actor's Attack = Actor's Strength * 2
- Use Damage X1 with adjusted stat
XA: Damage = ( Attack's Power + Number of Targets - 1 ) / Number of Targets
Sadness( Damage ):
- If Target's Status includes Sadness
- Damage = Damage - (Damage * 3 / 10)
- End If
- Return Damage
SplitDamage( Damage, multiNoSplit ):
- If multiNoSplit == 0
- If No. of Attack's Targets >= 2
- Set Attack's split damage Target Flag
- Else
- Set multiNoSplit == 1
- End If
- If No. of Attack's Targets >= 2
- End If
- If ActionData[0xAC] == 0
- Damage = Damage / 2
- Else
- If multiNoSplit == 0
- Damage = Damage * 3 / 2
- End If
- If multiNoSplit == 0
- End If
- Return Damage
Barrier( Damage ):
- If Attack Property "Physical" is 0
- If Target's Statuses include MBarrier
- Set ActionData "MBarrier Active" flag
- End If
- If Target's Statuses include MBarrier
- Else
- If Target's Statuses include Barrier
- Set ActionData "Barrier Active" flag
- End If
- If Target's Statuses include Barrier
- End If
- If ActionData "MBarrier Active" or "Barrier Active" flags are set
- Damage = Damage / 2
- End If
- If attack is Magic and EnabledMagic[7] == 0 (?)
- Damage = Damage + ( Damage * ( EnabledMagic[7] * (10 / 32) ) / 100 )
- End If
- Return Damage
Variance( Damage ):
- Damage = Damage ([0..255] + 3841) / 4096 //from RNGLUT in KERNEL.BIN
- If Damage == 0
- Damage == 1
- End If
- Return Damage