Check AI Target Type (00196adc)

From Final Fantasy Hacktics Wiki
Jump to navigation Jump to search
BATTLE.BIN :  - Check_AI_Target_Type_(00196adc)
Reset and refill AI Table at 0x8019f3c4 + 0a74 + 0xe2d offset if Tiles are reachable and match preset value condition)
------------------------------------------------------------------------------------------
Parameter : r4
Return : r2 = 0x1 if at least one tile meet the conditions
         r2 = x00 if no tiles found
------------------------------------------------------------------------------------------
00196adc: 27bdffd0 addiu r29,r29,-0x0030     |
00196ae0: afb10024 sw r17,0x0024(r29)        |
00196ae4: 00808821 addu r17,r4,r0            |r17 = Ability/Move Range
00196ae8: afb00020 sw r16,0x0020(r29)        |
00196aec: 00008021 addu r16,r0,r0            |
00196af0: 3c05801a lui r5,0x801a             |
00196af4: 24a5f3c4 addiu r5,r5,-0x0c3c       |0x8019f3c4
00196af8: 00003021 addu r6,r0,r0             |reset Y row counter
00196afc: afbf0028 sw r31,0x0028(r29)        |
                                            @Loop - Initialize Tile's Data at AI Table  (AI 0xa74 + 0xe2d offset)
00196b00: 90a30e2d lbu r3,0x0e2d(r5)             |Load AI 0xe2d Offset for some Tile's Table
00196b04: 00062040 sll r4,r6,0x01                |This iteration Y * 2
00196b08: 000310c0 sll r2,r3,0x03                |
00196b0c: 00431021 addu r2,r2,r3                 |
00196b10: 000210c0 sll r2,r2,0x03                |0xe2d * 0x48
00196b14: 00a21021 addu r2,r5,r2                 |
00196b18: 00821021 addu r2,r4,r2                 |Dynamic pointer to this Y row in Table 0xa74 (matching 0xe2d) Low elevation
00196b1c: a4400a74 sh r0,0x0a74(r2)              |
00196b20: 90a30e2d lbu r3,0x0e2d(r5)             |Load AI 0xe2d
00196b24: 24c60001 addiu r6,r6,0x0001            |Y counter + 1
00196b28: 000310c0 sll r2,r3,0x03                |
00196b2c: 00431021 addu r2,r2,r3                 |
00196b30: 000210c0 sll r2,r2,0x03                |0xe2d * 0x48
00196b34: 00a21021 addu r2,r5,r2                 |
00196b38: 00822021 addu r4,r4,r2                 |
00196b3c: 28c20012 slti r2,r6,0x0012             |
00196b40: 1440ffef bne r2,r0,0x00196b00      Λ Do 18 (0x12) times
00196b44: a4800a98 sh r0,0x0a98(r4)              |Dynamic pointer to this Y row in Table 0xa74 (matching 0xe2d) High elevation elevation

00196b48: 0000c821 addu r25,r0,r0            |Reset elevation counter
00196b4c: 00a0c021 addu r24,r5,r0            |0x8019f3c4
00196b50: 00a07821 addu r15,r5,r0            |0x8019f3c4
00196b54: 00007021 addu r14,r0,r0            |Initial elevation offset
                                            @LOOP  - Both elevation
00196b58: 90a20e3b lbu r2,0x0e3b(r5)             |Map max Y
00196b5c: 00000000 nop                           |
00196b60: 18400032 blez r2,0x00196c2c            #If Max Y is invalid : branch to  Next Elevation iteration
00196b64: 00004021 addu r8,r0,r0                 |Reset Y counter
00196b68: 01c06821 addu r13,r14,r0               |Elevation offset (0x24)
00196b6c: 00004821 addu r9,r0,r0                 |
00196b70: 270b03b4 addiu r11,r24,0x03b4          |Dynamic pointer to 0x8019f3c4 + 0x3b4   (+ elevation offset)
00196b74: 25ea0a74 addiu r10,r15,0x0a74          |Dynamic pointer to 0x8019f3c4 + 0xa074 + elevation offset  (offset 0x00 - not based on 0xe2d)
                                                @LOOP - All Y Rows
00196b78: 95430000 lhu r3,0x0000(r10)                |This Y Row halfword of flags  (offset 0x00 - not based on 0xe2d)
00196b7c: 00000000 nop                               |
00196b80: 10600023 beq r3,r0,0x00196c10              #If All Flags are OFF : branch to  Next Y
00196b84: 00000000 nop                                   |
00196b88: 90a20e3a lbu r2,0x0e3a(r5)                 |Map Max X
00196b8c: 00000000 nop                               |
00196b90: 1840001f blez r2,0x00196c10                #If Max X is invalid : branch to  Next Y
00196b94: 00003021 addu r6,r0,r0                     |Reset X counter
00196b98: 00606021 addu r12,r3,r0                    |Pass Y row's flags
00196b9c: 01603821 addu r7,r11,r0                    |Dynamic pointer to 0x8019f3c4 + 0x3b4   (+ elevation offset + Y offset) Will Take X offset at each X iteration

                                                    @LOOP - All X tiles in Y Rows
