FF7/DamageFormula

From Final Fantasy Inside
< FF7
Revision as of 19:52, 29 March 2012 by my_wiki>NFITC1 (Added Secondary Formulae. Will add Accuracy checks eventually)
Jump to navigation Jump to search

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