Difference between revisions of "Check if Linear Ability hits anything (0019c8ec)"

From Final Fantasy Hacktics Wiki
Jump to navigation Jump to search
(Updated documentation)
(Updated documentation)
Line 1: Line 1:
Check if Linear Abiilty hits anything (AI)
+
<font face='Courier New'>
 +
Check if Linear Abiilty hits anything (AI)
 +
 
 +
Note: The main routine (19b30c) that uses this routine sets r4 as 3 and r5 as 0.
 +
 
 +
r4 = 0 = Load Range, 1 = Load AoE, 2 = Load both Range and AoE
 +
r5 = Range + AoE?
 +
 
 +
Assumptions:
 +
X+ = East
 +
X- = West
 +
Y+ = North
 +
Y- = South
  
 
  0019c8ec: 27bdffd8 addiu r29,r29,0xffd8
 
  0019c8ec: 27bdffd8 addiu r29,r29,0xffd8
  0019c8f0: 00a04021 addu r8,r5,r0
+
  0019c8f0: 00a04021 addu r8,r5,r0 r8 = Preset
 
  0019c8f4: 3c05801a lui r5,0x801a
 
  0019c8f4: 3c05801a lui r5,0x801a
 
  0019c8f8: 24a5f3c4 addiu r5,r5,0xf3c4 r5 = Unit AI Data Pointer
 
  0019c8f8: 24a5f3c4 addiu r5,r5,0xf3c4 r5 = Unit AI Data Pointer
 
  0019c8fc: 34020001 ori r2,r0,0x0001
 
  0019c8fc: 34020001 ori r2,r0,0x0001
  0019c900: 10820011 beq r4,r2,0x0019c948 Skip to AoE if 1
+
  0019c900: 10820011 beq r4,r2,0x0019c948 Branch to AoE if 1
 
  0019c904: afbf0020 sw r31,0x0020(r29)
 
  0019c904: afbf0020 sw r31,0x0020(r29)
 
  0019c908: 28820002 slti r2,r4,0x0002
 
  0019c908: 28820002 slti r2,r4,0x0002
  0019c90c: 10400005 beq r2,r0,0x0019c924 Skip to Skip to Range+AoE if PV = 2 or 3
+
  0019c90c: 10400005 beq r2,r0,0x0019c924 Branch to Next PV Check if PV > 1
 
  0019c910: 00000000 nop
 
  0019c910: 00000000 nop
  0019c914: 10800008 beq r4,r0,0x0019c938 Skip to Check Range if 0
+
  0019c918: 29020010 slti r2,r8,0x0010 Set false if Preset was less than 0x000f
+
  0019c914: 10800008 beq r4,r0,0x0019c938 <Check Range> if PV = 0
  0019c91c: 0806725d j 0x0019c974
+
  0019c918: 29020010 slti r2,r8,0x0010 Set if Range/AoE < 0x0010
 +
  0019c91c: 0806725d j 0x0019c974 Skip to Branch
 
  0019c920: 00000000 nop
 
  0019c920: 00000000 nop
 
+
 
  0019c924: 34020002 ori r2,r0,0x0002
 
  0019c924: 34020002 ori r2,r0,0x0002
 
  0019c928: 1082000b beq r4,r2,0x0019c958 Skip to Range + AoE Check if 2
 
  0019c928: 1082000b beq r4,r2,0x0019c958 Skip to Range + AoE Check if 2
  0019c92c: 29020010 slti r2,r8,0x0010
+
  0019c92c: 29020010 slti r2,r8,0x0010 Set false if Preset was less than 0x000f
  0019c930: 0806725d j 0x0019c974
+
  0019c930: 0806725d j 0x0019c974                     Skip to Branch
 
  0019c934: 00000000 nop
 
  0019c934: 00000000 nop
  
 +
<Range>
 
  0019c938: 3c08801a lui r8,0x801a
 
  0019c938: 3c08801a lui r8,0x801a
 
  0019c93c: 9108f3c8 lbu r8,-0x0c38(r8) Load Range
 
  0019c93c: 9108f3c8 lbu r8,-0x0c38(r8) Load Range
 
  0019c940: 0806725d j 0x0019c974
 
  0019c940: 0806725d j 0x0019c974
  0019c944: 29020010 slti r2,r8,0x0010 1 if Range is 0x000f or less
+
  0019c944: 29020010 slti r2,r8,0x0010 Set if Range is less than 16
  
 +
