Difference between revisions of "FF7/DamageFormula"
my_wiki>NFITC1 (→Damage Calculations) |
my_wiki>NFITC1 (Added Secondary Formulae. Will add Accuracy checks eventually) |
||
Line 280: | Line 280: | ||
XA: | XA: | ||
<pre>Damage = ( Attack's Power + Number of Targets - 1 ) / Number of Targets</pre> | <pre>Damage = ( Attack's Power + Number of Targets - 1 ) / Number of Targets</pre> | ||
+ | |||
==Additional Checks== | ==Additional Checks== | ||
Sadness( Damage ): | Sadness( Damage ): | ||
Line 338: | Line 339: | ||
End If | End If | ||
Return Damage | Return Damage | ||
+ | </pre> | ||
+ | |||
+ | |||
+ | =Secondary Damage Formulae= | ||
+ | X0: | ||
+ | <pre> | ||
+ | Damage = Attacker's HP | ||
+ | </pre> | ||
+ | X1: | ||
+ | <pre> | ||
+ | Damage = Target's MHP - Target's HP | ||
+ | </pre> | ||
+ | X8: | ||
+ | <pre> | ||
+ | Dice_Count = Attacker's Level / 10 | ||
+ | |||
+ | If Dice_Count < 2 then | ||
+ | Dice_Count = 2 | ||
+ | Elseif Dice_Count > 6 | ||
+ | Dice_Count = 6 | ||
+ | End If | ||
+ | |||
+ | total_dice_roll = 0 | ||
+ | For ( d_loop = 0; d_loop < Dice_Count; d_loop++ ) | ||
+ | die = [0..5] | ||
+ | all_dice[d_loop] = die | ||
+ | total_dice_roll += die + 1 | ||
+ | |||
+ | set die visualization based on roll | ||
+ | Loop | ||
+ | |||
+ | value_repeat = 0 | ||
+ | For ( d_value = 0; d_value < 6; d_value++ ) | ||
+ | |||
+ | repeat_count = 0 | ||
+ | For ( d_loop = 0; d_loop < Dice_Count; d_loop++ ) | ||
+ | |||
+ | If all_dice[d_loop] = d_value then | ||
+ | repeat_count++ | ||
+ | End If | ||
+ | Loop | ||
+ | |||
+ | If repeat_count > value_repeat then | ||
+ | value_repeat = repeat_count | ||
+ | End If | ||
+ | |||
+ | Loop | ||
+ | |||
+ | Damage = value_repeat * 100 * total_dice_roll | ||
+ | </pre> | ||
+ | X9: | ||
+ | <pre> | ||
+ | Damage = Number of Successful Escapes | ||
+ | </pre> | ||
+ | XA: | ||
+ | <pre> | ||
+ | Damage = Target's HP - 1 | ||
+ | </pre> | ||
+ | XB: | ||
+ | <pre> | ||
+ | Damage = (Game Time Hours * 100) + (Game Time Minutes) | ||
+ | </pre> | ||
+ | XC: | ||
+ | <pre> | ||
+ | Damage = Target's Kill Count * 10 | ||
+ | //This is intended to be used only on players | ||
+ | //This will cause a memory leak if done on enemies | ||
</pre> | </pre> |
Revision as of 19:52, 29 March 2012
Contents
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
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
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 //presumably this checks if the target heals from restore element and will either recover or kill based on the result
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
Additional Checks
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
Secondary Damage Formulae
X0:
Damage = Attacker's HP
X1:
Damage = Target's MHP - Target's HP
X8:
Dice_Count = Attacker's Level / 10 If Dice_Count < 2 then Dice_Count = 2 Elseif Dice_Count > 6 Dice_Count = 6 End If total_dice_roll = 0 For ( d_loop = 0; d_loop < Dice_Count; d_loop++ ) die = [0..5] all_dice[d_loop] = die total_dice_roll += die + 1 set die visualization based on roll Loop value_repeat = 0 For ( d_value = 0; d_value < 6; d_value++ ) repeat_count = 0 For ( d_loop = 0; d_loop < Dice_Count; d_loop++ ) If all_dice[d_loop] = d_value then repeat_count++ End If Loop If repeat_count > value_repeat then value_repeat = repeat_count End If Loop Damage = value_repeat * 100 * total_dice_roll
X9:
Damage = Number of Successful Escapes
XA:
Damage = Target's HP - 1
XB:
Damage = (Game Time Hours * 100) + (Game Time Minutes)
XC:
Damage = Target's Kill Count * 10 //This is intended to be used only on players //This will cause a memory leak if done on enemies