Determine attack animation from used Weapon Type

From Final Fantasy Hacktics Wiki
Jump to navigation Jump to search

Calculates which attacking animation to use based on the height difference of attacker and target. if a chicken or frog is attacking, the animation used is set to 0x7A.

0008288c: 27bdffe0 addiu r29,r29,0xffe0
00082890: afb10014 sw r17,0x0014(r29)
00082894: 00808821 addu r17,r4,r0			r17 = misc data
00082898: afb20018 sw r18,0x0018(r29)
0008289c: 00a09021 addu r18,r5,r0			r18 = misc data
000828a0: afbf001c sw r31,0x001c(r29)
000828a4: 12200060 beq r17,r0,0x00082a28
000828a8: afb00010 sw r16,0x0010(r29)
000828ac: 12400055 beq r18,r0,0x00082a04
000828b0: 00000000 nop
000828b4: 92220006 lbu r2,0x0006(r17)		load attacker spritesheet
000828b8: 00000000 nop
000828bc: 2c42009b sltiu r2,r2,0x009b
000828c0: 14400006 bne r2,r0,0x000828dc		branch if not chicken/frog
000828c4: 3402000c ori r2,r0,0x000c
000828c8: 3c048009 lui r4,0x8009
000828cc: 90844365 lbu r4,0x4365(r4)		Load chicken/frog attack animation
000828d0: 86250070 lh r5,0x0070(r17)		load attack facing
000828d4: 08020a88 j 0x00082a20
000828d8: 00000000 nop

Unit animations
000828dc: 9224013b lbu r4,0x013b(r17)		load equipped weapon type
000828e0: 00000000 nop
000828e4: 14820009 bne r4,r2,0x0008290c		branch if not bows (boo)
000828e8: 00000000 nop
000828ec: 0c06c118 jal 0x001b0460			--> 001b0460 - 001b04d8 returns r2 is shooting angle (up, straight, down)
000828f0: 00000000 nop
000828f4: 3c018009 lui r1,0x8009
000828f8: 00220821 addu r1,r1,r2
000828fc: 90244388 lbu r4,0x4388(r1)		Loads 53, 54, or 55 depending on ^ that nonsense up there. (corresponding animations are shooting up, straight, and down.)
00082900: 86250070 lh r5,0x0070(r17)		load attack facing
00082904: 08020a88 j 0x00082a20		Save animation and facing
00082908: 00000000 nop

Weapon is not bow
0008290c: 8e420134 lw r2,0x0134(r18)		target data
00082910: 00000000 nop
00082914: 9043018e lbu r3,0x018e(r2)		load evade type
00082918: 00000000 nop
0008291c: 1060000e beq r3,r0,0x00082958		branch if hit
00082920: 28620009 slti r2,r3,0x0009
00082924: 1440000c bne r2,r0,0x00082958		branch if < 0x09 (hit, guarded, arrow guard, nullified, missed, caught, cancelled by status)
00082928: 2862000c slti r2,r3,0x000c
0008292c: 1040000a beq r2,r0,0x00082958		branch if > 0x0c (error return)
00082930: 2862000a slti r2,r3,0x000a
00082934: 14400008 bne r2,r0,0x00082958		branch if 0x09 (reflected)

Attack missed
00082938: 00041040 sll r2,r4,0x01		r2 = weapon type * 2
0008293c: 00441021 addu r2,r2,r4		weapon type * 3
00082940: 3c018009 lui r1,0x8009
00082944: 00220821 addu r1,r1,r2
00082948: 90244364 lbu r4,0x4364(r1)		load animation for low animation on miss
0008294c: 86250070 lh r5,0x0070(r17)		load attack facing
00082950: 08020a88 j 0x00082a20		jump to end
00082954: 00000000 nop

