Protect Allies - Auto Battle (001984ec)

From Final Fantasy Hacktics Wiki
Revision as of 22:25, 8 March 2017 by Dokurider (talk | contribs)
Jump to navigation Jump to search
Description:
Documentation is not complete yet. 
This is the AI routine responsible for evaluating who needs healing and status curing.
Referenced In:
Auto Battle Handling
Routines Used:
Find Peril Most Unit (00198b04)
Decide where to move to
Find and Invert Priority
Evaluate Cancel Status Ability
Set/Remove Charging
Find Active Unit
Decide if AI will choose ability
Randomly Transfer Data
Reset Ability Choice Data?
001984ec: 3c02801a lui r2,0x801a
001984f0: 8c420bbc lw r2,0x0bbc(r2)
001984f4: 27bdffd8 addiu r29,r29,0xffd8
001984f8: afbf0020 sw r31,0x0020(r29)
001984fc: afb1001c sw r17,0x001c(r29)
00198500: afb00018 sw r16,0x0018(r29)
00198504: 3c068019 lui r6,0x8019
00198508: 24c63d70 addiu r6,r6,0x3d70
0019850c: 80c30000 lb r3,0x0000(r6)
00198510: 80c40001 lb r4,0x0001(r6)
00198514: 80c50002 lb r5,0x0002(r6)
00198518: a3a30010 sb r3,0x0010(r29)
0019851c: a3a40011 sb r4,0x0011(r29)
00198520: a3a50012 sb r5,0x0012(r29)
00198524: 905001b9 lbu r16,0x01b9(r2)				Load Main Target
00198528: 3c02801a lui r2,0x801a
0019852c: 90420d7b lbu r2,0x0d7b(r2)
00198530: 3c11801a lui r17,0x801a
00198534: 2631f3c4 addiu r17,r17,0xf3c4
00198538: 1040000d beq r2,r0,0x00198570
0019853c: 00000000 nop
00198540: 3c03801a lui r3,0x801a
00198544: 90630032 lbu r3,0x0032(r3)				Load Decision Byte
00198548: 00000000 nop
0019854c: 2c620008 sltiu r2,r3,0x0008
00198550: 1040009b beq r2,r0,0x001987c0				Branch if Decision > 7

00198554: 00031080 sll r2,r3,0x02
00198558: 3c018019 lui r1,0x8019
0019855c: 00220821 addu r1,r1,r2
00198560: 8c223d78 lw r2,0x3d78(r1)
00198564: 00000000 nop
00198568: 00400008 jr r2
0019856c: 00000000 nop
0: 80198578
1: 801985f8
2: 8019870c
3: 80198748
4: 80198788
5: 801987c0
6: 801987c0
7: 801986a0
<Usage not set>
00198570: 3c01801a lui r1,0x801a
00198574: a02001f1 sb r0,0x01f1(r1)
<0> (Initialize Priority)
00198578: 0c066672 jal 0x001999c8				Initialize Targeting Priorities of all units
0019857c: 00000000 nop
00198580: 2403ffff addiu r3,r0,0xffff
00198584: 14430008 bne r2,r3,0x001985a8			Branch if it failed
00198588: 00101100 sll r2,r16,0x04
0019858c: a2200c6e sb r0,0x0c6e(r17)			Next Decision = 0
00198590: 08066201 j 0x00198804					Exit and return -1
00198594: 2402ffff addiu r2,r0,0xffff
 (Peril Jump)
00198598: 3c01801a lui r1,0x801a
0019859c: ac22f37c sw r2,-0x0c84(r1)
001985a0: 08066177 j 0x001985dc					Jump to Peril Routine
001985a4: 00000000 nop

001985a8: 02221821 addu r3,r17,r2
001985ac: 3c01801a lui r1,0x801a
001985b0: ac20f37c sw r0,-0x0c84(r1)
001985b4: 90621833 lbu r2,0x1833(r3)			AI Targeting Flags
001985b8: 00000000 nop
001985bc: 00021102 srl r2,r2,0x04				Remove the 08 flag and below
001985c0: 30420001 andi r2,r2,0x0001
001985c4: 14400005 bne r2,r0,0x001985dc			Branch if unit can't be targeted
001985c8: 00000000 nop

001985cc: 90621834 lbu r2,0x1834(r3)			Load Enemy Flag
001985d0: 00000000 nop
001985d4: 10400006 beq r2,r0,0x001985f0			Branch if Ally
001985d8: 00000000 nop
001985dc: 0c0662c1 jal 0x00198b04				Find the unit in highest peril
001985e0: 00000000 nop
001985e4: 8e2217f8 lw r2,0x17f8(r17)			Acting Unit's Data Pointer
001985e8: 00000000 nop
001985ec: 905001b9 lbu r16,0x01b9(r2)			Load Main Target
001985f0: 0c065243 jal 0x0019490c				Store main target ID and focus on target flag
001985f4: 02002021 addu r4,r16,r0
<1>
001985f8: 0c0660b6 jal 0x001982d8				Decide where to move to
001985fc: 00000000 nop
00198600: 2403ffff addiu r3,r0,0xffff
00198604: 10430079 beq r2,r3,0x001987ec			Save Decision and Return -1 if no decision to move was made
00198608: 34020001 ori r2,r0,0x0001				Next Decision = 01
0019860c: 34020002 ori r2,r0,0x0002
00198610: 0c0658c3 jal 0x0019630c				Find and Invert Priority
00198614: a2220e2d sb r2,0x0e2d(r17)			Ability Decided = True
00198618: 3c02801a lui r2,0x801a
0019861c: 8c42f37c lw r2,-0x0c84(r2)
00198620: 00000000 nop
00198624: 14400037 bne r2,r0,0x00198704
00198628: a2200e2d sb r0,0x0e2d(r17)			Ability Decided = False

