Calculate Final Hit %

From Final Fantasy Hacktics Wiki
Revision as of 19:04, 7 April 2022 by Orkney (talk | contribs)
Jump to navigation Jump to search
No Parameters - Returns nothing

If Ability flag [Evadable] is Off : skip the whole routine
This routine Will set the value of the displayed Hit% 
  - Forced to 0x00 if Any Current Ability Evade data is greater than base hit value
  - If Attack might succeed : Hit% is calculated in the central math section
Last part of the routine Roll Each Evade type against Current Ability Base Hit (That's why halving base Hit = doubling all evasion type (cf Defend mechanics))
Update Target current action 0x2a (Hit%) and if Evaded Update Target current action 0x00 (Hit flag) 0x02 (Evade Type) and 0x03 (Used Item for evasion)
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
00185814: 3c028019 lui r2,0x8019            |
00185818: 944238d6 lhu r2,0x38d6(r2)        |r2 = Current Ability : used Ability ID  0x801938d6
0018581c: 27bdffe0 addiu r29,r29,-0x020     |
00185820: afbf0018 sw r31,0x0018(r29)       |
00185824: afb10014 sw r17,0x0014(r29)       |
00185828: 10400007 beq r2,r0,0x00185848     #If used Ability is not a standard Attack
0018582c: afb00010 sw r16,0x0010(r29)           |
00185830: 3c028019 lui r2,0x8019                |
00185834: 904238f6 lbu r2,0x38f6(r2)            |r2 = Current Ability  flags 4  0x801938f6
00185838: 00000000 nop                          |
0018583c: 30420002 andi r2,r2,0x0002            |r2 = 0x02 if Ability is Evadable
00185840: 10400090 beq r2,r0,0x00185a84         #Branch to  END if Ability is not Evadable
00185844: 00000000 nop                              
00185848: 3c088019 lui r8,0x8019            |
0018584c: 910838dc lbu r8,0x38dc(r8)        |r8 = Current ability base Hit  0x801938dc
00185850: 3c038019 lui r3,0x8019            |
00185854: 906338de lbu r3,0x38de(r3)        |r3 = Current Ability Accessory Evade  0x801938de
00185858: 310500ff andi r5,r8,0x00ff        |r5 = Base Hit (byte)
0018585c: 0065102b sltu r2,r3,r5            |r2 = 0x01 if Accessory Evade < Base Hit
00185860: 10400013 beq r2,r0,0x001858b0     #If Base Hit > Accessory Evade /Else branch (Attack Evaded without maths)
00185864: 01008021 addu r16,r8,r0           |r16 = Base Hit % (Keep original value)
00185868: 3c048019 lui r4,0x8019                |
0018586c: 908438df lbu r4,0x38df(r4)            |r4 = Current Ability Right Hand Evade  0x801938df
00185870: 00000000 nop                          |
00185874: 0085102b sltu r2,r4,r5                |r2 = 0x01 if Right Hand Evade < Base Hit
00185878: 1040000d beq r2,r0,0x001858b0         #If Base Hit > Right Hand Evade /Else branch (Attack Evaded without maths)
0018587c: 00000000 nop                              |
00185880: 3c068019 lui r6,0x8019                    |
00185884: 90c638e0 lbu r6,0x38e0(r6)                |r6 = Current Ability Left Hand Evade  0x801938e0
00185888: 00000000 nop                              |
0018588c: 00c5102b sltu r2,r6,r5                    |r2 = 0x01 if Left Hand Evade < Base Hit
00185890: 10400007 beq r2,r0,0x001858b0             #If Base Hit > Left Hand Evade /Else branch (Attack Evaded without maths)
00185894: 00000000 nop                                  |
00185898: 3c078019 lui r7,0x8019                        |
0018589c: 90e738e1 lbu r7,0x38e1(r7)                    |r7 = Current Ability Class Evade  0x801938e1
001858a0: 00000000 nop                                  |
001858a4: 00e5102b sltu r2,r7,r5                        |r2 = 0x01 If Class Evade < Base Hit
001858a8: 14400009 bne r2,r0,0x001858d0                 #If Class Evade > Base Hit /Else Avoid is Evaded section
001858ac: 00a31023 subu r2,r5,r3                        |r2 = Base Hit - Accessory Evade
001858b0: 3c028019 lui r2,0x8019            #E  #E  #E      |
001858b4: 8c422d90 lw r2,0x2d90(r2)                         |r2 = Target Current action data pointer
001858b8: 00000000 nop                                      |
001858bc: a0400000 sb r0,0x0000(r2)                         |Store 0x00 in Target Current action hit flag (miss)
001858c0: 3c028019 lui r2,0x8019                            |
001858c4: 8c422d90 lw r2,0x2d90(r2)                         |r2 = Target Current action data pointer
001858c8: 08061675 j 0x001859d4                             >>jump After display section
001858cc: a440002a sh r0,0x002a(r2)                         |Store Target Current action  Hit% = 0
                                            #Else (Attacks might succeed) - keep going

 --- Display Hit% Section ---
001858d0: 00021840 sll r3,r2,0x01           |r2 = Reduced Hit *2 (Base Hit - Accessory Evade) Base Hit = 80
001858d4: 00621821 addu r3,r3,r2            |Reduced Hit *3 Acc Evade = 20
001858d8: 000318c0 sll r3,r3,0x03           |Reduced Hit * 24
001858dc: 00621821 addu r3,r3,r2            |Reduced Hit * 25
001858e0: 00031880 sll r3,r3,0x02           |r3 = Reduced Hit *100
001858e4: 0065001a div r3,r5                |(Accessory Reduced Hit *100)/Base Hit ( % of remaining Hit after Accessory Evade)
001858e8: 00001812 mflo r3                  |r3 = % Of base Hit remaining
001858ec: 00a42023 subu r4,r5,r4            |r4 = Base Hit - Right Hand Evade
001858f0: 00041040 sll r2,r4,0x01           |Reduced Hit *2
001858f4: 00441021 addu r2,r2,r4            |Reduced Hit *3
001858f8: 000210c0 sll r2,r2,0x03           |Reduced Hit * 24
001858fc: 00441021 addu r2,r2,r4            |Reduced Hit * 25
00185900: 00021080 sll r2,r2,0x02           |r2 = Reduced Hit *100
00185904: 0045001a div r2,r5                |(Right Hand Reduced Hit *100)/Base Hit ( % of remaining Hit after Right Hand Evade)
00185908: 00001012 mflo r2                  |r2 = Right Hand % of Remaining Base Hit
0018590c: 00000000 nop                      |
00185910: 00000000 nop                      |
00185914: 00620018 mult r3,r2               |Accessory Remaing Hit% * Right Hand Remaining Hit%
00185918: 00a61823 subu r3,r5,r6            |r3 = Base Hit - Left Hand Evade
0018591c: 00031040 sll r2,r3,0x01           |Reduced Hit *2
00185920: 00431021 addu r2,r2,r3            |Reduced Hit *3
00185924: 000210c0 sll r2,r2,0x03           |Reduced Hit * 24
00185928: 00002012 mflo r4                  |r4 = Current Remaining % of Base (After Accessory and Right Hand Evade) * 100
0018592c: 00431021 addu r2,r2,r3            |Reduced Hit * 25
00185930: 00021080 sll r2,r2,0x02           |r2 = Reduced Hit *100
00185934: 0045001a div r2,r5                |(Left Hand Reduced Hit *100)/Base Hit ( % of remaining Hit after Left Hand Evade)
00185938: 00001012 mflo r2                  |r2 = Left Hand % Of base Hit remaining
0018593c: 00000000 nop                      |
00185940: 00000000 nop                      |
00185944: 00820018 mult r4,r2               |Current Remaing Hit% *100 * Left Hand Remaining Hit%
00185948: 00a71823 subu r3,r5,r7            |r3 = Base Hit % - Class Evade
0018594c: 00031040 sll r2,r3,0x01           |Reduced Hit *2
00185950: 00431021 addu r2,r2,r3            |Reduced Hit *3
00185954: 000210c0 sll r2,r2,0x03           |Reduced Hit * 24
00185958: 00002012 mflo r4                  |r4 = Current Remaining % of Base (After Accessory, Right Hand and Left Hand Evade) * 10000
0018595c: 00431021 addu r2,r2,r3            |Reduced Hit * 25
00185960: 00021080 sll r2,r2,0x02           |r2 = Reduced Hit *100
00185964: 0045001a div r2,r5                |(Classe Evade Reduced Hit *100)/Base Hit ( % of remaining Hit after Class Evade)
00185968: 00001012 mflo r2                  |r2 = Class Evade % Of base Hit remaining
0018596c: 00000000 nop                      |
00185970: 00000000 nop                      |
00185974: 00820018 mult r4,r2               |Current Remaing Hit% * Class Evade Remaining Hit% * 1000000
00185978: 00001812 mflo r3                  |r3 = Current Remaining % of Base (After Accessory, Right Hand, Left Hand and Class Evade) *1000000
0018597c: 3c02431b lui r2,0x431b            |
00185980: 3442de83 ori r2,r2,0xde83         |r2 = 0x431bde83 (0,262144 * 2^32)
00185984: 00620018 mult r3,r2               |Current Remaining %of base Hit * 2^32*0,262144*1000000
00185988: 3c058019 lui r5,0x8019            |
0018598c: 8ca52d90 lw r5,0x2d90(r5)         |r5 = Target Current action data pointer
00185990: 00000000 nop                      |
00185994: 84a4002a lh r4,0x002a(r5)         |r4 = Target Current action Hit% (Set to 100 during PreFormla Set Up)
00185998: 00031fc3 sra r3,r3,0x1f           |r3 = 1st bit of Current Remaining % of base hit (should be 0x00)
0018599c: 00001010 mfhi r2                  |r2 = [Remaining % of Base Hit] *262144
001859a0: 00021483 sra r2,r2,0x12           |r2 = [Remaining % of Base Hit]   (2^18 = 262144)
001859a4: 00431023 subu r2,r2,r3            |r2 = [Remaining % of Base Hit] -0x00
001859a8: 00440018 mult r2,r4               |[Remaining % of Base Hit] * [Base Hit]
001859ac: 00001812 mflo r3                  |r3 = [Remaining % of Base Hit] * [Base Hit]
001859b0: 3c0251eb lui r2,0x51eb            |
001859b4: 3442851f ori r2,r2,0x851f         |r2 = 0x51eb851f * 0,32*2^32
001859b8: 00620018 mult r3,r2               |[Remaining % of Base Hit] * [Base Hit] * 0,32 * 2^32
001859bc: 00031fc3 sra r3,r3,0x1f           |r3 = 1st bit of [Remaining % of Base Hit] * [Base Hit]
001859c0: 00001010 mfhi r2                  |r2 = [Remaining % of Base Hit] * [Base Hit] * 32/100
001859c4: 00021143 sra r2,r2,0x05           |r2 = [Remaining % of Base Hit] * [Base Hit] /100 = Final Hit
001859c8: 00431023 subu r2,r2,r3            |
001859cc: a4a2002a sh r2,0x002a(r5)         |Store Final Hit% in Target Current Action 0x2a (Hit%)
001859d0: 01008021 addu r16,r8,r0           |r16 = Original Hit %

 ---Roll  Evasion Section  ---
001859d4: 02002821 addu r5,r16,r0           |r5 = Current Ability Base Hit
001859d8: 3c028019 lui r2,0x8019            |
001859dc: 8c422d98 lw r2,0x2d98(r2)         |r2 = Target Current action data pointer
001859e0: 3c048019 lui r4,0x8019            |
001859e4: 908438de lbu r4,0x38de(r4)        |r4 = Accessory Evade
001859e8: 9047001c lbu r7,0x001c(r2)        |r7 = Target Accessory ID
001859ec: 0c061236 jal 0x001848d8           |-->Attack_Evaded_Calculations If Attack is Evaded r2 = 0x01 (Hit flag is set to 0x00)
001859f0: 34060001 ori r6,r0,0x0001         |r6 = 0x01 (Accessory Evade Flag)
001859f4: 14400023 bne r2,r0,0x00185a84     #If Attack Hits /Else if Attack is Evaded, branch to  END
001859f8: 341100ff ori r17,r0,0x00ff        |r17 = 0x0ff
001859fc: 3c038019 lui r3,0x8019                |
00185a00: 8c632d98 lw r3,0x2d98(r3)             |r3 = Target Data pointer
00185a04: 00000000 nop                          |
00185a08: 9067001d lbu r7,0x001d(r3)            |r7 = Target Right Hand Weapon ID
00185a0c: 00000000 nop                          |
00185a10: 30e200ff andi r2,r7,0x00ff            |r2 = Right Hand Weapon ID (byte)
00185a14: 14510002 bne r2,r17,0x00185a20        #If Right Hand Weapon  ID = 0x0ff (don't exist)
00185a18: 02002821 addu r5,r16,r0               |r5 = Current Ability Base Hit
00185a1c: 9067001e lbu r7,0x001e(r3)                |r7 = Target Right Hand Shield
00185a20: 3c048019 lui r4,0x8019                |
00185a24: 908438df lbu r4,0x38df(r4)            |r4 = Current Ability Right Hand Evade  0x801938df 
00185a28: 0c061236 jal 0x001848d8               |-->Attack_Evaded_Calculations If Attack is Evaded r2 = 0x01 (Hit flag is set to 0x00)
00185a2c: 34060002 ori r6,r0,0x0002             |r6 = 0x02 (Right Hand Evade flag)
00185a30: 14400014 bne r2,r0,0x00185a84         #If Attack Hits /Else if Attack is Evaded, branch to  END
00185a34: 00000000 nop                              |
00185a38: 3c028019 lui r2,0x8019                    |
00185a3c: 8c422d98 lw r2,0x2d98(r2)                 |r2 = Target Data pointer
00185a40: 00000000 nop                              |
00185a44: 9047001f lbu r7,0x001f(r2)                |r7 = Target Left Hand Weapon
00185a48: 00000000 nop                              |
00185a4c: 14f10002 bne r7,r17,0x00185a58            #If Left Hand Weapon  ID = 0x0ff (don't exist)
00185a50: 02002821 addu r5,r16,r0                   |r5 = Current Ability Base Hit
00185a54: 90470020 lbu r7,0x0020(r2)                    |r7 = Target Left Hand Shield
00185a58: 3c048019 lui r4,0x8019                    |
00185a5c: 908438e0 lbu r4,0x38e0(r4)                |r4 = Current Ability Left Hand Evade  0x801938e0
00185a60: 0c061236 jal 0x001848d8                   |-->Attack_Evaded_Calculations If Attack is Evaded r2 = 0x01 (Hit flag is set to 0x00)
00185a64: 34060003 ori r6,r0,0x0003                 |r6 = 0x03  (Left Hand Evade flag)
00185a68: 14400006 bne r2,r0,0x00185a84             #If Attack Hits /Else if Attack is Evaded, branch to  END
00185a6c: 02002821 addu r5,r16,r0                       |r5 = Current Ability Base Hit
00185a70: 3c048019 lui r4,0x8019                        |
00185a74: 908438e1 lbu r4,0x38e1(r4)                    |r4 = Current Ability Class Evade 0x801938e1
00185a78: 34060004 ori r6,r0,0x0004                     |r6 = 0x04 (Classe Evade flag)
00185a7c: 0c061236 jal 0x001848d8                       |-->Attack_Evaded_Calculations If Attack is Evaded r2 = 0x01 (Hit flag is set to 0x00)
00185a80: 340700ff ori r7,r0,0x00ff                     |r7 = 0x0ff( No Item ID)
00185a84: 8fbf0018 lw r31,0x0018(r29)       END
00185a88: 8fb10014 lw r17,0x0014(r29)       
00185a8c: 8fb00010 lw r16,0x0010(r29)       
00185a90: 27bd0020 addiu r29,r29,0x0020     
00185a94: 03e00008 jr r31                   
00185a98: 00000000 nop                      

Return Locations

Battle.bin
00188498: Calculate Hit %