Difference between revisions of "Check if Unit can be Targeted (Cryst/Trea/Mount/Trans)"

From Final Fantasy Hacktics Wiki
Jump to navigation Jump to search
(Created page with " 00196ce8: 3c06801a lui r6,0x801a 00196cec: 24c6f3c4 addiu r6,r6,0xf3c4 r6 = AI Data Pointer 00196cf0: 000410c0 sll r2,r4,0x03 Unit ID * 8 00196cf4: 00441023 subu r2,r2,...")
 
 
Line 1: Line 1:
 
+
BATTLE.BIN : Check if Unit can be Targeted (Cryst/Trea/Mount/Trans)
  00196ce8: 3c06801a lui r6,0x801a
+
------------------------------------------------------------------------------------------
  00196cec: 24c6f3c4 addiu r6,r6,0xf3c4 r6 = AI Data Pointer
+
Parameters - r4 : Unit ID
  00196cf0: 000410c0 sll r2,r4,0x03 Unit ID * 8
+
  00196cf4: 00441023 subu r2,r2,r4 ID * 7
+
Returns r2 = 0x00 if Unit can be hitted/targeted
  00196cf8: 00021180 sll r2,r2,0x06 ID * 448
+
        r2 = 0x01 if Unit can't be targeted (Crystal, Treasure, Ridden, Enemy Transparent)
  00196cfc: 3c038019 lui r3,0x8019
+
  00196d00: 246308cc addiu r3,r3,0x08cc
+
Note : There is a weird control of transparent unit riding a transparent unit.
  00196d04: 00432821 addu r5,r2,r3 r5 = Unit's Data Pointer
+
-----------------------------------------------------------------------------------------
  00196d08: 90a30001 lbu r3,0x0001(r5) Load Unit's ID
+
  00196ce8: 3c06801a lui r6,0x801a           |
  00196d0c: 340200ff ori r2,r0,0x00ff
+
  00196cec: 24c6f3c4 addiu r6,r6,0xf3c4       |{{f/std|<nowiki>r6 = AI Data Pointer</nowiki>}}
  00196d10: 10620025 beq r3,r2,0x00196da8 Branch if Unit doesn't exist
+
  00196cf0: 000410c0 sll r2,r4,0x03           |{{f/std|ID * 8}}
  00196d14: 34020001 ori r2,r0,0x0001 r2 = 1 (Fail)
+
  00196cf4: 00441023 subu r2,r2,r4           |{{f/std|ID * 7}}
  00196d18: 94a20058 lhu r2,0x0058(r5) Load Current Statuses 1+2
+
  00196cf8: 00021180 sll r2,r2,0x06           |{{f/std|Unit ID * 0x1c0}}
  00196d1c: 00000000 nop
+
  00196cfc: 3c038019 lui r3,0x8019           |
  00196d20: 30420140 andi r2,r2,0x0140
+
  00196d00: 246308cc addiu r3,r3,0x08cc       |
  00196d24: 14400020 bne r2,r0,0x00196da8 Branch if Unit has Crystal/Treasure
