Get Final Height data from unit misc data

From Final Fantasy Hacktics Wiki
Jump to navigation Jump to search
Parameters : r4 = Unit misc. data pointer
Returns : r2 = Unit height data

0007d51c: 27bdffd8 addiu r29,r29,-0x0028    |
0007d520: afb00018 sw r16,0x0018(r29)       |
0007d524: 00808021 addu r16,r4,r0           |r16 = Unit's Misc Data Pointer
0007d528: afbf0020 sw r31,0x0020(r29)       |
0007d52c: 0c01f428 jal 0x0007d0a0           |-->Get_Unit_misc_data_pointer_of_ridden_unit_by_r4 r2 = Ridden unit data pointer if any, unit data pointer if not, 0x00 if fail.
0007d530: afb1001c sw r17,0x001c(r29)       |
0007d534: 00408821 addu r17,r2,r0           |r17 = r16 Unit's Misc Data Pointer or Ridden unit if r16 is riding
0007d538: 8e220134 lw r2,0x0134(r17)        |r2 = Unit on the ground data pointer
0007d53c: 00000000 nop                      |
0007d540: 90430047 lbu r3,0x0047(r2)        |r3 = Unit on the ground X coord.
0007d544: 00000000 nop                      |
0007d548: 000310c0 sll r2,r3,0x03           |X * 8
0007d54c: 00431023 subu r2,r2,r3            |X * 7
0007d550: 00021080 sll r2,r2,0x02           |X * 28
0007d554: 2442000e addiu r2,r2,0x000e       |X * 28 + 14 (14 is a value that will be used in further routines)
0007d558: a7a20010 sh r2,0x0010(r29)        |Store Unit's X Mod on stack 0x10
0007d55c: 8e220134 lw r2,0x0134(r17)        |r2 = Unit on the ground data pointer
0007d560: 00000000 nop                      |
0007d564: 90430048 lbu r3,0x0048(r2)        |r3 = Unit on the ground Y coord.
0007d568: 02202021 addu r4,r17,r0           |r4 = Unit's on the ground Misc Data Pointer
0007d56c: 000310c0 sll r2,r3,0x03           |Y * 8
0007d570: 00431023 subu r2,r2,r3            |Y * 7
0007d574: 00021080 sll r2,r2,0x02           |Y * 28
0007d578: 2442000e addiu r2,r2,0x000e       |Y * 28 + 14 (14 is a value that will be used in further routines)
0007d57c: a7a20014 sh r2,0x0014(r29)        |Store Unit's Y Mod on stack 0x14
0007d580: 9222007e lbu r2,0x007e(r17)       |Load Unit's on the ground elevation
0007d584: 27a50010 addiu r5,r29,0x0010      |r5 = Stack Pointer + 0x10
0007d588: 0c01f435 jal 0x0007d0d4           |-->Complex_Height_Data_from_unit_misc_data_and_coordinates returns r2 = Height data
0007d58c: a7a20012 sh r2,0x0012(r29)        |Store Unit's Elevation on stack 0x012
0007d590: 00402021 addu r4,r2,r0            |r4 = Unit height data
0007d594: 92030130 lbu r3,0x0130(r16)       |r3 = Unit misc. Mount/rider flag
0007d598: 34020001 ori r2,r0,0x0001         |r2 = 0x01 (riding flag)
0007d59c: 14620005 bne r3,r2,0x0007d5b4     #If unit is riding
0007d5a0: 00041400 sll r2,r4,0x10           |r2 = Unit height data * 1024
0007d5a4: 96230076 lhu r3,0x0076(r17)            |Unit misc ??
0007d5a8: 2482fff6 addiu r2,r4,0xfff6            |r2 = -(Height data) - 0x0a 
0007d5ac: 00622021 addu r4,r3,r2                 |r4 = -(Height data + 0x0a) + Unit misc ??
0007d5b0: 00041400 sll r2,r4,0x10                |r2 = r4*1024
0007d5b4: 00021403 sra r2,r2,0x10           |r2 = Unit height data (register cleanup)
0007d5b8: 8fbf0020 lw r31,0x0020(r29)       |
0007d5bc: 8fb1001c lw r17,0x001c(r29)       |
0007d5c0: 8fb00018 lw r16,0x0018(r29)       |
0007d5c4: 27bd0028 addiu r29,r29,0x0028     |
0007d5c8: 03e00008 jr r31                   END
0007d5cc: 00000000 nop

Return location

Battle.bin
0008c4f8: Set_Unit_Xmod,_Y_Mod_and_Height_data_from_unit_ID
Additional Notes
"0007d580: 9222007e lbu r2,0x007e(r17)" is loading from Misc. Data, which the AI hasn't updated at this point. As a result, the AI may occasionally fail to compensate for being on a upper level, especially if they were previously
on a non-upper tile. There might also be similar issues with the Misc. Mount/Rider flag maybe. Anyone looking to modify AI in the future should be on the lookout for calls from Misc. Data and also only make calls to static attributes.