<AoE>
 
  0019c948: 3c08801a lui r8,0x801a
 
  0019c948: 3c08801a lui r8,0x801a
 
  0019c94c: 9108f3c9 lbu r8,-0x0c37(r8) Load AoE
 
  0019c94c: 9108f3c9 lbu r8,-0x0c37(r8) Load AoE
 
  0019c950: 0806725d j 0x0019c974
 
  0019c950: 0806725d j 0x0019c974
  0019c954: 29020010 slti r2,r8,0x0010 1 if AoE is 0x000f or less
+
  0019c954: 29020010 slti r2,r8,0x0010 Set if AoE is less than 16
  
 +
<AoE + Range>
 
  0019c958: 3c03801a lui r3,0x801a
 
  0019c958: 3c03801a lui r3,0x801a
 
  0019c95c: 9063f3c8 lbu r3,-0x0c38(r3) Load Range
 
  0019c95c: 9063f3c8 lbu r3,-0x0c38(r3) Load Range
Line 39: Line 55:
 
  0019c96c: 00624021 addu r8,r3,r2 Range + AoE
 
  0019c96c: 00624021 addu r8,r3,r2 Range + AoE
 
  0019c970: 29020010 slti r2,r8,0x0010
 
  0019c970: 29020010 slti r2,r8,0x0010
  0019c974: 1440000c bne r2,r0,0x0019c9a8 Branch if Range + AoE is greater than 0x000f
+
  0019c974: 1440000c bne r2,r0,0x0019c9a8 Branch if Range + AoE combined is less than 16 (0x0010)
 
  0019c978: 34060011 ori r6,r0,0x0011
 
  0019c978: 34060011 ori r6,r0,0x0011
  
  0019c97c: 00003021 addu r6,r0,r0
+
<Set all linear panels as negative>
  0019c980: 3403ffff ori r3,r0,0xffff
+
  0019c97c: 00003021 addu r6,r0,r0 reset r6
 +
  0019c980: 3403ffff ori r3,r0,0xffff r3 = -1
 
  0019c984: 00a02021 addu r4,r5,r0 r4 = Unit AI Data Pointer
 
  0019c984: 00a02021 addu r4,r5,r0 r4 = Unit AI Data Pointer
 
+
  0019c988: a4830b4c sh r3,0x0b4c(r4)
+
  0019c988: a4830b4c sh r3,0x0b4c(r4) Set (Working) Linear Panel as -1 (fail)
  0019c98c: a4830b70 sh r3,0x0b70(r4)
+
  0019c98c: a4830b70 sh r3,0x0b70(r4) Set (Resulting) Linear Panel as -1 (fail)
 
  0019c990: 24c60001 addiu r6,r6,0x0001
 
  0019c990: 24c60001 addiu r6,r6,0x0001
 
  0019c994: 28c20012 slti r2,r6,0x0012
 
  0019c994: 28c20012 slti r2,r6,0x0012
  0019c998: 1440fffb bne r2,r0,0x0019c988
+
  0019c998: 1440fffb bne r2,r0,0x0019c988 Loop for all panels
  0019c99c: 24840002 addiu r4,r4,0x0002
+
  0019c99c: 24840002 addiu r4,r4,0x0002 Linear Panels Flags++
  0019c9a0: 080672e1 j 0x0019cb84
+
  0019c9a0: 080672e1 j 0x0019cb84 Exit Routine (Set Linear Flags as failed)
 
  0019c9a4: 00000000 nop
 
  0019c9a4: 00000000 nop
 
+
 
  0019c9a8: 24a20022 addiu r2,r5,0x0022
 
  0019c9a8: 24a20022 addiu r2,r5,0x0022
 
  0019c9ac: a4400b4c sh r0,0x0b4c(r2)
 
  0019c9ac: a4400b4c sh r0,0x0b4c(r2)
 
  0019c9b0: 24c6ffff addiu r6,r6,0xffff
 
  0019c9b0: 24c6ffff addiu r6,r6,0xffff
  0019c9b4: 04c1fffd bgez r6,0x0019c9ac
+
  0019c9b4: 04c1fffd bgez r6,0x0019c9ac Reset all Panels
 
  0019c9b8: 2442fffe addiu r2,r2,0xfffe
 
  0019c9b8: 2442fffe addiu r2,r2,0xfffe
  0019c9bc: 90a90c76 lbu r9,0x0c76(r5)
+
  0019c9c0: 90a40c74 lbu r4,0x0c74(r5)
+
  0019c9bc: 90a90c76 lbu r9,0x0c76(r5) r9 = Load Caster? Y
  0019c9c4: 0500001d bltz r8,0x0019ca3c Branch if Range+AoE is negative
+
  0019c9c0: 90a40c74 lbu r4,0x0c74(r5) r4 = Load Caster? X
 +
  0019c9c4: 0500001d bltz r8,0x0019ca3c Branch if Range+AoE is negative
 
  0019c9c8: 00003021 addu r6,r0,r0
 
  0019c9c8: 00003021 addu r6,r0,r0
  
  0019c9cc: 288d0008 slti r13,r4,0x0008