+
  00196d04: 00432821 addu r5,r2,r3           |{{f/adr|<nowiki>r5 = Unit's Data Pointer</nowiki>}}
  00196d28: 34020001 ori r2,r0,0x0001 r2 = 1 (Fail)
+
  00196d08: 90a30001 lbu r3,0x0001(r5)       |{{f/load|Load Unit's ID}}
  00196d2c: 90a30182 lbu r3,0x0182(r5) Load Unit's Mount Info
+
  00196d0c: 340200ff ori r2,r0,0x00ff         |
  00196d30: 00000000 nop
+
  00196d10: 10620025 beq r3,r2,0x00196da8     {{f/Cond|If Unit doesn't exists : }} {{f/loc|<nowiki>Returns r2 = 0x01</nowiki>}}
  00196d34: 30620040 andi r2,r3,0x0040
+
  00196d14: 34020001 ori r2,r0,0x0001         |
  00196d38: 1440001b bne r2,r0,0x00196da8 Branch if Unit is a Mount
+
  00196d18: 94a20058 lhu r2,0x0058(r5)       |{{f/load|Load Current Statuses 1+2}}
  00196d3c: 34020001 ori r2,r0,0x0001 r2 = 1 (Fail)
+
  00196d1c: 00000000 nop                     |
  00196d40: 00041100 sll r2,r4,0x04 ID * 16
+
  00196d20: 30420140 andi r2,r2,0x0140       |{{f/std|Check [Crystal] and [Treasure]}}
  00196d44: 00461021 addu r2,r2,r6
+
  00196d24: 14400020 bne r2,r0,0x00196da8     {{f/Cond|If Unit is Crystal or Treasure:}} {{f/loc|<nowiki>Returns r2 = 0x01</nowiki>}}
  00196d48: 90421834 lbu r2,0x1834(r2) Load ?
+
  00196d28: 34020001 ori r2,r0,0x0001         |
  00196d4c: 00000000 nop
+
  00196d2c: 90a30182 lbu r3,0x0182(r5)       |{{f/load|Load Unit's Mount Info}}
  00196d50: 10400015 beq r2,r0,0x00196da8 Branch if ? = 0
+
  00196d30: 00000000 nop                     |
  00196d54: 00001021 addu r2,r0,r0 r2 = 0 (Success)
+
  00196d34: 30620040 andi r2,r3,0x0040       |{{f/std|Check [Being Ridden]}}
  00196d58: 90a2005a lbu r2,0x005a(r5) Load Current Statuses 3
+
  00196d38: 1440001b bne r2,r0,0x00196da8     {{f/Cond|If Unit is a mount :}} {{f/loc|<nowiki>Returns r2 = 0x01</nowiki>}}
  00196d5c: 00000000 nop
+
  00196d3c: 34020001 ori r2,r0,0x0001         |
  00196d60: 30420010 andi r2,r2,0x0010
+
  00196d40: 00041100 sll r2,r4,0x04           |{{f/std|Unit ID * 16}}
  00196d64: 1040000f beq r2,r0,0x00196da4 Branch if Unit isn't Transparent
+
  00196d44: 00461021 addu r2,r2,r6           |{{f/adr|8019f3c4 + Unit Offset}}
  00196d68: 30620080 andi r2,r3,0x0080
+
  00196d48: 90421834 lbu r2,0x1834(r2)       |{{f/load|Load Enemy flag}} {{f/std| 8019f3c4 + 0x182c + 0x08 + Unit offset}}
  00196d6c: 1040000b beq r2,r0,0x00196d9c Branch if Unit isn't Riding a unit
+
  00196d4c: 00000000 nop                     |
  00196d70: 3062000f andi r2,r3,0x000f r2 = Mount ID
+
  00196d50: 10400015 beq r2,r0,0x00196da8     {{f/Cond|If This Unit has the enemy flag}} '''/Else :''' {{f/loc|<nowiki>Returns r2 = 0x00</nowiki>}}
  00196d74: 000218c0 sll r3,r2,0x03 ID * 8
+
  00196d54: 00001021 addu r2,r0,r0               |
  00196d78: 00621823 subu r3,r3,r2 ID * 7
+
  00196d58: 90a2005a lbu r2,0x005a(r5)           |{{f/load|Load Current Statuses 3}}
  00196d7c: 00031980 sll r3,r3,0x06 ID * 448
+
  00196d5c: 00000000 nop                         |
  00196d80: 3c018019 lui r1,0x8019
+
  00196d60: 30420010 andi r2,r2,0x0010           |{{f/std|Check [Transparent]}}
  00196d84: 00230821 addu r1,r1,r3
+
  00196d64: 1040000f beq r2,r0,0x00196da4         {{f/Cond|If Unit is transparent :}} '''/Else :''' {{f/loc|<nowiki>Returns r2 = 0x00</nowiki>}}
  00196d88: 90220926 lbu r2,0x0926(r1) Load Mount's Current Statuses 3
+
  00196d68: 30620080 andi r2,r3,0x0080               |{{f/std|Check [Is riding]}}
  00196d8c: 00000000 nop
+
  00196d6c: 1040000b beq r2,r0,0x00196d9c             {{f/Cond|If Unit is riding}} '''/Else :''' {{f/loc|<nowiki>Returns r2 = 0x01</nowiki>}}
  00196d90: 30420010 andi r2,r2,0x0010
+
  00196d70: 3062000f andi r2,r3,0x000f                   |{{f/std|<nowiki>r2 = Mount ID</nowiki>}}
*Is this supposed to be a beq? Makes more sense for both being invisible failing*
+
  00196d74: 000218c0 sll r3,r2,0x03                       |
  00196d94: 14400004 bne r2,r0,0x00196da8 Branch if Mount is Transparent
+
  00196d78: 00621823 subu r3,r3,r2                       |
  00196d98: 00001021 addu r2,r0,r0 r2 = 0 (Success)
+
  00196d7c: 00031980 sll r3,r3,0x06                       |{{f/std|Mount ID * 0x1c0}}
  00196d9c: 08065b6a j 0x00196da8
+
  00196d80: 3c018019 lui r1,0x8019                       |
  00196da0: 34020001 ori r2,r0,0x0001 r2 = 1 (Fail)
+
  00196d84: 00230821 addu r1,r1,r3                       |{{f/adr|Part of mount data pointer}}
  00196da4: 00001021 addu r2,r0,r0 r2 = 0 (Success)
+
  00196d88: 90220926 lbu r2,0x0926(r1)                   |{{f/load|Load Mount's Current Statuses 3}}
  00196da8: 03e00008 jr r31
+
  00196d8c: 00000000 nop                                 |
 +
  00196d90: 30420010 andi r2,r2,0x0010                   |{{f/std|Check [Transparent]}}
 +
  00196d94: 14400004 bne r2,r0,0x00196da8                 {{f/Cond|If Mount is Transparent}} {{f/loc|<nowiki>Returns r2 = 0x00</nowiki>}} {{f/std|?? Why ? }}
 +
  00196d98: 00001021 addu r2,r0,r0                           |{{f/std|<nowiki>r2 = 0 (Success)</nowiki>}}
 +
  00196d9c: 08065b6a j 0x00196da8                     {{f/Cond|E}}      |{{f/jump|Returns 0x01}}
 +
  00196da0: 34020001 ori r2,r0,0x0001                         |
 +
                                                {{f/Cond|Else : Not transparent Unit}}
 +
  00196da4: 00001021 addu r2,r0,r0               |{{f/std|<nowiki>r2 = 0 (Success)</nowiki>}}
 +
  00196da8: 03e00008 jr r31                   END
 
  00196dac: 00000000 nop
 
  00196dac: 00000000 nop
 +
=== Notes ===
 +
Emmy on line 00196d94 :  Is this supposed to be a beq? Makes more sense for both being invisible failing*
 +
 +
If a unit is transparent, the routine checks the ridding byte :
 +
  - If riding a transparent mount --> Returns 0x00 (success ??)
 +
  - If riding a non transparent mount --> returns 0x01 (fail)
 +
===Return Locations===
 +
'''BATTLE.BIN'''
 +
0019436c: [[Set_type_of_target_for_all_targets]]
 +
001991b8: [[Calculate_Physical%3F_Target]]
 +
0019deb4: [[AI_ability_processing]]

Latest revision as of 19:45, 2 May 2023

BATTLE.BIN : Check if Unit can be Targeted (Cryst/Trea/Mount/Trans)
------------------------------------------------------------------------------------------
Parameters - r4 : Unit ID

Returns r2 = 0x00 if Unit can be hitted/targeted
        r2 = 0x01 if Unit can't be targeted (Crystal, Treasure, Ridden, Enemy Transparent)

Note : There is a weird control of transparent unit riding a transparent unit.
-----------------------------------------------------------------------------------------
00196ce8: 3c06801a lui r6,0x801a            |
00196cec: 24c6f3c4 addiu r6,r6,0xf3c4       |r6 = AI Data Pointer
00196cf0: 000410c0 sll r2,r4,0x03           |ID * 8
00196cf4: 00441023 subu r2,r2,r4            |ID * 7
00196cf8: 00021180 sll r2,r2,0x06           |Unit ID * 0x1c0
00196cfc: 3c038019 lui r3,0x8019            |
00196d00: 246308cc addiu r3,r3,0x08cc       |
00196d04: 00432821 addu r5,r2,r3            |r5 = Unit's Data Pointer
00196d08: 90a30001 lbu r3,0x0001(r5)        |Load Unit's ID
00196d0c: 340200ff ori r2,r0,0x00ff         |
00196d10: 10620025 beq r3,r2,0x00196da8     #If Unit doesn't exists :  Returns r2 = 0x01
00196d14: 34020001 ori r2,r0,0x0001         |
00196d18: 94a20058 lhu r2,0x0058(r5)        |Load Current Statuses 1+2
00196d1c: 00000000 nop                      |
00196d20: 30420140 andi r2,r2,0x0140        |Check [Crystal] and [Treasure]
00196d24: 14400020 bne r2,r0,0x00196da8     #If Unit is Crystal or Treasure: Returns r2 = 0x01
00196d28: 34020001 ori r2,r0,0x0001         |
00196d2c: 90a30182 lbu r3,0x0182(r5)        |Load Unit's Mount Info
00196d30: 00000000 nop                      |
00196d34: 30620040 andi r2,r3,0x0040        |Check [Being Ridden]
00196d38: 1440001b bne r2,r0,0x00196da8     #If Unit is a mount : Returns r2 = 0x01
00196d3c: 34020001 ori r2,r0,0x0001         |
00196d40: 00041100 sll r2,r4,0x04           |Unit ID * 16
00196d44: 00461021 addu r2,r2,r6            |8019f3c4 + Unit Offset
00196d48: 90421834 lbu r2,0x1834(r2)        |Load Enemy flag  8019f3c4 + 0x182c + 0x08 + Unit offset
00196d4c: 00000000 nop                      |
00196d50: 10400015 beq r2,r0,0x00196da8     #If This Unit has the enemy flag /Else : Returns r2 = 0x00
00196d54: 00001021 addu r2,r0,r0                |
00196d58: 90a2005a lbu r2,0x005a(r5)            |Load Current Statuses 3
00196d5c: 00000000 nop                          |
00196d60: 30420010 andi r2,r2,0x0010            |Check [Transparent]
00196d64: 1040000f beq r2,r0,0x00196da4         #If Unit is transparent : /Else : Returns r2 = 0x00
00196d68: 30620080 andi r2,r3,0x0080                |Check [Is riding]
00196d6c: 1040000b beq r2,r0,0x00196d9c             #If Unit is riding /Else : Returns r2 = 0x01
00196d70: 3062000f andi r2,r3,0x000f                    |r2 = Mount ID
00196d74: 000218c0 sll r3,r2,0x03                       |
00196d78: 00621823 subu r3,r3,r2                        |
00196d7c: 00031980 sll r3,r3,0x06                       |Mount ID * 0x1c0
00196d80: 3c018019 lui r1,0x8019                        |
00196d84: 00230821 addu r1,r1,r3                        |Part of mount data pointer
00196d88: 90220926 lbu r2,0x0926(r1)                    |Load Mount's Current Statuses 3
00196d8c: 00000000 nop                                  |
00196d90: 30420010 andi r2,r2,0x0010                    |Check [Transparent]
00196d94: 14400004 bne r2,r0,0x00196da8                 #If Mount is Transparent Returns r2 = 0x00 ?? Why ? 
00196d98: 00001021 addu r2,r0,r0                            |r2 = 0 (Success)
00196d9c: 08065b6a j 0x00196da8                     #E      |>>Returns 0x01
00196da0: 34020001 ori r2,r0,0x0001                         |
                                                #Else : Not transparent Unit
00196da4: 00001021 addu r2,r0,r0                |r2 = 0 (Success)
00196da8: 03e00008 jr r31                   END
00196dac: 00000000 nop

Notes

Emmy on line 00196d94 :  Is this supposed to be a beq? Makes more sense for both being invisible failing* 

If a unit is transparent, the routine checks the ridding byte :
  - If riding a transparent mount --> Returns 0x00 (success ??)
  - If riding a non transparent mount --> returns 0x01 (fail)

Return Locations

BATTLE.BIN
0019436c: Set_type_of_target_for_all_targets
001991b8: Calculate_Physical?_Target
0019deb4: AI_ability_processing