Attack connected to target
00082958: 92240004 lbu r4,0x0004(r17)		load unit misc ID
0008295c: 0c02371d jal 0x0008dc74			-->0008dc74 - 0008dc98 - Finds attacker's misc unit data, and their height.
00082960: 00000000 nop
00082964: 000287c2 srl r16,r2,0x1f		
00082968: 02028021 addu r16,r16,r2		
0008296c: 00108043 sra r16,r16,0x01		r16 = attacker height / 2
00082970: 96220042 lhu r2,0x0042(r17)		load map height (in units, and also negative?)
00082974: 92440004 lbu r4,0x0004(r18)		load unit misc ID
00082978: 0c02371d jal 0x0008dc74			-->0008dc74 - 0008dc98 - Finds target's misc unit data, and their height
0008297c: 02028023 subu r16,r16,r2		r16 = height / 2 - map height
00082980: 00021fc2 srl r3,r2,0x1f
00082984: 00621821 addu r3,r3,r2
00082988: 00031843 sra r3,r3,0x01
0008298c: 00108400 sll r16,r16,0x10
00082990: 96420042 lhu r2,0x0042(r18)		load target height (units, also, negative?)
00082994: 00108403 sra r16,r16,0x10
00082998: 00621823 subu r3,r3,r2
0008299c: 00031c00 sll r3,r3,0x10
000829a0: 00031c03 sra r3,r3,0x10
000829a4: 02038023 subu r16,r16,r3		find the difference in height between the two units. (CAS - TAR. bigger numbers mean higher attacker, lower numbers mean lower attacker.)
000829a8: 2a02fff5 slti r2,r16,-0x000b		r2 = true if < -0xb
000829ac: 1040000a beq r2,r0,0x000829d8	branch if > -0xb
000829b0: 2a02000c slti r2,r16,0x000c		r2 = true if < 0xc

Height mod < -0xb
000829b4: 9223013b lbu r3,0x013b(r17)		load weapon type
000829b8: 86250070 lh r5,0x0070(r17)		load attack facing
000829bc: 00031040 sll r2,r3,0x01
000829c0: 00431021 addu r2,r2,r3		weapon type * 3
000829c4: 3c018009 lui r1,0x8009
000829c8: 00220821 addu r1,r1,r2
000829cc: 90244364 lbu r4,0x4364(r1)		load low mod animation
000829d0: 08020a88 j 0x00082a20
000829d4: 00000000 nop

height mod > 0xc
000829d8: 1440000a bne r2,r0,0x00082a04		Branch if difference in unit heights is between -0xb and 0xc
000829dc: 00000000 nop
000829e0: 9223013b lbu r3,0x013b(r17)		load weapon type
000829e4: 86250070 lh r5,0x0070(r17)		load facing
000829e8: 00031040 sll r2,r3,0x01
000829ec: 00431021 addu r2,r2,r3
000829f0: 3c018009 lui r1,0x8009
000829f4: 00220821 addu r1,r1,r2
000829f8: 90244366 lbu r4,0x4366(r1)		load high mod animation
000829fc: 08020a88 j 0x00082a20
00082a00: 00000000 nop

-0xb < Height difference < 0xc
00082a04: 9223013b lbu r3,0x013b(r17)		Load weapon type
00082a08: 86250070 lh r5,0x0070(r17)		Load facing
00082a0c: 00031040 sll r2,r3,0x01
00082a10: 00431021 addu r2,r2,r3
00082a14: 3c018009 lui r1,0x8009
00082a18: 00220821 addu r1,r1,r2
00082a1c: 90244365 lbu r4,0x4365(r1)		load mid mod animation

All:
00082a20: 0c020662 jal 0x00081988			store unit animation + facing
00082a24: 02203021 addu r6,r17,r0
00082a28: 8fbf001c lw r31,0x001c(r29)
00082a2c: 8fb20018 lw r18,0x0018(r29)
00082a30: 8fb10014 lw r17,0x0014(r29)
00082a34: 8fb00010 lw r16,0x0010(r29)
00082a38: 27bd0020 addiu r29,r29,0x0020
00082a3c: 03e00008 jr r31
00082a40: 00000000 nop