+
<Western and Eastern Linear (X+-)>
 +
  0019c9cc: 288d0008 slti r13,r4,0x0008 Set r13 if X is less than 8
 
  0019c9d0: 3c0a801a lui r10,0x801a
 
  0019c9d0: 3c0a801a lui r10,0x801a
  0019c9d4: 254af2f8 addiu r10,r10,0xf2f8
+
  0019c9d4: 254af2f8 addiu r10,r10,0xf2f8 r10 = 0x8019f2f8
 
  0019c9d8: 34020007 ori r2,r0,0x0007
 
  0019c9d8: 34020007 ori r2,r0,0x0007
  0019c9dc: 00446023 subu r12,r2,r4
+
  0019c9dc: 00446023 subu r12,r2,r4 r12 = 7 - X (West)
  0019c9e0: 248bfff9 addiu r11,r4,0xfff9
+
  0019c9e0: 248bfff9 addiu r11,r4,0xfff9 r11 = X - 7 (East)
  0019c9e4: 01003821 addu r7,r8,r0
+
  0019c9e4: 01003821 addu r7,r8,r0 r7 = Range + AoE
  0019c9e8: 01261023 subu r2,r9,r6
+
  0019c9ec: 04400013 bltz r2,0x0019ca3c
+
  0019c9e8: 01261023 subu r2,r9,r6 Y - Counter
 +
  0019c9ec: 04400013 bltz r2,0x0019ca3c Y Cap, branch to RangeAoE check
 
  0019c9f0: 00000000 nop
 
  0019c9f0: 00000000 nop
  0019c9f4: 11a00007 beq r13,r0,0x0019ca14
+
  0019c9f4: 11a00007 beq r13,r0,0x0019ca14 X Cap, branch to Eastern check
  0019c9f8: 00071840 sll r3,r7,0x01
+
  0019c9f8: 00071840 sll r3,r7,0x01 r3 = Range+AoE * 2
  0019c9fc: 00021040 sll r2,r2,0x01
+
 
  0019ca00: 006a1821 addu r3,r3,r10
+
<Western Linear Target Offset>
  0019ca04: 94630000 lhu r3,0x0000(r3)
+
  0019c9fc: 00021040 sll r2,r2,0x01 Y * 2
  0019ca08: 00451021 addu r2,r2,r5
+
  0019ca00: 006a1821 addu r3,r3,r10 X Offset
  0019ca0c: 0806728a j 0x0019ca28
+
  0019ca04: 94630000 lhu r3,0x0000(r3) Load X Panel
  0019ca10: 01831804 sllv r3,r3,r12
+
  0019ca08: 00451021 addu r2,r2,r5 Current Panel address
  0019ca14: 00021040 sll r2,r2,0x01
+
  0019ca0c: 0806728a j 0x0019ca28
  0019ca18: 006a1821 addu r3,r3,r10
+
  0019ca10: 01831804 sllv r3,r3,r12 Get Panel offset of Western Target
  0019ca1c: 94630000 lhu r3,0x0000(r3)
+
 
  0019ca20: 00451021 addu r2,r2,r5
+
<Eastern Linear Target Offset>
  0019ca24: 01631807 srav r3,r3,r11
+
  0019ca14: 00021040 sll r2,r2,0x01 Y * 2
  0019ca28: a4430b4c sh r3,0x0b4c(r2)
+
  0019ca18: 006a1821 addu r3,r3,r10 X Offset
  0019ca2c: 24c60001 addiu r6,r6,0x0001
+
  0019ca1c: 94630000 lhu r3,0x0000(r3) Load X Panel
  0019ca30: 0106102a slt r2,r8,r6
+
  0019ca20: 00451021 addu r2,r2,r5 Current Panel Address
  0019ca34: 1040ffec beq r2,r0,0x0019c9e8
+
  0019ca24: 01631807 srav r3,r3,r11 Get Panel offset of Eastern Target
  0019ca38: 24e7ffff addiu r7,r7,0xffff
+
 
  0019ca3c: 1900001f blez r8,0x0019cabc Branch if Range+AoE is negative
+
<W/E Loop End>
  0019ca40: 34060001 ori r6,r0,0x0001
+
  0019ca28: a4430b4c sh r3,0x0b4c(r2) Save to Linear Panel Flags
  0019ca44: 288c0008 slti r12,r4,0x0008