0019862c: 00101100 sll r2,r16,0x04
00198630: 02221021 addu r2,r17,r2
00198634: 90421833 lbu r2,0x1833(r2)			AI Targeting Flags
00198638: 00000000 nop
0019863c: 00021182 srl r2,r2,0x06				Remove the 20 flag and below
00198640: 30420001 andi r2,r2,0x0001
00198644: 14400030 bne r2,r0,0x00198708			Save ?, then <2> if Dead Unit with Reraise
00198648: 34020001 ori r2,r0,0x0001

0019864c: 3c01801a lui r1,0x801a
00198650: ac20f380 sw r0,-0x0c80(r1)			Clear ?
00198654: 001018c0 sll r3,r16,0x03				Target ID * 8
<Status Loop>
00198658: 00701823 subu r3,r3,r16				Target ID * 7
0019865c: 3c02801a lui r2,0x801a
00198660: 8c42f380 lw r2,-0x0c80(r2)			Load ? Counter
00198664: 00031980 sll r3,r3,0x06				Target ID * 1c0
00198668: 03a21021 addu r2,r29,r2				? + Stack Pointer
0019866c: 90440010 lbu r4,0x0010(r2)			r4 = Status ID?
00198670: 3c028019 lui r2,0x8019
00198674: 24420924 addiu r2,r2,0x0924			Point to Current Status
00198678: 00621821 addu r3,r3,r2				Point to Main Target's Current Status
0019867c: 34020080 ori r2,r0,0x0080
00198680: 000428c2 srl r5,r4,0x03				r5 = Status ID / 8
00198684: 00651821 addu r3,r3,r5				r3 = Status ID + Current Status Pointer
00198688: 30840007 andi r4,r4,0x0007			r4 = Status Position Slot Flag
0019868c: 90630000 lbu r3,0x0000(r3)			Load Target Current Status
00198690: 00821007 srav r2,r2,r4				80 / (1 - 7) = (1 - 80)
00198694: 00621824 and r3,r3,r2
00198698: 10600011 beq r3,r0,0x001986e0			<?++> if Target Unit does not have status
0019869c: 00000000 nop
<7> Evaluate Status
001986a0: 3c02801a lui r2,0x801a
001986a4: 8c42f380 lw r2,-0x0c80(r2)			Load ?
001986a8: 00000000 nop
001986ac: 03a21021 addu r2,r29,r2
001986b0: 90450010 lbu r5,0x0010(r2)			Load Status ID
001986b4: 0c066207 jal 0x0019881c				Evaluate Cancel Status Ability
001986b8: 02002021 addu r4,r16,r0				r4 = Target ID
001986bc: 00401821 addu r3,r2,r0
001986c0: 2402ffff addiu r2,r0,0xffff
001986c4: 10620049 beq r3,r2,0x001987ec			Save Decision and Return -1 if Ability was choosen
001986c8: 34020007 ori r2,r0,0x0007				Next Decision = 7

001986cc: 34020002 ori r2,r0,0x0002
001986d0: 1062004b beq r3,r2,0x00198800			Branch if 0x0071 = True
001986d4: 00000000 nop
001986d8: 1060ffaf beq r3,r0,0x00198598			Jump to <Peril Jump> if no abilities were choosen
001986dc: 34020001 ori r2,r0,0x0001
<?++>
001986e0: 3c02801a lui r2,0x801a
001986e4: 8c42f380 lw r2,-0x0c80(r2)			Load ? Counter
001986e8: 00000000 nop
001986ec: 24420001 addiu r2,r2,0x0001
001986f0: 3c01801a lui r1,0x801a
001986f4: ac22f380 sw r2,-0x0c80(r1)			? Counter++
001986f8: 28420003 slti r2,r2,0x0003
001986fc: 1440ffd6 bne r2,r0,0x00198658			Do twice
00198700: 001018c0 sll r3,r16,0x03

00198704: 34020001 ori r2,r0,0x0001
00198708: a2220e2d sb r2,0x0e2d(r17)			Ability Decided = True
<2> Set/Remove Charging, then look for Main Target
0019870c: 0c0657e3 jal 0x00195f8c				Set/Remove Charging
00198710: 00000000 nop
00198714: 00401821 addu r3,r2,r0
00198718: 2402ffff addiu r2,r0,0xffff
0019871c: 10620033 beq r3,r2,0x001987ec			Save Decision and Return -1 if Frame RNG said so
00198720: 34020002 ori r2,r0,0x0002				Next Decision = 02

00198724: 34020001 ori r2,r0,0x0001
00198728: 10620036 beq r3,r2,0x00198804			Exit and return 0 if Ability is a Lower Priority
0019872c: 00001021 addu r2,r0,r0
<Is Main Target Targetable>
00198730: a2200e2d sb r0,0x0e2d(r17)			Ability Decided = False
00198734: 34040003 ori r4,r0,0x0003				Find Specific Unit
00198738: 0c065f43 jal 0x00197d0c				Find Active Unit
0019873c: 02002821 addu r5,r16,r0				Look for Main Target
00198740: 1040000b beq r2,r0,0x00198770			Branch if Target not Active
00198744: 34020001 ori r2,r0,0x0001
<3> Attempt to Choose Move, then look for enemy unit
00198748: 0c065f98 jal 0x00197e60				Decide if AI will choose ability (Chose Move from movelist)
0019874c: 00000000 nop
00198750: 2403ffff addiu r3,r0,0xffff
00198754: 10430025 beq r2,r3,0x001987ec			Save Next Decision and Return -1 if Ability was choosen
00198758: 34020003 ori r2,r0,0x0003				Next Decision = 3

0019875c: 0c065c2f jal 0x001970bc				Rando