Difference between revisions of "FF7/DamageFormula"
my_wiki>NFITC1 m (off by a few bytes) |
my_wiki>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 20: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