+
  0019ca2c: 24c60001 addiu r6,r6,0x0001 Linear Counter++
 +
  0019ca30: 0106102a slt r2,r8,r6
 +
  0019ca34: 1040ffec beq r2,r0,0x0019c9e8 Loop for all targets in Linear
 +
  0019ca38: 24e7ffff addiu r7,r7,0xffff RangeAoE--
 +
 +
  0019ca3c: 1900001f blez r8,0x0019cabc <Linear Check> if Range+AoE is zero or negative
 +
  0019ca40: 34060001 ori r6,r0,0x0001 r6 = 1
 +
 
 +
<North and South Linear (Y+-)>
 +
  0019ca44: 288c0008 slti r12,r4,0x0008 Set r12 if Y is less than 8
 
  0019ca48: 3c07801a lui r7,0x801a
 
  0019ca48: 3c07801a lui r7,0x801a
  0019ca4c: 24e7f2f8 addiu r7,r7,0xf2f8
+
  0019ca4c: 24e7f2f8 addiu r7,r7,0xf2f8 r7 = 0x8019f2f8
 
  0019ca50: 34020007 ori r2,r0,0x0007
 
  0019ca50: 34020007 ori r2,r0,0x0007
  0019ca54: 00445823 subu r11,r2,r4
+
  0019ca54: 00445823 subu r11,r2,r4 r11 = 7 - Y (North)
  0019ca58: 248afff9 addiu r10,r4,0xfff9
+
  0019ca58: 248afff9 addiu r10,r4,0xfff9 r10 = Y - 7 (South)
  0019ca5c: 2504ffff addiu r4,r8,0xffff
+
  0019ca5c: 2504ffff addiu r4,r8,0xffff r4 = RangeAoe - 1 (?)
 
+
   
  <Linear>
 
 
  0019ca60: 90a20e3b lbu r2,0x0e3b(r5) Load Max Y
 
  0019ca60: 90a20e3b lbu r2,0x0e3b(r5) Load Max Y
  0019ca64: 01261821 addu r3,r9,r6
+
  0019ca64: 01261821 addu r3,r9,r6 r3 = Caster Y + 1
 
  0019ca68: 0062102a slt r2,r3,r2
 
  0019ca68: 0062102a slt r2,r3,r2
  0019ca6c: 10400013 beq r2,r0,0x0019cabc <Linear Check> if false
+
  0019ca6c: 10400013 beq r2,r0,0x0019cabc <Linear Check> if Caster Y > Max Y
 
  0019ca70: 00000000 nop
 
  0019ca70: 00000000 nop
  0019ca74: 11800007 beq r12,r0,0x0019ca94
+
  0019ca74: 11800007 beq r12,r0,0x0019ca94 <Southern Linear Target Offset> if Y < 8
  0019ca78: 00031040 sll r2,r3,0x01
+
  0019ca78: 00031040 sll r2,r3,0x01 Caster Y * 2
  
 +
<Northern Linear Target Offset>
 
  0019ca7c: 00041840 sll r3,r4,0x01
 
  0019ca7c: 00041840 sll r3,r4,0x01
 
  0019ca80: 00671821 addu r3,r3,r7
 
  0019ca80: 00671821 addu r3,r3,r7
  0019ca84: 94630000 lhu r3,0x0000(r3)
+
  0019ca84: 94630000 lhu r3,0x0000(r3) Load Y
 
  0019ca88: 00451021 addu r2,r2,r5
 
  0019ca88: 00451021 addu r2,r2,r5
  0019ca8c: 080672aa j 0x0019caa8
+
  0019ca8c: 080672aa j 0x0019caa8 Jump to N/S Loop End
  0019ca90: 01631804 sllv r3,r3,r11 Target Priority >> r11
+
  0019ca90: 01631804 sllv r3,r3,r11 r3 = Y >> 7-Y (North)
  
  0019ca94: 00041840 sll r3,r4,0x01
+
<Southern Linear Target Offset>
 +
  0019ca94: 00041840 sll r3,r4,0x01 RangeAoE * 2
 
  0019ca98: 00671821 addu r3,r3,r7
 
  0019ca98: 00671821 addu r3,r3,r7
  0019ca9c: 94630000 lhu r3,0x0000(r3)
+
  0019ca9c: 94630000 lhu r3,0x0000(r3) Load Y
 
  0019caa0: 00451021 addu r2,r2,r5
 
  0019caa0: 00451021 addu r2,r2,r5
  0019caa4: 01431807 srav r3,r3,r10 Target Priority << r10
+
  0019caa4: 01431807 srav r3,r3,r10 r3 = Y >> Y-7 (South)
  
  0019caa8: a4430b4c sh r3,0x0b4c(r2)
