Targeting validation (weapon flags)

From Final Fantasy Hacktics Wiki
Jump to navigation Jump to search
0017ac90 - 0017afbc

Parameters : r4 = Pointer to attacker data 0x16e              	  

Returns : r2 = 0x00 green flags have been updated
          r2 = -0x01 if invalid Attacker ID or Weapon ID >=0x80 (shields)
          r2 = -0x01 if invalid Target ID for not weapon ranged ability (see Summary)
------------------------------------------------------------------- 
0017ac90: 27bdffb0  addiu r29,r29,-0x0050   |
0017ac94: 27a50018 addiu r5,r29,0x0018      |r5 =Inner stack pointer
0017ac98: afbf004c sw r31,0x004c(r29)       |
0017ac9c: afb60048 sw r22,0x0048(r29)       |
0017aca0: afb50044 sw r21,0x0044(r29)       |
0017aca4: afb40040 sw r20,0x0040(r29)       |
0017aca8: afb3003c sw r19,0x003c(r29)       |
0017acac: afb20038 sw r18,0x0038(r29)       |
0017acb0: afb10034 sw r17,0x0034(r29)       |
0017acb4: 0c01788b jal 0x0005e22c           |-->Copy_Byte_Data_(20_Bytes) Copy attacker data 0x16e - 0x181 on inner stack pointer
0017acb8: afb00030 sw r16,0x0030(r29)       |
0017acbc: 93b50018 lbu r21,0x0018(r29)      |r21 =Attacker ID (Attacker 0x16e on inner stack)
0017acc0: 00000000 nop                      |
0017acc4: 32a300ff andi r3,r21,0x00ff       |r3 = Attacker ID last byte
0017acc8: 2c620015 sltiu r2,r3,0x0015       |r2 = 0x01 if attacker ID < 0x15 (21)
0017accc: 10400050 beq r2,r0,0x0017ae10     #If  Attacker ID is valid / Branch to jump to End  (r2 = -0x01) if not
0017acd0: 000310c0 sll r2,r3,0x03                |Attacker ID * 8
0017acd4: 00431023 subu r2,r2,r3                 |Attacker ID * 7
0017acd8: 00021180 sll r2,r2,0x06                |Attacker ID * 448 (0x1c0)
0017acdc: 3c038019 lui r3,0x8019                 |
0017ace0: 246308cc addiu r3,r3,0x08cc            |r3 = 0x801908cc
0017ace4: 00439021 addu r18,r2,r3                |r18 = attacker data pointer
0017ace8: 92430001 lbu r3,0x0001(r18)            |r3 = Attacker ID
0017acec: 340200ff ori r2,r0,0x00ff              |r2 = 0x00ff
0017acf0: 106200a8 beq r3,r2,0x0017af94          #If Attacker ID <> 0xff  / Branch to jump to End (r2 = -0x01)
0017acf4: 2402ffff addiu r2,r0,-0x0001           |r2 = -0x01
0017acf8: 93a20019 lbu r2,0x0019(r29)                |r2 =  skillset ID of last used attack?  (Attacker 0x16f via inner stack)
0017acfc: 3c018006 lui r1,0x8006                     |r1 = 0x80060000
0017ad00: 00220821 addu r1,r1,r2                     |r1 = 0x80060000 + Skillset ID
0017ad04: 90365cb4 lbu r22,0x5cb4(r1)                |r22 = action menu of skillset   0x80065cb4 + Skillset ID
0017ad08: 00000000 nop                               |
0017ad0c: 32c300ff andi r3,r22,0x00ff                |r3 = last byte of skillset's action menu
0017ad10: 10600004 beq r3,r0,0x0017ad24              #If action menu is not [Default] / Else branch to ability [weapon range] flag search
0017ad14: 00002021 addu r4,r0,r0                         |r4 = 0x00
0017ad18: 34020006 ori r2,r0,0x0006                      |r2 = 0x06
0017ad1c: 1462000b bne r3,r2,0x0017ad4c                  #If action menu = [Monster] / Branch if not monster (avoid ability [weapon range] flag search)
0017ad20: 34020008 ori r2,r0,0x0008                      |r2 = 0x08 (Action menu [Attack] ID
                                             --- [Default] [Monster] ---- (load used ability [weapon range] flag)
0017ad24: 93a3001a lbu r3,0x001a(r29)                #E      |r3 = Attacker last attack ID  (Attacker 0x170 via inner stack)
0017ad28: 00000000 nop                                       |
0017ad2c: 000310c0 sll r2,r3,0x03                            |r2 = Attacker last used ability ID * 8
0017ad30: 00431023 subu r2,r2,r3                             |r2 = Attacker last used ability ID * 7
0017ad34: 00021040 sll r2,r2,0x01                            |r2 = Attacker last used ability ID * 14
0017ad38: 3c018006 lui r1,0x8006                             |
0017ad3c: 00220821 addu r1,r1,r2                             |r2 = 8006 0000  + Ability ID * 14
0017ad40: 9024fbf3 lbu r4,-0x040d(r1)                        |r4 = Attacker last used ability data 2 flags 1  0x8005fbf0 + 0x03 + ability offset
0017ad44: 32c300ff andi r3,r22,0x00ff                        |r3 = last byte of last used skillset ID
0017ad48: 34020008 ori r2,r0,0x0008                          |r2 = 0x08 (Action menu [Attack] ID
                                             ---All --- Check action menu [Attack], [Charge] and used ability [weapon range] flag (only have value if defalut or monster action menu)
0017ad4c: 10620006 beq r3,r2,0x0017ad68                  #If Action menu <> [Attack] #branch if attack
0017ad50: 340500ff ori r5,r0,0x00ff                      |r5 = 0xff
0017ad54: 3402000a ori r2,r0,0x000a                          |r2 = 0x0a ([Action menu Charge ID]
0017ad58: 10620003 beq r3,r2,0x0017ad68                      #If Action menu <> [Charge] #branch if charge
0017ad5c: 30820020 andi r2,r4,0x0020                             |r2 = 0x20 if ranged weapon is checked (and action menu is [Default] or [Monster]
0017ad60: 10400022 beq r2,r0,0x0017adec                          #If weapon range is checked ([Default]pr  #branch if weapon range = false
0017ad64: 34020006 ori r2,r0,0x0006                              |r2 = 0x06 (for Attacker 0x178 check)
                                             --- [Charge] , [Attack], [ Default or Monster if ability flag weapon range is checked] ----
0017ad68: 9243001f lbu r3,0x001f(r18)                    #E  #E      |r3 = Attacker left hand weapon
0017ad6c: 00000000 nop                                               |
0017ad70: 386200ff xori r2,r3,0x00ff                                 |r2 = 0x00 if weapon ID is 0xff (doesn't exist)
0017ad74: 0002102b sltu r2,r0,r2                                     |r2 = 0x01 if weapon exist / else 0x00 (r0 < everything but 0x00)
0017ad78: 00021023 subu r2,r0,r2                                     |r2 = -0x01 if weapon exist /else 0x00
0017ad7c: 00622024 and r4,r3,r2                                      |r4 = Attacker left hand weapon ID if weapon exist / Else 0x00
0017ad80: 9243001d lbu r3,0x001d(r18)                                |r3 = Attacker right hand weapon
0017ad84: 00000000 nop                                               |
0017ad88: 10650002 beq r3,r5,0x0017ad94                              #If Attacker has a right weapon # / Else branch  (r4 keeping left weapon ID or 0x00)
0017ad8c: 00000000 nop                                                   | 
0017ad90: 00602021 addu r4,r3,r0                                         |r4 = Attacker right hand ID
0017ad94: 9242005a lbu r2,0x005a(r18)                                |r2 = Attacker current status 3
0017ad98: 00000000 nop                                               |
0017ad9c: 30420002 andi r2,r2,0x0002                                 |r2 = 0x02 if attacker is a frog
0017ada0: 14400008 bne r2,r0,0x0017adc4                              #If attacker is not a frog / Branch if frog (weapon will be set to 0x00)
0017ada4: 00000000 nop                                                   | 
0017ada8: 92420006 lbu r2,0x0006(r18)                                    |r2 = Attacker gender
0017adac: 00000000 nop                                                   |
0017adb0: 30420020 andi r2,r2,0x0020                                     |r2 = 0x20 if attacker is a monster
0017adb4: 14400003 bne r2,r0,0x0017adc4                                  #If attacker is not a monster / Branch if monster (weapon will be set to 0x00)
0017adb8: 00000000 nop                                                       | 
0017adbc: 14850003 bne r4,r5,0x0017adcc                                      #If weapon ID = 0xff / branch if right weapon exist (not monster not frog) avoid weapon ID nullification
0017adc0: 308300ff andi r3,r4,0x00ff                                         |r3 = weapon ID 
0017adc4: 00002021 addu r4,r0,r0                                     #E #E r4 = 0x00 (if frog or monster or if r4 = 0xff (not possible at this stade ?)
0017adc8: 308300ff andi r3,r4,0x00ff                                             |r3 = 0x00
0017adcc: 2c620080 sltiu r2,r3,0x0080                                |r2 = 0x01 if weapon ID < 0x80 ( 0x80 and above are shields)
0017add0: 1040000f beq r2,r0,0x0017ae10                              #If Weapon ID < 0x80 #branch if not, return r2 = -0x01
0017add4: 000310c0 sll r2,r3,0x03                                        |r2 = weapon ID * 8 (secondary data size - per weapon)
0017add8: 3c018006 lui r1,0x8006                                         |
0017addc: 00220821 addu r1,r1,r2                                         |r2 = 0x80060000 + weapon ID * 8 
0017ade0: 90303ab9 lbu r16,0x3ab9(r1)                                    |r16 =  item secondary data - attack flags ( 0x80063ab8 + 0x01 + weapon ID *8)
0017ade4: 0805eb96 j 0x0017ae58                                          >>jump avoiding next
0017ade8: 00000000 nop                                                   |
                                             --- Not [Charge] - Not [Attack] - [Default or Monster if ability flag weapon range is NOT checked]---
0017adec: 93a30022 lbu r3,0x0022(r29)                            # Else (see section title) r3 =  Attacker reaction ID ?  (Attacker 0x178  via inner stack)
0017adf0: 00000000 nop                                               |
0017adf4: 14620018 bne r3,r2,0x0017ae58                              #if Attacker 0x178 = 0x06 (Target-Specific Ability?) / Else avoid Target ID and coord. checking
0017adf8: 34100020 ori r16,r0,0x0020                                 |r16 = 0x20 (forced direct attack flag ?)
0017adfc: 93a30023 lbu r3,0x0023(r29)                                    |r3 = Attacker target ID ?  (Attacker 0x179 via inner stack)
0017ae00: 00000000 nop                                                   |
0017ae04: 2c620015 sltiu r2,r3,0x0015                                    |r2 = 0x01 if Target is valid (< 0x15) / Else 0x00
0017ae08: 14400003 bne r2,r0,0x0017ae18                                  #If Target is not valid /Else avoid ending routine
0017ae0c: 000310c0 sll r2,r3,0x03                                        |r2 = Attacker Target ID * 8
0017ae10: 0805ebe5 j 0x0017af94             #Else                    #E       >>Jump to  end With r2 = -0x01  Invalid Attacker ID, Target ID or Weapon ID
0017ae14: 2402ffff addiu r2,r0,-0x0001                                       |r2 = -0x01
0017ae18: 00431023 subu r2,r2,r3                                         #Else Target is valid r2 = Attacker Target ID * 7
0017ae1c: 00021180 sll r2,r2,0x06                                        |r2 = Attacker Target ID * 448 (Attacker data 0x179)
0017ae20: 3c038019 lui r3,0x8019                                         |
0017ae24: 246308cc addiu r3,r3,0x08cc                                    |r3 = 0x801908cc
0017ae28: 00431821 addu r3,r2,r3                                         |r3 = Attacker target data pointer
0017ae2c: 90620047 lbu r2,0x0047(r3)                                     |r2 = Target X coord.
0017ae30: 00000000 nop                                                   |
0017ae34: a7a20024 sh r2,0x0024(r29)                                     |Store target X coord. on inner stack  (in place of Attacker 0x17a)
0017ae38: 90620048 lbu r2,0x0048(r3)                                     |r2 = Target Y coord.
0017ae3c: 00000000 nop                                                   |
0017ae40: a7a20028 sh r2,0x0028(r29)                                     |Store target Y coord. on inner stack  (in place of Attacker 0x17e)
0017ae44: 94620048 lhu r2,0x0048(r3)                                     |r2 = Target Y coord. + Target 0x49 (Half word)
0017ae48: 00000000 nop                                                   |
0017ae4c: 000213c2 srl r2,r2,0x0f                                        |r2 = Elevation bit (0 if not elevated, 1 if elevated)
0017ae50: a7a20026 sh r2,0x0026(r29)                                     |store Target elevation on inner stack  (in place of Attacker 0x17c)
0017ae54: 34100020 ori r16,r0,0x0020                                     |r16 = 0x20
                                             --- ALL---
0017ae58: 8651017a lh r17,0x017a(r18)                |r17 =Target X coord (from attacker data) Not modified by above section
0017ae5c: 8653017e lh r19,0x017e(r18)                |r19 = Target Y coord (from attacker data) Not modified by above section
0017ae60: 8654017c lh r20,0x017c(r18)                |r20 = Target elevation (from attacker data) Not modified by above section
0017ae64: 02202021 addu r4,r17,r0                    |r4 =Target X coord (from attacker data)
0017ae68: 02602821 addu r5,r19,r0                    |r5 = Target Y coord (from attacker data)
0017ae6c: 0c05f722 jal 0x0017dc88                    |-->Get ID of unit if tile is targetable returns r2 = Unit ID if tile is targetable
0017ae70: 02803021 addu r6,r20,r0                    |r6 = Target elevation (from attacker data)
0017ae74: 00403021 addu r6,r2,r0                     |r6 = target ID or < 0x00 (fail to find target) (from jal)
0017ae78: 04c10002 bgez r6,0x0017ae84                #If Tile is invalid or target is not found #branch if target found
0017ae7c: 32020010 andi r2,r16,0x0010                |r2 = 0x10 if Arc is checked in weapon data
0017ae80: 2406ffff addiu r6,r0,-0x01                     |r6 = -0x01
0017ae84: 10400005 beq r2,r0,0x0017ae9c              #If Weapon is arcing / Branch if not arcing (always false if not [Attack], [Charge] or [Default with weapon range flag]
0017ae88: 02a02021 addu r4,r21,r0                        |r4 = attacker ID
0017ae8c: 0c06bfc6 jal 0x001aff18                        |-->Set_and_Validate_Arc_Trajectory Return r2 = Target ID (-0x01 if trajectory ends in an obstacle)
0017ae90: 2645017a addiu r5,r18,0x017a                   |r5 = attacker unit data + 0x17a (target X coord)
0017ae94: 0805ebd0 j 0x0017af40                          >>Jump to green flag update skiping other weapon type
0017ae98: 00408021 addu r16,r2,r0                        |r16 = Target ID
0017ae9c: 32020020 andi r2,r16,0x0020                |r2 <> 0x00 if direct is checked
0017aea0: 10400018 beq r2,r0,0x0017af04              #Else If weapon is direct
0017aea4: 32020040 andi r2,r16,0x0040                |r2<> 0x00 if lunging
0017aea8: 92420047 lbu r2,0x0047(r18)                    |r2 = Attacker X coord.
0017aeac: 00000000 nop                                   |
0017aeb0: 02222023 subu r4,r17,r2                        |r4 = DeltaX (Target X coord-Attacker X coord )
0017aeb4: 04810002 bgez r4,0x0017aec0                    #If Delta X < 0x00
0017aeb8: 00000000 nop                                       | 
0017aebc: 00042023 subu r4,r0,r4                             |DeltaX = Absolute value of DeltaX
0017aec0: 92420048 lbu r2,0x0048(r18)                    |r2 = Attacker Y ccord.
0017aec4: 00000000 nop                                   |
0017aec8: 02621023 subu r2,r19,r2                        |r2 = Delta Y (Target Y coord-Attacker Y coord )
0017aecc: 04410002 bgez r2,0x0017aed8                    #If Delta Y < 0x00
0017aed0: 32c300ff andi r3,r22,0x00ff                    |r3 = last byte of last used skillset ID
0017aed4: 00021023 subu r2,r0,r2                             |r2 = Absolute value of DeltaY
0017aed8: 00822021 addu r4,r4,r2                         |r4 = DeltaX + DeltaY
0017aedc: 34020001 ori r2,r0,0x0001                      |r2 = 0x01
0017aee0: 14620003 bne r3,r2,0x0017aef0                  #If Action menu is Attack /Else avoid melee range check
0017aee4: 28820002 slti r2,r4,0x0002                     |r2 = 0x01 if Target is in melee range ( DeltaX + DeltaY <0x02)
0017aee8: 14400015 bne r2,r0,0x0017af40                      #If Target is not in melee range
0017aeec: 00c08021 addu r16,r6,r0                            |r16 = Target ID
0017aef0: 02a02021 addu r4,r21,r0                        #E      | r4 = Attacker ID
0017aef4: 0c06c206 jal 0x001b0818                                |-->001b0818_-_001b0a8c Might return r2 = Target ID (with obstacle calculation)
0017aef8: 2645017a addiu r5,r18,0x017a                           |r5 = Attacker data pointer 0x17a (Target X coord)
0017aefc: 0805ebd0 j 0x0017af40                                  >>Jump to green flag update skiping other weapon type
0017af00: 00408021 addu r16,r2,r0                                |r16 = Target ID
0017af04: 10400008 beq r2,r0,0x0017af28              #Else If weapon is lunging
0017af08: 02a02021 addu r4,r21,r0                        |r4 = Attacker ID
0017af0c: afa60010 sw r6,0x0010(r29)                     |Store target ID at stack 0x10
0017af10: 02202821 addu r5,r17,r0                        |r5 = Target X coord
0017af14: 02603021 addu r6,r19,r0                        |r6 = Target Y coord
0017af18: 0c05ebf0 jal 0x0017afc0                        |-->Auxilary_targeting_validation Might return r2 = Target ID (with obstacle calculation)
0017af1c: 02803821 addu r7,r20,r0                        |r7 = Target elevation
0017af20: 0805ebd0 j 0x0017af40                          >>Jump to green flag update skiping other weapon type
0017af24: 00408021 addu r16,r2,r0                        |r16 = Target ID
0017af28: afa60010 sw r6,0x0010(r29)                 #Else Store target ID at stack 0x10
0017af2c: 02202821 addu r5,r17,r0                        |r5 = Target X coord
0017af30: 02603021 addu r6,r19,r0                        |r6 = Target Y coord
0017af34: 0c05ecfd jal 0x0017b3f4                        |-->Height/coordinate_validation Returns r2 = Target ID
0017af38: 02803821 addu r7,r20,r0                        |r7 = Target elevation
0017af3c: 00408021 addu r16,r2,r0                        |r16 = Target ID
0017af40: 0c05ed28 jal 0x0017b4a0           >j       -->Disable_Green_Panel_Flags Disable flag 0x80 from all tiles 0x05 bytes
0017af44: 00000000 nop                               |
0017af48: 2e020015 sltiu r2,r16,0x0015               |r2 = 0x01 if Target ID < 0x15
0017af4c: 10400011 beq r2,r0,0x0017af94              #If Target ID is valid (< 0x15) /Else branch to end With r2 = 0x00
0017af50: 00001021 addu r2,r0,r0                     |r2 = 0x00
0017af54: 001020c0 sll r4,r16,0x03                       |r4 = Target ID * 8
0017af58: 00902023 subu r4,r4,r16                        |r4 = Target ID*7
0017af5c: 00042180 sll r4,r4,0x06                        |r4 = Target ID * 448 
0017af60: 3c028019 lui r2,0x8019                         |r2 = 0x80190000
0017af64: 244208cc addiu r2,r2,0x08cc                    |r2 = 0x801908cc (start of unit data)
0017af68: 0c060428 jal 0x001810a0                        |-->Map_Location_Calculation returns r2 = Target unit Tile ID
0017af6c: 00822021 addu r4,r4,r2                         |r4 = Start of Target unit data 0x801908cc + Unit offset
0017af70: 000210c0 sll r2,r2,0x03                        |r2 = Target Tile ID * 8
0017af74: 3c038019 lui r3,0x8019                         |r3 = 0x80190000
0017af78: 2463f8cc addiu r3,r3,-0x0734                   |r3 = 0x8018f8cc (Start of Tiles data)
0017af7c: 00431021 addu r2,r2,r3                         |r2 = Start of Target Tile data (0x8018f8cc + Tile offset)
0017af80: 90430005 lbu r3,0x0005(r2)                     |r3 = Target Tile 0x05 byte
0017af84: 00000000 nop                                   |
0017af88: 34630080 ori r3,r3,0x0080                      |r3 = Target Tile 0x05 byte with flag 0x80 enabled
0017af8c: a0430005 sb r3,0x0005(r2)                      |Store updated target Tile 0x05 byte with 0x80 enabled
0017af90: 00001021 addu r2,r0,r0                         |r2 = 0x00
0017af94: 8fbf004c lw r31,0x004c(r29)            END
0017af98: 8fb60048 lw r22,0x0048(r29)            
0017af9c: 8fb50044 lw r21,0x0044(r29)            
0017afa0: 8fb40040 lw r20,0x0040(r29)            
0017afa4: 8fb3003c lw r19,0x003c(r29)            
0017afa8: 8fb20038 lw r18,0x0038(r29)            
0017afac: 8fb10034 lw r17,0x0034(r29)            
0017afb0: 8fb00030 lw r16,0x0030(r29)            
0017afb4: 27bd0050 addiu r29,r29,0x0050          
0017afb8: 03e00008 jr r31                        
0017afbc: 00000000 nop

Summary

Check Attacker ID (<0x15 and not 0x00ff) - If not OK Exit with r2 = -0x01

1st Skillset Action menu
    - For Default and monster - check the [weapon range] flag of the ability
 
2nd Skillset Action menu check : 
    - Attack, Charge or Default + [weapon range] or monster + [weapon range] 
             - Choose right or left hand weapon 
             - 0x00 if Monster or frog
             - Right weapon ID if exists else left. (Not a shield checked)
             - Load Item secondary data attack type (arcing, direct and lunging will have specific routines)
    - Else 
             - Force Attack to a direct flag
             - If Attacker 0x178 = 0x06 (Target-Specific Ability?)
                    - Check Target ID validity - if not OK, exit with r2 = -0x01
                    - Update Target Coord on stack 0x24 0x28 and 0x26 (not found for which purpose)                          

Weapon attack type check
    - Arcing weapon : set trajectory and update target if obstacle
    - Direct trajectory : not investigated, return a Target ID (might check obstacle)
    - Lunging :  - check if Target is close to attacker 
                         if not : routine not investigated, return a Target ID (might check obstacle)
    - Else check Attacker and target delta height	: Target invalided if difference is too high

Disable all tiles green flag (Tile 0x05 byte, flag 0x80)
If target ID is valid : enable green flag of target tile

Return locations

Battle.bin
0017cde4: Map_calculations_for_attack
0017e010: Big..._Contains_Hamedo_check