Ability Usage Checks and MP Reduction

From Final Fantasy Hacktics Wiki
Jump to navigation Jump to search
Parameters : r4 = Acting unit's data pointer

Returns : r2 = 0x00 if Action can be taken
          r2 = 0x08 if Unit is in deep water
          r2 = 0x07 if unit can't act
          r2 = 0x05 if unit is a frog attempting to do non frog things
          r2 = 0x03 if unit does not have enough MP (And action menu = default)
          r2 = 0x02 if unit is silenced and [Action menu = default or monster] and [Ability is silencable]

If action menu = default : Store MP used/cost at 0x801938eb (Check Half MP too)
--------------------------------------------------------------------------------------------------
0017da20: 27bdffd8 addiu r29,r29,-0x0028    |
0017da24: afb00018 sw r16,0x0018(r29)       |
0017da28: 00808021 addu r16,r4,r0           |r16 = Acting Unit's Data Pointer
0017da2c: afbf0024 sw r31,0x0024(r29)       |
0017da30: afb20020 sw r18,0x0020(r29)       |
0017da34: afb1001c sw r17,0x001c(r29)       |
0017da38: 9202016f lbu r2,0x016f(r16)       |r2 = Acting unit's used skillset
0017da3c: 96110170 lhu r17,0x0170(r16)      |r17 = Acting unit's used ability
0017da40: 3c018006 lui r1,0x8006            |
0017da44: 00220821 addu r1,r1,r2            |
0017da48: 90325cb4 lbu r18,0x5cb4(r1)       |r18 = Acting units used action menu  0x80065cb4 + skillset offset /80065cb4
0017da4c: 3c028019 lui r2,0x8019            |
0017da50: 8c42f5f0 lw r2,-0x0a10(r2)        |r2 = Action type  0x8018f5f0 / 8018f5f0
0017da54: 3c018019 lui r1,0x8019            |
0017da58: a02038eb sb r0,0x38eb(r1)         |Nullify Current ability used MP ( 0x801938eb) 801938eb
0017da5c: 14400003 bne r2,r0,0x0017da6c     #If Action type = 0x00 (not reacting)
0017da60: 00000000 nop                           |
0017da64: 0c0179ea jal 0x0005e7a8                |-->Status Infliction/Removal? store CT and remove every status from set 1 (keeps performing if unit is performing) 
0017da68: 340500ff ori r5,r0,0x00ff              |r5 = 0x0ff
0017da6c: 0c0604c3 jal 0x0018130c           |-->Weapon_Guard_Usability Returns r2 = 0x00 if unit can react/evade
0017da70: 02002021 addu r4,r16,r0           |r4 = Unit's Data Pointer
0017da74: 9203005c lbu r3,0x005c(r16)       |r3 = Acting Unit's Current Statuses 5
0017da78: 00000000 nop                      |
0017da7c: 30630004 andi r3,r3,0x0004        |r3 = 0x04 if unit has don't act / Else 0x00
0017da80: 10600002 beq r3,r0,0x0017da8c     #If Acting unit can't act /Else branch keeping r2 as returned by above routine
0017da84: 00000000 nop                           | 
0017da88: 34020001 ori r2,r0,0x0001              |r2 = 0x01
0017da8c: 14400047 bne r2,r0,0x0017dbac     #If unit can act /Else branch to END
0017da90: 24420006 addiu r2,r2,0x0006       |r2 = returned value + 0x06 (0x07 or 0x08)
0017da94: 9202005a lbu r2,0x005a(r16)            |r2 = Acting unit current status 3
0017da98: 00000000 nop                           |
0017da9c: 30420002 andi r2,r2,0x0002             |r2 = 0x02 if unit is a frog / else 0x00
0017daa0: 1040000e beq r2,r0,0x0017dadc          #If acting unit is a frog /Else avoid frog section
0017daa4: 00111400 sll r2,r17,0x10                   |
0017daa8: 00021c03 sra r3,r2,0x10                    |r3 = Used Ability ID
0017daac: 10600005 beq r3,r0,0x0017dac4              #If used ability <> 0x00 / If 0x00 branch to skillset check
0017dab0: 3402016f ori r2,r0,0x016f                      |r2 = 0x16f (frog attack ID)
0017dab4: 10620003 beq r3,r2,0x0017dac4                  #If Used ability <> Frog Attack / if frog attack branch to skillset check
0017dab8: 3402001d ori r2,r0,0x001d                          |r2 = 0x01d (Frog ID (spell))
0017dabc: 1462003b bne r3,r2,0x0017dbac                      #If used ability is Frog (checlk skillset) /Else branch to END - r2 = 0x05 (frog using illegal action ?)
0017dac0: 34020005 ori r2,r0,0x0005                          |r2 = 5
0017dac4: 324300ff andi r3,r18,0x00ff                |r3 = Used Action menu
0017dac8: 3402000a ori r2,r0,0x000a                  |r2 = 0x0a
0017dacc: 14620004 bne r3,r2,0x0017dae0              #If Action menu is aim (charge)
0017dad0: 2e220170 sltiu r2,r17,0x0170               |r2 = 0x01 if ability ID < Potion
0017dad4: 0805f6eb j 0x0017dbac                          >>jump to END - with r2 = 0x05 (frog using illegal skillset)
0017dad8: 34020005 ori r2,r0,0x0005                  |r2 = 5
0017dadc: 2e220170 sltiu r2,r17,0x0170           |r2 = 0x01 if ability ID < Potion
0017dae0: 10400031 beq r2,r0,0x0017dba8          #If Used ability is an ability with data 2 section (< potion) /Else branch to END (r2 = 0x00)
0017dae4: 00111400 sll r2,r17,0x10                   |
0017dae8: 00021403 sra r2,r2,0x10                    |r2 = Used ability ID
0017daec: 000218c0 sll r3,r2,0x03                    |r3 = Used ability ID * 8
0017daf0: 00621823 subu r3,r3,r2                     |r3 = Used ability ID * 7
0017daf4: 00031840 sll r3,r3,0x01                    |r3 = Used ability ID * 14 (Ability data 2 offset)
0017daf8: 3c028006 lui r2,0x8006                     |
0017dafc: 2442fbf0 addiu r2,r2,-0x0410               |r2 = 0x8005fbf0 (start of ability data 2)
0017db00: 00622021 addu r4,r3,r2                     |r4 = Acting unit's last used Ability's Data 2 Pointer
0017db04: 324300ff andi r3,r18,0x00ff                |r3 = Used Action menu
0017db08: 10600003 beq r3,r0,0x0017db18              #If Used Action menu <> Default /Else check silencable abilities
0017db0c: 34020006 ori r2,r0,0x0006                      |r2 = 0x06 (Monster menu ID)
0017db10: 1462000b bne r3,r2,0x0017db40                  #If Used Action Menu = Monster /Else if menu is not Default nor Monster skip silence checking
0017db14: 00000000 nop                                       |
0017db18: 90820005 lbu r2,0x0005(r4)                 #E      |r2 = used Ability data 2 Flags 3
0017db1c: 00000000 nop                                       |
0017db20: 30420020 andi r2,r2,0x0020                         |r2 = 0x20
0017db24: 10400006 beq r2,r0,0x0017db40                      #If Ability is affected by silence /Else skip silence checking
0017db28: 00000000 nop                                           | 
0017db2c: 92020059 lbu r2,0x0059(r16)                            |r2 = Acting Unit's Current Statuses 2
0017db30: 00000000 nop                                           |
0017db34: 30420008 andi r2,r2,0x0008                             |r2 = 0x08 if acting unit is silenced / Else 0x00
0017db38: 1440001c bne r2,r0,0x0017dbac                          #If Unit don't have silence /Else if Unit has Silence branch to END - r2 = 0x02
0017db3c: 34020002 ori r2,r0,0x0002                              |r2 = 0x02
0017db40: 1640001a bne r18,r0,0x0017dbac             #If Acting unit's used action menu is default /If not default branch to END - r2 = 0x00
0017db44: 00001021 addu r2,r0,r0                     |r2 = 0x00
0017db48: 92030003 lbu r3,0x0003(r16)                    |r3 = Acting Unit's Job ID
0017db4c: 3402005d ori r2,r0,0x005d                      |r2 = 0x5d (mime job ID)
0017db50: 10620016 beq r3,r2,0x0017dbac                  #If Job is not Mime /If unit is a mime branch to END - r2 = 0x00
0017db54: 00001021 addu r2,r0,r0                         |r2 = 0x00
0017db58: 92020090 lbu r2,0x0090(r16)                        |r2 = Acting Unit's Support 2
0017db5c: 9084000d lbu r4,0x000d(r4)                         |r4 = used Ability's MP Cost
0017db60: 30420080 andi r2,r2,0x0080                         |r2 = 0x80 if Acting unit uses Half MP
0017db64: 10400002 beq r2,r0,0x0017db70                      #If Unit has Half MP
0017db68: 00000000 nop                                           |
0017db6c: 00042042 srl r4,r4,0x01                                |r4 = MP cost / 2
0017db70: 3c018019 lui r1,0x8019                             |r1 = 0x80190000
0017db74: a02438eb sb r4,0x38eb(r1)                          |Store MP Used in current ability MP used
0017db78: 8602002c lh r2,0x002c(r16)                         |r2 = Acting unit's current MP
0017db7c: 00000000 nop                                       |
0017db80: 00402821 addu r5,r2,r0                             |r5 = Acting unit current MP
0017db84: 0044102a slt r2,r2,r4                              |r2 = 0x01 if Unit current MP < Ability MP cost
0017db88: 14400008 bne r2,r0,0x0017dbac                      #If Unit has enough MP /Else not enough MP, branch to END With r2 = 0x03
0017db8c: 34020003 ori r2,r0,0x0003                          |r2 = 0x03
0017db90: 3c038019 lui r3,0x8019                                 |r3 = 0x80190000
0017db94: 8c63f5fc lw r3,-0x0a04(r3)                             |r3 = Action state  0x8018f5fc / 8018f5fc
0017db98: 34020002 ori r2,r0,0x0002                              |r2 = 0x02
0017db9c: 10620002 beq r3,r2,0x0017dba8                          #If Action is not in Preview
0017dba0: 00a41023 subu r2,r5,r4                                 |r2 = Acting unit MP - MP cost
0017dba4: a602002c sh r2,0x002c(r16)                             |Store Unit new MP
0017dba8: 00001021 addu r2,r0,r0                #E           |r2 = 0x00
0017dbac: 8fbf0024 lw r31,0x0024(r29)                        
0017dbb0: 8fb20020 lw r18,0x0020(r29)                        
0017dbb4: 8fb1001c lw r17,0x001c(r29)                        
0017dbb8: 8fb00018 lw r16,0x0018(r29)                        
0017dbbc: 27bd0028 addiu r29,r29,0x0028                      
0017dbc0: 03e00008 jr r31                                    
0017dbc4: 00000000 nop

Return locations

Battle.bin 
0017ca4c: Prep_Current_Action_Data
0017df60: Big..._Contains_Hamedo_check
0017e0f0: Big..._Contains_Hamedo_check
0017e430: Main_reaction_routine?