+
<N/S Loop End>
 +
  0019caa8: a4430b4c sh r3,0x0b4c(r2) Save Y Offset
 
  0019caac: 24c60001 addiu r6,r6,0x0001
 
  0019caac: 24c60001 addiu r6,r6,0x0001
 
  0019cab0: 0106102a slt r2,r8,r6
 
  0019cab0: 0106102a slt r2,r8,r6
 
  0019cab4: 1040ffea beq r2,r0,0x0019ca60 Loop for all cells in Linear Range
 
  0019cab4: 1040ffea beq r2,r0,0x0019ca60 Loop for all cells in Linear Range
  0019cab8: 2484ffff addiu r4,r4,0xffff
+
  0019cab8: 2484ffff addiu r4,r4,0xffff X Counter--
  
 
  <Linear Check>
 
  <Linear Check>
Line 137: Line 168:
 
  0019cac8: 1040002a beq r2,r0,0x0019cb74 <Exit> if not Linear
 
  0019cac8: 1040002a beq r2,r0,0x0019cb74 <Exit> if not Linear
 
  0019cacc: 00000000 nop
 
  0019cacc: 00000000 nop
 
+
 
  0019cad0: 90a20e3b lbu r2,0x0e3b(r5) Load Max Y
 
  0019cad0: 90a20e3b lbu r2,0x0e3b(r5) Load Max Y
 
  0019cad4: 00000000 nop
 
  0019cad4: 00000000 nop
Line 143: Line 174:
 
  0019cadc: 00004821 addu r9,r0,r0
 
  0019cadc: 00004821 addu r9,r0,r0
 
  0019cae0: 340a8000 ori r10,r0,0x8000 r10 = 0x8000
 
  0019cae0: 340a8000 ori r10,r0,0x8000 r10 = 0x8000
  0019cae4: 00a04021 addu r8,r5,r0
+
  0019cae4: 00a04021 addu r8,r5,r0 r8 = Offset
  
 
  <Y Loop>
 
  <Y Loop>
  0019cae8: 95060b4c lhu r6,0x0b4c(r8)
+
  0019cae8: 95060b4c lhu r6,0x0b4c(r8) Load Panel Offset?
 
  0019caec: 00000000 nop
 
  0019caec: 00000000 nop
  0019caf0: 10c0001b beq r6,r0,0x0019cb60
+
  0019caf0: 10c0001b beq r6,r0,0x0019cb60 Next if no panel
 
  0019caf4: 00000000 nop
 
  0019caf4: 00000000 nop
 
  0019caf8: 90a20e3a lbu r2,0x0e3a(r5) Load Max X
 
  0019caf8: 90a20e3a lbu r2,0x0e3a(r5) Load Max X
Line 159: Line 190:
 
  <X Loop>
 
  <X Loop>
 
  0019cb10: 30428000 andi r2,r2,0x8000
 
  0019cb10: 30428000 andi r2,r2,0x8000
  0019cb14: 1040000d beq r2,r0,0x0019cb4c Branch if cell doesn't have a targetable unit
+
  0019cb14: 1040000d beq r2,r0,0x0019cb4c <X++> if cell doesn't have a targetable unit
 
  0019cb18: 00000000 nop
 
  0019cb18: 00000000 nop
  0019cb1c: 90a20c74 lbu r2,0x0c74(r5)
+
  0019cb1c: 90a20c74 lbu r2,0x0c74(r5) Load Caster? X
 
  0019cb20: 00000000 nop
 
  0019cb20: 00000000 nop
  0019cb24: 10820009 beq r4,r2,0x0019cb4c
+
  0019cb24: 10820009 beq r4,r2,0x0019cb4c <X++> if current X
 
  0019cb28: 00000000 nop
 
  0019cb28: 00000000 nop
  0019cb2c: 90a20c76 lbu r2,0x0c76(r5)
+
  0019cb2c: 90a20c76 lbu r2,0x0c76(r5) Load Caster? Y
 
  0019cb30: 00000000 nop
 
  0019cb30: 00000000 nop
  0019cb34: 11220005 beq r9,r2,0x0019cb4c
+
  0019cb34: 11220005 beq r9,r2,0x0019cb4c <X++> if current Y
  0019cb38: 008a1807 srav r3,r10,r4
+
 
+
  0019cb38: 008a1807 srav r3,r10,r4 0x8000 >> X
  0019cb3c: 94e20b4c lhu r2,0x0b4c(r7)
+
  0019cb3c: 94e20b4c lhu r2,0x0b4c(r7) Load Linear Panel Flag
 
  0019cb40: 00000000 nop
 
  0019cb40: 00000000 nop
  0019cb44: 00431026 xor r2,r2,r3
+
  0019cb44: 00431026 xor r2,r2,r3 Unflag all panels that are not in the Linear path
  0019cb48: a4e20b4c sh r2,0x0b4c(r7)
