Reaction Target/Hit Calculation

From Final Fantasy Hacktics Wiki
Jump to navigation Jump to search
Set Targets number and targets ID list for most of reaction abilities (except counter abilities and auto potion - not supported here and flag 0x08 enabled)
------------------------------------------------------------------------------
Parameters: r5 = Attacker misc action data (misc 0x18c) r4 = Attacker ID	
            r6 = Main ability inner stack pointer 1 (r29 0x28)	
            r7 = Main ability inner stack pointer 2 (r29 0x10) 
 	
Returns :   r2 = 0x01 if reaction is reflect distribute or damage split (failed or not) 	
            r2 = 0x01 if other reaction with flag 0x04 enabled	
            r2 = 0x00 if other reaction with flag 0x08 enabled
	
Store :     If Reflect : Target coordinates in misc attacker data 0x1c 0x1d 0x1e 
            List of targets ID at previous routine r29 0x10
            Number of units hitted at previous routine r29 0x28
------------------------------------------------------------------------------
0017cacc: 27bdffd0 addiu r29,r29,0xffd0     |
0017cad0: 00a04021 addu r8,r5,r0            |r8 = Attacker misc action data (misc 0x18c)
0017cad4: afb1001c sw r17,0x001c(r29)       |
0017cad8: 00c08821 addu r17,r6,r0           |r17 = Stack Pointer 1 
0017cadc: afb20020 sw r18,0x0020(r29)       |
0017cae0: 00e09021 addu r18,r7,r0           |r18 = Stack Pointer 2
0017cae4: 000410c0 sll r2,r4,0x03           |r2 = Attacker ID *8
0017cae8: 00441023 subu r2,r2,r4            |r2 = Attacker ID *7
0017caec: 00021180 sll r2,r2,0x06           |r2 = Attacker ID *448  - = 0x1c0 (size of units data)
0017caf0: afb30024 sw r19,0x0024(r29)       |
0017caf4: 3c138019 lui r19,0x8019           |
0017caf8: 267308cc addiu r19,r19,0x08cc     |r19 = 0x801908cc (start of 1st unit data)
0017cafc: 00533821 addu r7,r2,r19           |r7 = Attacker data pointer
0017cb00: 3c038019 lui r3,0x8019            |
0017cb04: 84632d9c lh r3,0x2d9c(r3)         |r3 = Reaction ID
0017cb08: 340201bc ori r2,r0,0x01bc         |r2 = 0x01bc (distribute ability ID)
0017cb0c: afbf0028 sw r31,0x0028(r29)       |
0017cb10: 1062002a beq r3,r2,0x0017cbbc     #If Reaction ID <> Distribute /Else branch to distribute section
0017cb14: afb00018 sw r16,0x0018(r29)            |  
0017cb18: 286201bd slti r2,r3,0x01bd             |r2 = 1 if reaction ID < 0x1bd (MP switch ID)
0017cb1c: 10400005 beq r2,r0,0x0017cb34          #If reaction ID < MP switch
0017cb20: 340201b8 ori r2,r0,0x01b8                  |r2 = 0x1b8 (reflect ID)
0017cb24: 10620008 beq r3,r2,0x0017cb48              #If Reaction ID <> reflect /Else branch to reflect section
0017cb28: 00000000 nop                                   |  
0017cb2c: 0805f330 j 0x0017ccc0                          >>Jump to Other reaction section
0017cb30: 00000000 nop                                   |
0017cb34: 340201be ori r2,r0,0x01be              #Else - Reaction >= MP switch r2 = 0x1be (Damage split ID)
0017cb38: 10620051 beq r3,r2,0x0017cc80          #If reaction ID <> Damage split / Else branch to Damage split section
0017cb3c: 00000000 nop                               |  
0017cb40: 0805f330 j 0x0017ccc0                      >>Jump to Other reaction section
0017cb44: 00000000 nop                               |

                                            --- REFLECT SECTION ---
