Difference between revisions of "Get Final Height data from unit misc data"

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

Latest revision as of 08:59, 28 April 2024

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.