+
  0019cb48: a4e20b4c sh r2,0x0b4c(r7) Save to Linear Panel Flag
  
 
  <X++>
 
  <X++>

Revision as of 14:21, 29 October 2022

Check if Linear Abiilty hits anything (AI)

Note: The main routine (19b30c) that uses this routine sets r4 as 3 and r5 as 0.

r4 = 0 = Load Range, 1 = Load AoE, 2 = Load both Range and AoE r5 = Range + AoE?

Assumptions: X+ = East X- = West Y+ = North Y- = South

0019c8ec: 27bdffd8 addiu r29,r29,0xffd8
0019c8f0: 00a04021 addu r8,r5,r0					r8 = Preset
0019c8f4: 3c05801a lui r5,0x801a
0019c8f8: 24a5f3c4 addiu r5,r5,0xf3c4				r5 = Unit AI Data Pointer
0019c8fc: 34020001 ori r2,r0,0x0001
0019c900: 10820011 beq r4,r2,0x0019c948				Branch to AoE if 1
0019c904: afbf0020 sw r31,0x0020(r29)
0019c908: 28820002 slti r2,r4,0x0002
0019c90c: 10400005 beq r2,r0,0x0019c924				Branch to Next PV Check if PV > 1
0019c910: 00000000 nop

0019c914: 10800008 beq r4,r0,0x0019c938				<Check Range> if PV = 0
0019c918: 29020010 slti r2,r8,0x0010				Set if Range/AoE < 0x0010
0019c91c: 0806725d j 0x0019c974						Skip to Branch
0019c920: 00000000 nop

0019c924: 34020002 ori r2,r0,0x0002
0019c928: 1082000b beq r4,r2,0x0019c958				Skip to Range + AoE Check if 2
0019c92c: 29020010 slti r2,r8,0x0010				Set false if Preset was less than 0x000f
0019c930: 0806725d j 0x0019c974                     Skip to Branch
0019c934: 00000000 nop
<Range>
0019c938: 3c08801a lui r8,0x801a
0019c93c: 9108f3c8 lbu r8,-0x0c38(r8)				Load Range
0019c940: 0806725d j 0x0019c974
0019c944: 29020010 slti r2,r8,0x0010				Set if Range is less than 16
<AoE>
0019c948: 3c08801a lui r8,0x801a
0019c94c: 9108f3c9 lbu r8,-0x0c37(r8)				Load AoE
0019c950: 0806725d j 0x0019c974
0019c954: 29020010 slti r2,r8,0x0010				Set if AoE is less than 16
<AoE + Range>
0019c958: 3c03801a lui r3,0x801a
0019c95c: 9063f3c8 lbu r3,-0x0c38(r3)				Load Range
0019c960: 3c02801a lui r2,0x801a
0019c964: 9042f3c9 lbu r2,-0x0c37(r2)				Load AoE
0019c968: 00000000 nop
0019c96c: 00624021 addu r8,r3,r2					Range + AoE
0019c970: 29020010 slti r2,r8,0x0010
0019c974: 1440000c bne r2,r0,0x0019c9a8				Branch if Range + AoE combined is less than 16 (0x0010)
0019c978: 34060011 ori r6,r0,0x0011
<Set all linear panels as negative>
0019c97c: 00003021 addu r6,r0,r0					reset r6
0019c980: 3403ffff ori r3,r0,0xffff					r3 = -1
0019c984: 00a02021 addu r4,r5,r0					r4 = Unit AI Data Pointer

0019c988: a4830b4c sh r3,0x0b4c(r4)					Set (Working) Linear Panel as -1 (fail)
0019c98c: a4830b70 sh r3,0x0b70(r4)					Set (Resulting) Linear Panel as -1 (fail)
0019c990: 24c60001 addiu r6,r6,0x0001
0019c994: 28c20012 slti r2,r6,0x0012
0019c998: 1440fffb bne r2,r0,0x0019c988				Loop for all panels
0019c99c: 24840002 addiu r4,r4,0x0002				Linear Panels Flags++
0019c9a0: 080672e1 j 0x0019cb84						Exit Routine (Set Linear Flags as failed)
0019c9a4: 00000000 nop

0019c9a8: 24a20022 addiu r2,r5,0x0022
0019c9ac: a4400b4c sh r0,0x0b4c(r2)
0019c9b0: 24c6ffff addiu r6,r6,0xffff
0019c9b4: 04c1fffd bgez r6,0x0019c9ac				Reset all Panels
0019c9b8: 2442fffe addiu r2,r2,0xfffe

