Difference between revisions of "FF7/DamageFormula"
Qhimm>NFITC1 m (off by a few bytes) |
Qhimm>NFITC1 (Added detailed damage calculations. Accuracy functions will have to wait.) |
||
Line 145: | Line 145: | ||
==Damage Calculations== | |||
For standard damage functions | For standard damage functions | ||
X0: | X0: | ||
:Sets Target's 02h flag to 1. (Unknown effect) | :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 | |||
:If | ::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 ) | ||
:Damage = Damage * ( | :If Actor's Statuses include Mini | ||
:If | :: Damage = 0 | ||
:Damage = | :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 |
Revision as of 19:22, 24 January 2012
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