FF7/DamageFormula

From Final Fantasy Inside
< FF7
Revision as of 20:22, 24 January 2012 by my_wiki>NFITC1 (Added detailed damage calculations. Accuracy functions will have to wait.)

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
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
End If
If ActionData[0xAC] == 0
Damage = Damage / 2
Else
If multiNoSplit == 0
Damage = Damage * 3 / 2
End If
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
Else
If Target's Statuses include Barrier
Set ActionData "Barrier Active" flag
End If
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