0019c9bc: 90a90c76 lbu r9,0x0c76(r5)				r9 = Load Caster? Y
0019c9c0: 90a40c74 lbu r4,0x0c74(r5)				r4 = Load Caster? X
0019c9c4: 0500001d bltz r8,0x0019ca3c				Branch if Range+AoE is negative
0019c9c8: 00003021 addu r6,r0,r0
<Western and Eastern Linear (X+-)>
0019c9cc: 288d0008 slti r13,r4,0x0008				Set r13 if X is less than 8
0019c9d0: 3c0a801a lui r10,0x801a
0019c9d4: 254af2f8 addiu r10,r10,0xf2f8				r10 = 0x8019f2f8
0019c9d8: 34020007 ori r2,r0,0x0007
0019c9dc: 00446023 subu r12,r2,r4					r12 = 7 - X (West)
0019c9e0: 248bfff9 addiu r11,r4,0xfff9				r11 = X - 7 (East)
0019c9e4: 01003821 addu r7,r8,r0					r7 = Range + AoE

0019c9e8: 01261023 subu r2,r9,r6					Y - Counter
0019c9ec: 04400013 bltz r2,0x0019ca3c				Y Cap, branch to RangeAoE check
0019c9f0: 00000000 nop
0019c9f4: 11a00007 beq r13,r0,0x0019ca14			X Cap, branch to Eastern check
0019c9f8: 00071840 sll r3,r7,0x01					r3 = Range+AoE * 2
<Western Linear Target Offset>
0019c9fc: 00021040 sll r2,r2,0x01					Y * 2
0019ca00: 006a1821 addu r3,r3,r10					X Offset
0019ca04: 94630000 lhu r3,0x0000(r3)				Load X Panel 
0019ca08: 00451021 addu r2,r2,r5					Current Panel address
0019ca0c: 0806728a j 0x0019ca28						
0019ca10: 01831804 sllv r3,r3,r12					Get Panel offset of Western Target
<Eastern Linear Target Offset>
0019ca14: 00021040 sll r2,r2,0x01					Y * 2
0019ca18: 006a1821 addu r3,r3,r10					X Offset
0019ca1c: 94630000 lhu r3,0x0000(r3)				Load X Panel
0019ca20: 00451021 addu r2,r2,r5					Current Panel Address
0019ca24: 01631807 srav r3,r3,r11					Get Panel offset of Eastern Target
<W/E Loop End>
0019ca28: a4430b4c sh r3,0x0b4c(r2)					Save to Linear Panel Flags
0019ca2c: 24c60001 addiu r6,r6,0x0001				Linear Counter++
0019ca30: 0106102a slt r2,r8,r6						
0019ca34: 1040ffec beq r2,r0,0x0019c9e8				Loop for all targets in Linear
0019ca38: 24e7ffff addiu r7,r7,0xffff				RangeAoE--

0019ca3c: 1900001f blez r8,0x0019cabc				<Linear Check> if Range+AoE is zero or negative
0019ca40: 34060001 ori r6,r0,0x0001					r6 = 1
<North and South Linear (Y+-)>
0019ca44: 288c0008 slti r12,r4,0x0008 				Set r12 if Y is less than 8
0019ca48: 3c07801a lui r7,0x801a
0019ca4c: 24e7f2f8 addiu r7,r7,0xf2f8				r7 = 0x8019f2f8
0019ca50: 34020007 ori r2,r0,0x0007
0019ca54: 00445823 subu r11,r2,r4					r11 = 7 - Y (North)
0019ca58: 248afff9 addiu r10,r4,0xfff9				r10 = Y - 7 (South)
0019ca5c: 2504ffff addiu r4,r8,0xffff				r4 = RangeAoe - 1 (?)