0017cb48: 90e4017a lbu r4,0x017a(r7)        |r4 = Attacker current action (ACA) Target tile X (position)
0017cb4c: 00000000 nop                      |
0017cb50: a104001c sb r4,0x001c(r8)         |Store ACA Target tile pos. X in Attacker misc. Current action tile pos. X
0017cb54: 90e5017e lbu r5,0x017e(r7)        |r5 = Attacker current action (ACA) Target tile Y (position)
0017cb58: 00000000 nop                      |
0017cb5c: a105001d sb r5,0x001d(r8)         |Store ACA Target tile pos. Y in Attacker misc. Current action tile pos. Y
0017cb60: 90e6017c lbu r6,0x017c(r7)        |r6 = Attacker current action (ACA) Target tile elevation
0017cb64: 0c05f722 jal 0x0017dc88           |-->Get_ID_of_Unit_if_Tile_is_Targetable retruns r2 = Unit ID if Theres a unit at coordinates / Else r2 < 0x00
0017cb68: a106001e sb r6,0x001e(r8)         |Store ACA Target tile elevation in Attacker misc. Current action tile elevation Store Target's Map Level
0017cb6c: 00408021 addu r16,r2,r0           |r16 = Target ID (or -0x01 if no units or -0x02 if coordinates are invalid)
0017cb70: 06000062 bltz r16,0x0017ccfc      #If Target is valid /Else jump to near end setting 0x00 on stack pointer 1 (hit counter) - r2 will be set to 0x01
0017cb74: 001010c0 sll r2,r16,0x03               |ID * 8
0017cb78: 00501023 subu r2,r2,r16                |ID * 7
0017cb7c: 00021180 sll r2,r2,0x06                |ID * 448 (0x1c0)
0017cb80: 00532821 addu r5,r2,r19                |r5 = Target's Data Pointer
0017cb84: 90a30182 lbu r3,0x0182(r5)             |r3 = Target mount info
0017cb88: 00000000 nop                           |
0017cb8c: 30620040 andi r2,r3,0x0040             |r2 = 0x40 if target is been ridden / Else 0x00
0017cb90: 10400003 beq r2,r0,0x0017cba0          #If target is being ridden /Else branch with r4 = Target ID
0017cb94: 02002021 addu r4,r16,r0                |r4 = Target ID
0017cb98: 3070001f andi r16,r3,0x001f                |r16 = Target Rider ID
0017cb9c: 02002021 addu r4,r16,r0                    |r4 = Target Rider ID
0017cba0: 0c05ef74 jal 0x0017bdd0                |-->Check_if_Unit_can_be_Targeted -returns r2 = 0x00 if unit can be targeted (else 0x01)
0017cba4: 27a50010 addiu r5,r29,0x0010           |r5 = Stack pointer for above jal  (routine will store here Target Tile ID - no use here ?)
0017cba8: 14400054 bne r2,r0,0x0017ccfc          #If Unit can be targeted /Else jump to near end setting 0x00 on stack pointer 1 (hit counter) - r2 will be set to 0x01
0017cbac: 34020001 ori r2,r0,0x0001                  |r2 = 0x01
0017cbb0: ae220000 sw r2,0x0000(r17)                 |Store 0x01 at stack pointer 1 (number of target ?)
0017cbb4: 0805f341 j 0x0017cd04                      >>Jump to End - r2 set to 0x01
0017cbb8: a2500000 sb r16,0x0000(r18)                |Store unit ID  on previous routine stack pointer 2

                                            --- Distribute section ---
