Accelerate Unit to Destination

From Final Fantasy Hacktics Wiki
Jump to navigation Jump to search

moves unit to destination. does so progressively if executing attack with target. used by rush. r5 input is whether or not the animation is allowed to change height with the terrain.
000898a0: 27bdffc0 addiu r29,r29,0xffc0
000898a4: afb00028 sw r16,0x0028(r29)
000898a8: 00808021 addu r16,r4,r0
000898ac: afb20030 sw r18,0x0030(r29)
000898b0: 00a09021 addu r18,r5,r0
000898b4: afbf0038 sw r31,0x0038(r29)
000898b8: afb30034 sw r19,0x0034(r29)
000898bc: afb1002c sw r17,0x002c(r29)
000898c0: 8e11008c lw r17,0x008c(r16)
000898c4: 8e130090 lw r19,0x0090(r16)
000898c8: 8e020028 lw r2,0x0028(r16)			#X mod difference?
000898cc: 8e03002c lw r3,0x002c(r16)			#Y mod difference?
000898d0: 8e040030 lw r4,0x0030(r16)			#height mod difference? (all for types of motion)
000898d4: 8e050034 lw r5,0x0034(r16)
000898d8: afa20018 sw r2,0x0018(r29)
000898dc: afa3001c sw r3,0x001c(r29)
000898e0: afa40020 sw r4,0x0020(r29)			#store height mod f
000898e4: afa50024 sw r5,0x0024(r29)			#stores above to stack?
000898e8: 8e030088 lw r3,0x0088(r16)			#load distort phase
000898ec: 00000000 nop
000898f0: 10600005 beq r3,r0,0x00089908		#branch if initialising
000898f4: 34020001 ori r2,r0,0x0001
000898f8: 10620080 beq r3,r2,0x00089afc		#branch if executing
000898fc: 00000000 nop
00089900: 080226d4 j 0x00089b50			#otherwise skip
00089904: 00000000 nop
Initialising
00089908: 8e040134 lw r4,0x0134(r16)			#load pointer to unit's battle data
0008990c: 00000000 nop
00089910: 10800078 beq r4,r0,0x00089af4		#branch if null
00089914: 34020034 ori r2,r0,0x0034
00089918: 3c038009 lui r3,0x8009
0008991c: 8c6360e4 lw r3,0x60e4(r3)			#load type of display? (gameflow variable)
00089920: 00000000 nop
00089924: 14620016 bne r3,r2,0x00089980		#branch if current display != 0x34
00089928: 00000000 nop
if current display = 0x34
0008992c: 9203007c lbu r3,0x007c(r16)			#load unit's X coordinate
00089930: 00000000 nop
00089934: 000310c0 sll r2,r3,0x03
00089938: 00431023 subu r2,r2,r3
0008993c: 00021080 sll r2,r2,0x02			#X coord * tile width
00089940: 2442000e addiu r2,r2,0x000e			#x coord + 1 * tile width
00089944: 8e030018 lw r3,0x0018(r16)			#load X mod
00089948: 00021300 sll r2,r2,0x0c			#x coord -> x coord's x mod
0008994c: 00431023 subu r2,r2,r3			#find difference in adjacent tile's x mod to current tile's
00089950: afa20018 sw r2,0x0018(r29)			#store
00089954: 9203007d lbu r3,0x007d(r16)			#load unit's Y coordinate
00089958: 8e040020 lw r4,0x0020(r16)			#load Y mod
0008995c: afa0001c sw r0,0x001c(r29)			#clear height mod difference
00089960: 000310c0 sll r2,r3,0x03
00089964: 00431023 subu r2,r2,r3
00089968: 00021080 sll r2,r2,0x02
0008996c: 2442000e addiu r2,r2,0x000e
00089970: 00021300 sll r2,r2,0x0c
00089974: 00441023 subu r2,r2,r4			#find difference in adjacent tile's Y mod and current tile's
00089978: 080226a9 j 0x00089aa4
0008997c: afa20020 sw r2,0x0020(r29)			#store height mod difference
if current display != 0x34
00089980: 9202018d lbu r2,0x018d(r16)			#load targets hit counter
00089984: 00000000 nop
00089988: 10400014 beq r2,r0,0x000899dc		#branch if none
0008998c: 00000000 nop
00089990: 9204018e lbu r4,0x018e(r16)			#load target ID
00089994: 0c01e9c9 jal 0x0007a724			#Get_unit_misc_data_that_matches_r4_ID
00089998: 00000000 nop
0008999c: 8c430018 lw r3,0x0018(r2)			#load target's X mod
000899a0: 8e040018 lw r4,0x0018(r16)			#load attacker's X mod
000899a4: 00000000 nop
000899a8: 00641823 subu r3,r3,r4			#find difference
000899ac: afa30018 sw r3,0x0018(r29)			#store difference of X mods
000899b0: 8c43001c lw r3,0x001c(r2)			#
000899b4: 8e04001c lw r4,0x001c(r16)			#Load height mods
000899b8: 00000000 nop
000899bc: 00641823 subu r3,r3,r4
000899c0: afa3001c sw r3,0x001c(r29)			#store difference of height mods
000899c4: 8c420020 lw r2,0x0020(r2)
000899c8: 8e030020 lw r3,0x0020(r16)
000899cc: 00000000 nop
000899d0: 00431023 subu r2,r2,r3
000899d4: 080226a9 j 0x00089aa4
000899d8: afa20020 sw r2,0x0020(r29)			#store difference of Y mods
if no targets:
000899dc: 8483017a lh r3,0x017a(r4)			#load target's X coord
000899e0: 00000000 nop
000899e4: 000310c0 sll r2,r3,0x03
000899e8: 00431023 subu r2,r2,r3
000899ec: 86030040 lh r3,0x0040(r16)			#loads X location on screen
000899f0: 00021080 sll r2,r2,0x02			#Target's X coord * tile width
000899f4: 2463fff2 addiu r3,r3,0xfff2			#X location - tile width
000899f8: 00431023 subu r2,r2,r3			#difference of target panel X coordinate and X location - E
000899fc: 00021300 sll r2,r2,0x0c			#X modify
00089a00: afa20018 sw r2,0x0018(r29)			#store
00089a04: 8e020134 lw r2,0x0134(r16)			#load pointer to unit's data
00089a08: 00000000 nop
00089a0c: 8443017e lh r3,0x017e(r2)			#Y panel for target
00089a10: 00000000 nop
00089a14: 000310c0 sll r2,r3,0x03
00089a18: 00431023 subu r2,r2,r3
00089a1c: 86030044 lh r3,0x0044(r16)			#Y position on screen
00089a20: 00021080 sll r2,r2,0x02
00089a24: 2463fff2 addiu r3,r3,0xfff2
00089a28: 00431023 subu r2,r2,r3
00089a2c: 00021300 sll r2,r2,0x0c			#find same difference as before
00089a30: afa20020 sw r2,0x0020(r29)			#store Y mod difference
00089a34: 8e020134 lw r2,0x0134(r16)
00089a38: 00000000 nop
00089a3c: 8443017a lh r3,0x017a(r2)			#load target's X panel
00089a40: 00000000 nop
00089a44: 000310c0 sll r2,r3,0x03
00089a48: 00431023 subu r2,r2,r3
00089a4c: 00021080 sll r2,r2,0x02
00089a50: 2442000e addiu r2,r2,0x000e
00089a54: a7a20010 sh r2,0x0010(r29)			#store target's X mod
00089a58: 8e020134 lw r2,0x0134(r16)
00089a5c: 00000000 nop
00089a60: 8443017e lh r3,0x017e(r2)			#load target's Y panel
00089a64: 00000000 nop
00089a68: 000310c0 sll r2,r3,0x03
00089a6c: 00431023 subu r2,r2,r3
00089a70: 00021080 sll r2,r2,0x02
00089a74: 2442000e addiu r2,r2,0x000e
00089a78: a7a20014 sh r2,0x0014(r29)			#store target's Y mod
00089a7c: 8e020134 lw r2,0x0134(r16)
00089a80: 00000000 nop
00089a84: 8445017c lh r5,0x017c(r2)			#parse map level
00089a88: 0c01f203 jal 0x0007c80c            Slope_Calculations
00089a8c: 27a40010 addiu r4,r29,0x0010			#stack pointer
00089a90: 86030042 lh r3,0x0042(r16)			#load height mod
00089a94: 00000000 nop
00089a98: 00431023 subu r2,r2,r3			#find difference between current height and slope height at centre?
00089a9c: 00021300 sll r2,r2,0x0c			#mod
00089aa0: afa2001c sw r2,0x001c(r29)			#store
00089aa4: 8fa40018 lw r4,0x0018(r29)			#load x mod difference
00089aa8: 00000000 nop
00089aac: 0091001a div r4,r17
00089ab0: 00002012 mflo r4				#divide by distortion variable
00089ab4: 8fa3001c lw r3,0x001c(r29)
00089ab8: 00000000 nop
00089abc: 0071001a div r3,r17
00089ac0: 00001812 mflo r3				#divide height difference by distortion variable
00089ac4: 8fa20020 lw r2,0x0020(r29)
00089ac8: 00000000 nop
00089acc: 0051001a div r2,r17
00089ad0: 00001012 mflo r2				#divide y difference by distortion variable
00089ad4: afa40018 sw r4,0x0018(r29)
00089ad8: afa3001c sw r3,0x001c(r29)
00089adc: afa20020 sw r2,0x0020(r29)			#store all again
00089ae0: 8e020088 lw r2,0x0088(r16)			#load phase
00089ae4: 00000000 nop
00089ae8: 24420001 addiu r2,r2,0x0001
00089aec: 080226bf j 0x00089afc
00089af0: ae020088 sw r2,0x0088(r16)			#store phase as 1
if attacking unit has no battle data
00089af4: 080226d4 j 0x00089b50
00089af8: a2000087 sb r0,0x0087(r16)			#if unit is erroneous, allow animation to continue
if phase is executing
00089afc: 1a200012 blez r17,0x00089b48			#if distortion variable = 0, unit has already arrived at new destination
00089b00: 00000000 nop
00089b04: 8e020018 lw r2,0x0018(r16)			#load X mod
00089b08: 8fa30018 lw r3,0x0018(r29)			#load X mod difference
00089b0c: 00000000 nop
00089b10: 00431021 addu r2,r2,r3			#move unit immediately towards new X. if instead attack with no targets, move unit slightly towards new X
00089b14: 12400006 beq r18,r0,0x00089b30		#branch if input 2 = 0 (no height change?)
00089b18: ae020018 sw r2,0x0018(r16)
00089b1c: 8e02001c lw r2,0x001c(r16)
00089b20: 8fa3001c lw r3,0x001c(r29)			#load height mod and height mod difference/ distortion
00089b24: 00000000 nop
00089b28: 00431021 addu r2,r2,r3
00089b2c: ae02001c sw r2,0x001c(r16)			#move unit to new height
00089b30: 8e020020 lw r2,0x0020(r16)
00089b34: 8fa30020 lw r3,0x0020(r29)
00089b38: 00000000 nop
00089b3c: 00431021 addu r2,r2,r3
00089b40: 080226d3 j 0x00089b4c
00089b44: ae020020 sw r2,0x0020(r16)			#move unit to new Y
00089b48: a2000087 sb r0,0x0087(r16)
00089b4c: 2631ffff addiu r17,r17,0xffff		#distortion variable - 1 (movement speeds up over time, until it abruptly stops at destination)
00089b50: 8fa20018 lw r2,0x0018(r29)
00089b54: 8fa3001c lw r3,0x001c(r29)
00089b58: 8fa40020 lw r4,0x0020(r29)
00089b5c: 8fa50024 lw r5,0x0024(r29)
00089b60: ae020028 sw r2,0x0028(r16)
00089b64: ae03002c sw r3,0x002c(r16)
00089b68: ae040030 sw r4,0x0030(r16)
00089b6c: ae050034 sw r5,0x0034(r16)			#store all differences(?) back into unit data
00089b70: 0c02255f jal 0x0008957c			#0008957c - 000895c0
00089b74: 02002021 addu r4,r16,r0
00089b78: ae11008c sw r17,0x008c(r16)
00089b7c: ae130090 sw r19,0x0090(r16)
00089b80: 8fbf0038 lw r31,0x0038(r29)
00089b84: 8fb30034 lw r19,0x0034(r29)
00089b88: 8fb20030 lw r18,0x0030(r29)
00089b8c: 8fb1002c lw r17,0x002c(r29)
00089b90: 8fb00028 lw r16,0x0028(r29)
00089b94: 27bd0040 addiu r29,r29,0x0040
00089b98: 03e00008 jr r31
00089b9c: 00000000 nop