0019ca60: 90a20e3b lbu r2,0x0e3b(r5)				Load Max Y
0019ca64: 01261821 addu r3,r9,r6					r3 = Caster Y + 1
0019ca68: 0062102a slt r2,r3,r2
0019ca6c: 10400013 beq r2,r0,0x0019cabc				<Linear Check> if Caster Y > Max Y
0019ca70: 00000000 nop
0019ca74: 11800007 beq r12,r0,0x0019ca94			<Southern Linear Target Offset> if Y < 8
0019ca78: 00031040 sll r2,r3,0x01					Caster Y * 2
<Northern Linear Target Offset>
0019ca7c: 00041840 sll r3,r4,0x01
0019ca80: 00671821 addu r3,r3,r7
0019ca84: 94630000 lhu r3,0x0000(r3)				Load Y
0019ca88: 00451021 addu r2,r2,r5
0019ca8c: 080672aa j 0x0019caa8						Jump to N/S Loop End
0019ca90: 01631804 sllv r3,r3,r11					r3 = Y >> 7-Y (North)
<Southern Linear Target Offset>
0019ca94: 00041840 sll r3,r4,0x01					RangeAoE * 2
0019ca98: 00671821 addu r3,r3,r7
0019ca9c: 94630000 lhu r3,0x0000(r3)				Load Y
0019caa0: 00451021 addu r2,r2,r5
0019caa4: 01431807 srav r3,r3,r10					r3 = Y >> Y-7 (South)
<N/S Loop End>
0019caa8: a4430b4c sh r3,0x0b4c(r2)					Save Y Offset
0019caac: 24c60001 addiu r6,r6,0x0001
0019cab0: 0106102a slt r2,r8,r6
0019cab4: 1040ffea beq r2,r0,0x0019ca60				Loop for all cells in Linear Range
0019cab8: 2484ffff addiu r4,r4,0xffff				X Counter--
<Linear Check>
0019cabc: 8ca2000c lw r2,0x000c(r5)					Load AI Flags
0019cac0: 3c030020 lui r3,0x0020
0019cac4: 00431024 and r2,r2,r3
0019cac8: 1040002a beq r2,r0,0x0019cb74				<Exit> if not Linear
0019cacc: 00000000 nop

0019cad0: 90a20e3b lbu r2,0x0e3b(r5)				Load Max Y
0019cad4: 00000000 nop
0019cad8: 18400026 blez r2,0x0019cb74				<Exit> if Max Y is negative
0019cadc: 00004821 addu r9,r0,r0
0019cae0: 340a8000 ori r10,r0,0x8000				r10 = 0x8000
0019cae4: 00a04021 addu r8,r5,r0					r8 = Offset
<Y Loop>
0019cae8: 95060b4c lhu r6,0x0b4c(r8)				Load Panel Offset?
0019caec: 00000000 nop
0019caf0: 10c0001b beq r6,r0,0x0019cb60				Next if no panel
0019caf4: 00000000 nop
0019caf8: 90a20e3a lbu r2,0x0e3a(r5)				Load Max X
0019cafc: 00000000 nop
0019cb00: 18400017 blez r2,0x0019cb60				Y++ if Max X is negative
0019cb04: 00002021 addu r4,r0,r0
0019cb08: 01003821 addu r7,r8,r0
0019cb0c: 00861004 sllv r2,r6,r4
<X Loop>
0019cb10: 30428000 andi r2,r2,0x8000
0019cb14: 1040000d beq r2,r0,0x0019cb4c				<X++> if cell doesn't have a targetable unit
0019cb18: 00000000 nop
0019cb1c: 90a20c74 lbu r2,0x0c74(r5)				Load Caster? X
0019cb20: 00000000 nop
0019cb24: 10820009 beq r4,r2,0x0019cb4c				<X++> if current X
0019cb28: 00000000 nop
0019cb2c: 90a20c76 lbu r2,0x0c76(r5)				Load Caster? Y
0019cb30: 00000000 nop
0019cb34: 11220005 beq r9,r2,0x0019cb4c				<X++> if current Y

0019cb38: 008a1807 srav r3,r10,r4					0x8000 >> X
0019cb3c: 94e20b4c lhu r2,0x0b4c(r7)				Load Linear Panel Flag
0019cb40: 00000000 nop
0019cb44: 00431026 xor r2,r2,r3						Unflag all panels that are not in the Linear path
0019cb48: a4e20b4c sh r2,0x0b4c(r7)					Save to Linear Panel Flag
<X++>
0019cb4c: 90a20e3a lbu r2,0x0e3a(r5)				Load Max X
0019cb50: 24840001 addiu r4,r4,0x0001				X++
0019cb54: 0082102a slt r2,r4,r2
0019cb58: 1440ffed bne r2,r0,0x0019cb10				Loop until Max X
0019cb5c: 00861004 sllv r2,r6,r4
<Y++>
0019cb60: 90a20e3b lbu r2,0x0e3b(r5)				Load Max Y
0019cb64: 25290001 addiu r9,r9,0x0001				Y++
0019cb68: 0122102a slt r2,r9,r2
0019cb6c: 1440ffde bne r2,r0,0x0019cae8				Loop until Max Y
0019cb70: 25080002 addiu r8,r8,0x0002
<Exit>
0019cb74: 24a40b70 addiu r4,r5,0x0b70
0019cb78: 24a50b4c addiu r5,r5,0x0b4c
0019cb7c: 0c066ac2 jal 0x0019ab08					Transfer Halfword Values
0019cb80: 34060024 ori r6,r0,0x0024
0019cb84: 8fbf0020 lw r31,0x0020(r29)
0019cb88: 27bd0028 addiu r29,r29,0x0028
0019cb8c: 03e00008 jr r31
0019cb90: 00000000 nop