00196ba0: 00cc1004 sllv r2,r12,r6                        |This Tile bit is in 0x8000 position
00196ba4: 30428000 andi r2,r2,0x8000                     |
00196ba8: 10400014 beq r2,r0,0x00196bfc                  #if this Tile is not reachable : branch to  Next X
00196bac: 00000000 nop                                   |
00196bb0: 90e20000 lbu r2,0x0000(r7)                     |This Tile distance to Acting unit's Target
00196bb4: 00000000 nop                                   |
00196bb8: 0222102a slt r2,r17,r2                         |0x1 if Preset Value < this Tile distance to Target
00196bbc: 1440000f bne r2,r0,0x00196bfc                  #if Target is above Preset Value : branch to  Next X
00196bc0: 00000000 nop                                   |
00196bc4: 90a30e2d lbu r3,0x0e2d(r5)                     |Load 0xe2d
00196bc8: 34100001 ori r16,r0,0x0001                     |1 Tile in range Flag
00196bcc: 000310c0 sll r2,r3,0x03                        |
00196bd0: 00431021 addu r2,r2,r3                         |
00196bd4: 000210c0 sll r2,r2,0x03                        |0xe2d Offset (0x48)
00196bd8: 00451021 addu r2,r2,r5                         |
00196bdc: 24420a74 addiu r2,r2,0x0a74                    |0x8019f3c4 + 0xa74 + 0xe2d offset
00196be0: 01a21021 addu r2,r13,r2                        |+Elevation offset
00196be4: 01221021 addu r2,r9,r2                         |+Y offset
00196be8: 34038000 ori r3,r0,0x8000                      |Prepare Bitmask
00196bec: 94440000 lhu r4,0x0000(r2)                     |Load this Tile's Y row's flags
00196bf0: 00c31807 srav r3,r3,r6                         |This Tile Bitmask
00196bf4: 00832025 or r4,r4,r3                           |
00196bf8: a4440000 sh r4,0x0000(r2)                      |Enable this Tile flag
00196bfc: 90a20e3a lbu r2,0x0e3a(r5)                     |Map Max X
00196c00: 24c60001 addiu r6,r6,0x0001                    |X counter + 1
00196c04: 00c2102a slt r2,r6,r2                          |
00196c08: 1440ffe5 bne r2,r0,0x00196ba0              Λ Loop while X < max X
00196c0c: 24e70001 addiu r7,r7,0x0001                    |Dynamic pointer to 0x8019f3c4 + 0x3b4  (+0x01 each X iteration)
00196c10: 25290002 addiu r9,r9,0x0002                |Dynamic pointer to 0x8019f3c4 + 0xa074 + 0x2ed offset (+0x2 each Y iteration)
00196c14: 256b0010 addiu r11,r11,0x0010              |Dynamic pointer to 0x8019f3c4 + 0x3b4   (+0x10 each Y iteration) 0x10 each iteration
00196c18: 90a20e3b lbu r2,0x0e3b(r5)                 |Map Max Y
00196c1c: 25080001 addiu r8,r8,0x0001                |Y counter +1
00196c20: 0102102a slt r2,r8,r2                      |
00196c24: 1440ffd4 bne r2,r0,0x00196b78          Λ Loop while Y counter < Max Y
00196c28: 254a0002 addiu r10,r10,0x0002              |Dynamic pointer to 0x8019f3c4 + 0xa074  (+0x2 each Y iteration) Table at offset 0x00
00196c2c: 27180120 addiu r24,r24,0x0120          |Elevation offset for Table 0x3b4
00196c30: 25ef0024 addiu r15,r15,0x0024          |Elevation offset for Table 0xa74
00196c34: 27390001 addiu r25,r25,0x0001          |Elevation counter +1
00196c38: 2b220002 slti r2,r25,0x0002            |
00196c3c: 1440ffc6 bne r2,r0,0x00196b58      Λ Loop 2 times
00196c40: 25ce0024 addiu r14,r14,0x0024          |Elevation offset

00196c44: 1600000b bne r16,r0,0x00196c74     #If At least One Tile Matches the Preset conditions Exit  Returns 0x01
00196c48: 34020001 ori r2,r0,0x0001              |
                                            Else : No Tiles Found
00196c4c: 90a20e2d lbu r2,0x0e2d(r5)             |Laod 0xe2d
00196c50: 34060048 ori r6,r0,0x0048              |Send Size of data
00196c54: 000220c0 sll r4,r2,0x03                |
00196c58: 00822021 addu r4,r4,r2                 |
00196c5c: 000420c0 sll r4,r4,0x03                |0xe2d Offset (0x48)
00196c60: 24840a74 addiu r4,r4,0x0a74            |
00196c64: 00a42021 addu r4,r5,r4                 |0x8019f3c4 + 0xa74 + 0x2ed offset
00196c68: 0c066ac2 jal 0x0019ab08                |-->Transfer Halfword Values Transfer data from r5 to r4
00196c6c: 24a50a74 addiu r5,r5,0x0a74            |0x8019f3c4 + 0xa74
00196c70: 00001021 addu r2,r0,r0                 |Return 0x00
00196c74: 8fbf0028 lw r31,0x0028(r29)
00196c78: 8fb10024 lw r17,0x0024(r29)
00196c7c: 8fb00020 lw r16,0x0020(r29)
00196c80: 27bd0030 addiu r29,r29,0x0030
00196c84: 03e00008 jr r31
00196c88: 00000000 nop

Return locations

BATTLE.BIN
 00196680: Map_movement_decision/data_setting   Condition Value = Target distance -1 (one case)
 00198420: 001982d8_-_001984e8