0017cbbc: 00008021 addu r16,r0,r0           |r16 = 0x00 (will be hit counter)
0017cbc0: 00003021 addu r6,r0,r0            |r6 = 0x00 (will be routine counter)
0017cbc4: 340a00ff ori r10,r0,0x00ff        |r10 = 0xff
0017cbc8: 02604021 addu r8,r19,r0           |r8 = 1st Unit Data Pointer (0x801908cc)
0017cbcc: 90e20005 lbu r2,0x0005(r7)        |r2 = Attacker ENTD flags
0017cbd0: 02403821 addu r7,r18,r0           |r7 = Stack pointer 2 (list of units targeted (ID))
0017cbd4: 30490030 andi r9,r2,0x0030        |r9 = Attacker Unit's Team (filtered from ENTD byte)
0017cbd8: 10c40021 beq r6,r4,0x0017cc60     @LOOP  #If Counter <> acting unit ID /Else branch to next loop iteration Check all units
0017cbdc: 01002821 addu r5,r8,r0                     |r5 = Unit Data Pointer (r8 gains 0x1c0 each loop iteration)
0017cbe0: 90a20001 lbu r2,0x0001(r5)                 |r2 = Unit's ID
0017cbe4: 00000000 nop                               |
0017cbe8: 104a001d beq r2,r10,0x0017cc60             #If Unit's ID <> 0xff (unit exists) /Else branch to next loop iteration
0017cbec: 00000000 nop                                   | 
0017cbf0: 90a20182 lbu r2,0x0182(r5)                     |r2 = Unit's Mount info
0017cbf4: 00000000 nop                                   |
0017cbf8: 30420040 andi r2,r2,0x0040                     |r2 = 0x40 if unit is being ridden
0017cbfc: 14400018 bne r2,r0,0x0017cc60                  #If Unit is not ridden (?) /Else branch to next loop iteration
0017cc00: 00000000 nop                                       | 
0017cc04: 94a30028 lhu r3,0x0028(r5)                         |r3 = Unit's Current HP
0017cc08: 94a2002a lhu r2,0x002a(r5)                         |r2 =  Unit's Max HP
0017cc0c: 00000000 nop                                       |
0017cc10: 10620013 beq r3,r2,0x0017cc60                      #If Unit is not at Max HP /Else branch to next loop iteration
0017cc14: 00000000 nop                                           | 
0017cc18: 90a20058 lbu r2,0x0058(r5)                             |r2 = Unit's Current Statuses 1
0017cc1c: 00000000 nop                                           |
0017cc20: 30420064 andi r2,r2,0x0064                             |r2 <> 0x00 if unit has dead, crystal or is jumping
0017cc24: 1440000e bne r2,r0,0x0017cc60                          #If Unit has neither dead, crystal nor jump /Else branch to next loop iteration
0017cc28: 00000000 nop                                               | 
0017cc2c: 90a20059 lbu r2,0x0059(r5)                                 |r2 =  Unit's Current Statuses 2
0017cc30: 00000000 nop                                                   | 
0017cc34: 30420081 andi r2,r2,0x0081                                     |r2 <> 0x00 if unit has petrify or treasure
0017cc38: 14400009 bne r2,r0,0x0017cc60                                  #If unit has neither petrify nor treasure /Else branch to next loop iteration
0017cc3c: 00000000 nop                                                       | 
0017cc40: 90a201ba lbu r2,0x01ba(r5)                                         |r2 = Unit's modified ENTD flags ( 0x1ba )
0017cc44: 00000000 nop                                                       |
0017cc48: 30420030 andi r2,r2,0x0030                                         |r2 = Unit's team
0017cc4c: 14490004 bne r2,r9,0x0017cc60                                      #If unit's team = attacker team /Else branch to next loop iteration
0017cc50: afa20010 sw r2,0x0010(r29)                                         |Store unit team to stack (r29 0x10) (why ? It's unused…)
0017cc54: a0e60000 sb r6,0x0000(r7)                                              |Store counter (= unit ID) in stack pointer 2 + offset  (each time a unit is stored, r7 gain 0x01)
0017cc58: 24e70001 addiu r7,r7,0x0001                                            |r7 = Stack pointer + 0x01
0017cc5c: 26100001 addiu r16,r16,0x0001                                          |r16 = Hit counter + 0x01 (number of unit stored in r7)
0017cc60: 24c60001 addiu r6,r6,0x0001            |r6 = Loop counter + 0x01
0017cc64: 28c20015 slti r2,r6,0x0015             |r2 = 0x01 if loop counter < 0x15
0017cc68: 1440ffdb bne r2,r0,0x0017cbd8     Λ Loop while counter < 0x15
0017cc6c: 250801c0 addiu r8,r8,0x01c0            |r8 = Unit data pointer += 0x1c0  (used in loop)
0017cc70: 3c018019 lui r1,0x8019            | 
0017cc74: ac303878 sw r16,0x3878(r1)        |Store number of units hitted at 0x80193878
0017cc78: 0805f340 j 0x0017cd00             >>Jump to End  r2 will be set to 0x01
0017cc7c: ae300000 sw r16,0x0000(r17)       |Store number of units hitted on stack pointer 1

                                            --- Damage split section ---
0017cc80: 3c038019 lui r3,0x8019            |
0017cc84: 8c63f8c8 lw r3,-0x0738(r3)        |r3 =  Acting Unit's ID
0017cc88: 00000000 nop                      |
0017cc8c: 000310c0 sll r2,r3,0x03           |r2 =  Acting Unit's ID *8 ID * 8
0017cc90: 00431023 subu r2,r2,r3            |r2 =  Acting Unit's ID *7 ID * 7
0017cc94: 00021180 sll r2,r2,0x06           |r2 =  Acting Unit's ID *448 ID * 448
0017cc98: 00532821 addu r5,r2,r19           |r5 = Acting Unit's Data Pointer r5 = Unit's Data Pointer
0017cc9c: 90a30001 lbu r3,0x0001(r5)        |r3 = Acting unit ID (?) Load Unit's ID
0017cca0: 340200ff ori r2,r0,0x00ff         |r2 = 0xff
0017cca4: 10620015 beq r3,r2,0x0017ccfc     #If acting unit exists /Else jump to near end setting 0x00 on stack pointer 1 (hit counter) - r2 will be set to 0x01
0017cca8: 34020001 ori r2,r0,0x0001              |r2 = 0x01
0017ccac: ae220000 sw r2,0x0000(r17)             |Store 0x01 on stack pointer 1 (1 unit hit)
0017ccb0: 3c028019 lui r2,0x8019                 |
0017ccb4: 9042f8c8 lbu r2,-0x0738(r2)            |r2 = Acting unit ID
0017ccb8: 0805f340 j 0x0017cd00                  >>Jump to End  r2 will be set to 0x01
0017ccbc: a2420000 sb r2,0x0000(r18)             |Store Acting unit ID on Stack 2 (hitted unit ID list)

                                            --- Other Reactions ---
0017ccc0: 3c028019 lui r2,0x8019            |
0017ccc4: 84422d9c lh r2,0x2d9c(r2)         |r2 = Reaction ID
0017ccc8: 3c018006 lui r1,0x8006            |
0017cccc: 00220821 addu r1,r1,r2            |
0017ccd0: 9023ea2a lbu r3,-0x15d6(r1)       |r3 = Reaction Flags -->Reaction_Flags
0017ccd4: 00000000 nop                      |
0017ccd8: 30620004 andi r2,r3,0x0004        |r2 = 0x04 if this flag is enabled (target self ?)
0017ccdc: 10400004 beq r2,r0,0x0017ccf0     #If self targetting is enabled /Else skip #Branch if ? doesn't have 0x4
0017cce0: 34020001 ori r2,r0,0x0001              |r2 = 0x01 
0017cce4: ae220000 sw r2,0x0000(r17)             |Store 0x01 on stack pointer 1 (1 unit hit) Store #Targets = 1
0017cce8: 0805f341 j 0x0017cd04                  >>Jump to End  r2 will is set to 0x01
0017ccec: a2440000 sb r4,0x0000(r18)             |Store Attacker ID on Stack 2 (hitted unit ID) Store ID on Stack 3
0017ccf0: 30620008 andi r2,r3,0x0008        |r2 = 0x08 is enabled (counter ?)
0017ccf4: 14400003 bne r2,r0,0x0017cd04     #If 0x08 isn't enabled / Else Branch to end with r2 = 0x00 (and nothing stored on stack pointer 1)
0017ccf8: 00001021 addu r2,r0,r0            |r2 = 0x00
0017ccfc: ae200000 sw r0,0x0000(r17)             |Store 0x00 on stack pointer 1 (0 units hitted)
0017cd00: 34020001 ori r2,r0,0x0001              |r2 = 0x01
0017cd04: 8fbf0028 lw r31,0x0028(r29)       #END
0017cd08: 8fb30024 lw r19,0x0024(r29)       
0017cd0c: 8fb20020 lw r18,0x0020(r29)       
0017cd10: 8fb1001c lw r17,0x001c(r29)       
0017cd14: 8fb00018 lw r16,0x0018(r29)       
0017cd18: 27bd0030 addiu r29,r29,0x0030     
0017cd1c: 03e00008 jr r31                   
0017cd20: 00000000 nop

Return location

0017cf34: Main_ability_loading_routine?