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