Difference between revisions of "Arc Range Calculation Routine"

From Final Fantasy Hacktics Wiki
Jump to navigation Jump to search
m
m (tabs -> spaces)
Line 2: Line 2:
  
 
<pre>
 
<pre>
Calculate Arc Range
 
r4 = Caster Data
 
r5 = Weapon Range
 
001798b0:
 
 
00000000: 27bdffd0 addiu r29,r29,-0x0030
 
00000000: 27bdffd0 addiu r29,r29,-0x0030
 
00000004: afb00020 sw r16,0x0020(r29)
 
00000004: afb00020 sw r16,0x0020(r29)
00000008: 00808021 addu r16,r4,r0 r16 = Caster Data
+
00000008: 00808021 addu r16,r4,r0               r16 = Caster Data
 
0000000c: afb10024 sw r17,0x0024(r29)
 
0000000c: afb10024 sw r17,0x0024(r29)
 
00000010: afbf0028 sw r31,0x0028(r29)
 
00000010: afbf0028 sw r31,0x0028(r29)
00000014: 0c05e5ed jal 0x001797b4 Caster Height from Water Supports and Float
+
00000014: 0c05e5ed jal 0x001797b4               Caster Height from Water Supports and Float
00000018: 00a08821 addu r17,r5,r0 r17 = Weapon Range
+
00000018: 00a08821 addu r17,r5,r0               r17 = Weapon Range
0000001c: 00401821 addu r3,r2,r0 r3 = Height Value (Return)
+
0000001c: 00401821 addu r3,r2,r0               r3 = Height Value (Return)
00000020: 920c0047 lbu r12,0x0047(r16) r12 = Caster X
+
00000020: 920c0047 lbu r12,0x0047(r16)         r12 = Caster X
 
00000024: 3c02800e lui r2,0x800e
 
00000024: 3c02800e lui r2,0x800e
00000028: 90424ea0 lbu r2,0x4ea0(r2) r2 = Max Map Y
+
00000028: 90424ea0 lbu r2,0x4ea0(r2)           r2 = Max Map Y
0000002c: 920d0048 lbu r13,0x0048(r16) r13 = Caster Y
+
0000002c: 920d0048 lbu r13,0x0048(r16)         r13 = Caster Y
00000030: 18400049 blez r2,0x00000158 Exit if Max Y is negative
+
00000030: 18400049 blez r2,0x00000158           Exit if Max Y is negative
00000034: 00004821 addu r9,r0,r0 r9 = Y Counter
+
00000034: 00004821 addu r9,r0,r0               r9 = Y Counter
 
00000038: 3c108019 lui r16,0x8019
 
00000038: 3c108019 lui r16,0x8019
0000003c: 2610f8cc addiu r16,r16,-0x0734 r16 = Tile Data (18f8cc)
+
0000003c: 2610f8cc addiu r16,r16,-0x0734       r16 = Tile Data (18f8cc)
00000040: 306e00ff andi r14,r3,0x00ff r14 = Height Value
+
00000040: 306e00ff andi r14,r3,0x00ff           r14 = Height Value
00000044: 322500ff andi r5,r17,0x00ff r5 = Weapon Range
+
00000044: 322500ff andi r5,r17,0x00ff           r5 = Weapon Range
00000048: 340f0001 ori r15,r0,0x0001 r15 = 0x0001
+
00000048: 340f0001 ori r15,r0,0x0001           r15 = 0x0001
0000004c: 01a9102a slt r2,r13,r9 If Caster Y < Y Counter
+
0000004c: 01a9102a slt r2,r13,r9               If Caster Y < Y Counter
00000050: 14400002 bne r2,r0,0x0000005c Branch if True
+
00000050: 14400002 bne r2,r0,0x0000005c         Branch if True
00000054: 012d5823 subu r11,r9,r13 r11 = Y Counter - Caster Y
+
00000054: 012d5823 subu r11,r9,r13             r11 = Y Counter - Caster Y
00000058: 01a95823 subu r11,r13,r9 r11 = Caster Y - Y Counter
+
00000058: 01a95823 subu r11,r13,r9             r11 = Caster Y - Y Counter
 
0000005c: 3c02800e lui r2,0x800e
 
0000005c: 3c02800e lui r2,0x800e
00000060: 90424e9c lbu r2,0x4e9c(r2) r2 = Max Map X
+
00000060: 90424e9c lbu r2,0x4e9c(r2)           r2 = Max Map X
 
00000064: 00000000 nop
 
00000064: 00000000 nop
00000068: 18400035 blez r2,0x00000140 Branch if Max X is negative
+
00000068: 18400035 blez r2,0x00000140           Branch if Max X is negative
0000006c: 00004021 addu r8,r0,r0 r8 = X Counter
+
0000006c: 00004021 addu r8,r0,r0               r8 = X Counter
00000070: 0188102a slt r2,r12,r8 If Caster X < X Counter
+
00000070: 0188102a slt r2,r12,r8               If Caster X < X Counter
00000074: 14400002 bne r2,r0,0x00000080 Branch if true
+
00000074: 14400002 bne r2,r0,0x00000080         Branch if true
00000078: 010c1023 subu r2,r8,r12 r2 = X Counter - Caster X
+
00000078: 010c1023 subu r2,r8,r12               r2 = X Counter - Caster X
0000007c: 01881023 subu r2,r12,r8 r2 = Caster X - Counter X
+
0000007c: 01881023 subu r2,r12,r8               r2 = Caster X - Counter X
00000080: 004b5021 addu r10,r2,r11 r10 = Caster X- + Caster Y-
+
00000080: 004b5021 addu r10,r2,r11             r10 = Caster X- + Caster Y-
00000084: 29420003 slti r2,r10,0x0003 If Difference(r10) < 3
+
00000084: 29420003 slti r2,r10,0x0003           If Difference(r10) < 3
00000088: 14400027 bne r2,r0,0x00000128 Branch if True
+
00000088: 14400027 bne r2,r0,0x00000128         Branch if True
 
0000008c: 00000000 nop
 
0000008c: 00000000 nop
00000090: 00003821 addu r7,r0,r0 r7 = Tile Counter
+
00000090: 00003821 addu r7,r0,r0               r7 = Tile Counter
 
00000094: 3c02800e lui r2,0x800e
 
00000094: 3c02800e lui r2,0x800e
00000098: 90424e9c lbu r2,0x4e9c(r2) r2 = Max Map X
+
00000098: 90424e9c lbu r2,0x4e9c(r2)           r2 = Max Map X
 
0000009c: 00000000 nop
 
0000009c: 00000000 nop
000000a0: 01220018 mult r9,r2 Y Counter * Max X
+
000000a0: 01220018 mult r9,r2                   Y Counter * Max X
 
000000a4: 00071a00 sll r3,r7,0x08
 
000000a4: 00071a00 sll r3,r7,0x08
 
000000a8: 00001012 mflo r2
 
000000a8: 00001012 mflo r2
000000ac: 00621821 addu r3,r3,r2 Y Counter * Max X + Tile Counter
+
000000ac: 00621821 addu r3,r3,r2               Y Counter * Max X + Tile Counter
000000b0: 00683021 addu r6,r3,r8 r6 = Y Counter * Max X + Tile Counter + X Counter
+
000000b0: 00683021 addu r6,r3,r8               r6 = Y Counter * Max X + Tile Counter + X Counter
 
000000b4: 000610c0 sll r2,r6,0x03
 
000000b4: 000610c0 sll r2,r6,0x03
000000b8: 00501021 addu r2,r2,r16 r2 = Caster Tile Data
+
000000b8: 00501021 addu r2,r2,r16               r2 = Caster Tile Data
000000bc: 90430002 lbu r3,0x0002(r2) Caster Tile's Height
+
000000bc: 90430002 lbu r3,0x0002(r2)           Caster Tile's Height
 
000000c0: 90440003 lbu r4,0x0003(r2)            Caster Tile's Height (halves)
 
000000c0: 90440003 lbu r4,0x0003(r2)            Caster Tile's Height (halves)
 
000000c4: 90420003 lbu r2,0x0003(r2)            Caster Tile's Height (halves)
 
000000c4: 90420003 lbu r2,0x0003(r2)            Caster Tile's Height (halves)
 
000000c8: 00031840 sll r3,r3,0x01
 
000000c8: 00031840 sll r3,r3,0x01
000000cc: 3084001f andi r4,r4,0x001f Ignore Depth
+
000000cc: 3084001f andi r4,r4,0x001f           Ignore Depth
000000d0: 00641821 addu r3,r3,r4 Height + Height(halves)
+
000000d0: 00641821 addu r3,r3,r4               Height + Height(halves)
000000d4: 00021142 srl r2,r2,0x05 Ignore Halves
+
000000d4: 00021142 srl r2,r2,0x05               Ignore Halves
000000d8: 00021040 sll r2,r2,0x01
+
000000d8: 00021040 sll r2,r2,0x01              
000000dc: 00621821 addu r3,r3,r2 r3 = Height + Halves + Depth
+
000000dc: 00621821 addu r3,r3,r2               r3 = Height + Halves + Depth
000000e0: 306300ff andi r3,r3,0x00ff r3 = Non Zero Height
+
000000e0: 306300ff andi r3,r3,0x00ff           r3 = Non Zero Height
000000e4: 01c31023 subu r2,r14,r3 r2 = Height(Float/Water Supports) - Height(normal)
+
000000e4: 01c31023 subu r2,r14,r3               r2 = Height(Float/Water Supports) - Height(normal)
000000e8: 04410002 bgez r2,0x000000f4 Branch if difference isn't negative
+
000000e8: 04410002 bgez r2,0x000000f4           Branch if difference isn't negative
 
000000ec: 00000000 nop
 
000000ec: 00000000 nop
000000f0: 24420003 addiu r2,r2,0x0003 r2 = 0x0003
+
000000f0: 24420003 addiu r2,r2,0x0003           r2 = 0x0003
 
000000f4: 00021083 sra r2,r2,0x02
 
000000f4: 00021083 sra r2,r2,0x02
000000f8: 01421023 subu r2,r10,r2 r2 = (Caster X- + Caster Y-) - Height
+
000000f8: 01421023 subu r2,r10,r2               r2 = (Caster X- + Caster Y-) - Height
000000fc: 00a2102a slt r2,r5,r2 If Weapon Range < Height Value
+
000000fc: 00a2102a slt r2,r5,r2                 If Weapon Range < Height Value
00000100: 14400006 bne r2,r0,0x0000011c Branch if True
+
00000100: 14400006 bne r2,r0,0x0000011c         Branch if True
00000104: 24e70001 addiu r7,r7,0x0001 Tile Counter++
+
00000104: 24e70001 addiu r7,r7,0x0001           Tile Counter++
00000108: 00061080 sll r2,r6,0x02
+
00000108: 00061080 sll r2,r6,0x02              
0000010c: 00461021 addu r2,r2,r6 r2 = Current Tile Data
+
0000010c: 00461021 addu r2,r2,r6               r2 = Current Tile Data
 
00000110: 3c018019 lui r1,0x8019
 
00000110: 3c018019 lui r1,0x8019
 
00000114: 00220821 addu r1,r1,r2
 
00000114: 00220821 addu r1,r1,r2
00000118: a02f2dd8 sb r15,0x2dd8(r1) AoE = 1 to Current Tile (Tile is apart of Range)
+
00000118: a02f2dd8 sb r15,0x2dd8(r1)           AoE = 1 to Current Tile (Tile is apart of Range)
0000011c: 28e20002 slti r2,r7,0x0002 If r7 < 2
+
0000011c: 28e20002 slti r2,r7,0x0002           If r7 < 2
00000120: 1440ffdc bne r2,r0,0x00000094 Branch if True (Repeat for High Tile)
+
00000120: 1440ffdc bne r2,r0,0x00000094         Branch if True (Repeat for High Tile)
 
00000124: 00000000 nop
 
00000124: 00000000 nop
 
00000128: 3c02800e lui r2,0x800e
 
00000128: 3c02800e lui r2,0x800e
0000012c: 90424e9c lbu r2,0x4e9c(r2) r2 = Max Map X
+
0000012c: 90424e9c lbu r2,0x4e9c(r2)           r2 = Max Map X
00000130: 25080001 addiu r8,r8,0x0001 X Counter++
+
00000130: 25080001 addiu r8,r8,0x0001           X Counter++
00000134: 0102102a slt r2,r8,r2 If X Counter < Max X
+
00000134: 0102102a slt r2,r8,r2                 If X Counter < Max X
00000138: 1440ffce bne r2,r0,0x00000074 Branch Back if True
+
00000138: 1440ffce bne r2,r0,0x00000074         Branch Back if True
0000013c: 0188102a slt r2,r12,r8 If Caster X < X Counter
+
0000013c: 0188102a slt r2,r12,r8               If Caster X < X Counter
 
00000140: 3c02800e lui r2,0x800e
 
00000140: 3c02800e lui r2,0x800e
00000144: 90424ea0 lbu r2,0x4ea0(r2) r2 = Max Map Y
+
00000144: 90424ea0 lbu r2,0x4ea0(r2)           r2 = Max Map Y
00000148: 25290001 addiu r9,r9,0x0001 Y Counter++
+
00000148: 25290001 addiu r9,r9,0x0001           Y Counter++
0000014c: 0122102a slt r2,r9,r2 If Y Counter < Max Y
+
0000014c: 0122102a slt r2,r9,r2                 If Y Counter < Max Y
00000150: 1440ffbf bne r2,r0,0x00000050 Branch Back if True
+
00000150: 1440ffbf bne r2,r0,0x00000050         Branch Back if True
00000154: 01a9102a slt r2,r13,r9 If Caster Y < Y Counter
+
00000154: 01a9102a slt r2,r13,r9               If Caster Y < Y Counter
 
00000158: 8fbf0028 lw r31,0x0028(r29)
 
00000158: 8fbf0028 lw r31,0x0028(r29)
 
0000015c: 8fb10024 lw r17,0x0024(r29)
 
0000015c: 8fb10024 lw r17,0x0024(r29)

Revision as of 21:02, 15 January 2019

ASM duplicate of Set initial panels.
00000000: 27bdffd0 addiu r29,r29,-0x0030
00000004: afb00020 sw r16,0x0020(r29)
00000008: 00808021 addu r16,r4,r0               r16 = Caster Data
0000000c: afb10024 sw r17,0x0024(r29)
00000010: afbf0028 sw r31,0x0028(r29)
00000014: 0c05e5ed jal 0x001797b4               Caster Height from Water Supports and Float
00000018: 00a08821 addu r17,r5,r0               r17 = Weapon Range
0000001c: 00401821 addu r3,r2,r0                r3 = Height Value (Return)
00000020: 920c0047 lbu r12,0x0047(r16)          r12 = Caster X
00000024: 3c02800e lui r2,0x800e
00000028: 90424ea0 lbu r2,0x4ea0(r2)            r2 = Max Map Y
0000002c: 920d0048 lbu r13,0x0048(r16)          r13 = Caster Y
00000030: 18400049 blez r2,0x00000158           Exit if Max Y is negative
00000034: 00004821 addu r9,r0,r0                r9 = Y Counter
00000038: 3c108019 lui r16,0x8019
0000003c: 2610f8cc addiu r16,r16,-0x0734        r16 = Tile Data (18f8cc)
00000040: 306e00ff andi r14,r3,0x00ff           r14 = Height Value
00000044: 322500ff andi r5,r17,0x00ff           r5 = Weapon Range
00000048: 340f0001 ori r15,r0,0x0001            r15 = 0x0001
0000004c: 01a9102a slt r2,r13,r9                If Caster Y < Y Counter
00000050: 14400002 bne r2,r0,0x0000005c         Branch if True
00000054: 012d5823 subu r11,r9,r13              r11 = Y Counter - Caster Y
00000058: 01a95823 subu r11,r13,r9              r11 = Caster Y - Y Counter
0000005c: 3c02800e lui r2,0x800e
00000060: 90424e9c lbu r2,0x4e9c(r2)            r2 = Max Map X
00000064: 00000000 nop
00000068: 18400035 blez r2,0x00000140           Branch if Max X is negative
0000006c: 00004021 addu r8,r0,r0                r8 = X Counter
00000070: 0188102a slt r2,r12,r8                If Caster X < X Counter
00000074: 14400002 bne r2,r0,0x00000080         Branch if true
00000078: 010c1023 subu r2,r8,r12               r2 = X Counter - Caster X
0000007c: 01881023 subu r2,r12,r8               r2 = Caster X - Counter X
00000080: 004b5021 addu r10,r2,r11              r10 = Caster X- + Caster Y-
00000084: 29420003 slti r2,r10,0x0003           If Difference(r10) < 3
00000088: 14400027 bne r2,r0,0x00000128         Branch if True
0000008c: 00000000 nop
00000090: 00003821 addu r7,r0,r0                r7 = Tile Counter
00000094: 3c02800e lui r2,0x800e
00000098: 90424e9c lbu r2,0x4e9c(r2)            r2 = Max Map X
0000009c: 00000000 nop
000000a0: 01220018 mult r9,r2                   Y Counter * Max X
000000a4: 00071a00 sll r3,r7,0x08
000000a8: 00001012 mflo r2
000000ac: 00621821 addu r3,r3,r2                Y Counter * Max X + Tile Counter
000000b0: 00683021 addu r6,r3,r8                r6 = Y Counter * Max X + Tile Counter + X Counter
000000b4: 000610c0 sll r2,r6,0x03
000000b8: 00501021 addu r2,r2,r16               r2 = Caster Tile Data
000000bc: 90430002 lbu r3,0x0002(r2)            Caster Tile's Height
000000c0: 90440003 lbu r4,0x0003(r2)            Caster Tile's Height (halves)
000000c4: 90420003 lbu r2,0x0003(r2)            Caster Tile's Height (halves)
000000c8: 00031840 sll r3,r3,0x01
000000cc: 3084001f andi r4,r4,0x001f            Ignore Depth
000000d0: 00641821 addu r3,r3,r4                Height + Height(halves)
000000d4: 00021142 srl r2,r2,0x05               Ignore Halves
000000d8: 00021040 sll r2,r2,0x01               
000000dc: 00621821 addu r3,r3,r2                r3 = Height + Halves + Depth
000000e0: 306300ff andi r3,r3,0x00ff            r3 = Non Zero Height
000000e4: 01c31023 subu r2,r14,r3               r2 = Height(Float/Water Supports) - Height(normal)
000000e8: 04410002 bgez r2,0x000000f4           Branch if difference isn't negative
000000ec: 00000000 nop
000000f0: 24420003 addiu r2,r2,0x0003           r2 = 0x0003
000000f4: 00021083 sra r2,r2,0x02
000000f8: 01421023 subu r2,r10,r2               r2 = (Caster X- + Caster Y-) - Height
000000fc: 00a2102a slt r2,r5,r2                 If Weapon Range < Height Value
00000100: 14400006 bne r2,r0,0x0000011c         Branch if True
00000104: 24e70001 addiu r7,r7,0x0001           Tile Counter++
00000108: 00061080 sll r2,r6,0x02               
0000010c: 00461021 addu r2,r2,r6                r2 = Current Tile Data
00000110: 3c018019 lui r1,0x8019
00000114: 00220821 addu r1,r1,r2
00000118: a02f2dd8 sb r15,0x2dd8(r1)            AoE = 1 to Current Tile (Tile is apart of Range)
0000011c: 28e20002 slti r2,r7,0x0002            If r7 < 2
00000120: 1440ffdc bne r2,r0,0x00000094         Branch if True (Repeat for High Tile)
00000124: 00000000 nop
00000128: 3c02800e lui r2,0x800e
0000012c: 90424e9c lbu r2,0x4e9c(r2)            r2 = Max Map X
00000130: 25080001 addiu r8,r8,0x0001           X Counter++
00000134: 0102102a slt r2,r8,r2                 If X Counter < Max X
00000138: 1440ffce bne r2,r0,0x00000074         Branch Back if True
0000013c: 0188102a slt r2,r12,r8                If Caster X < X Counter
00000140: 3c02800e lui r2,0x800e
00000144: 90424ea0 lbu r2,0x4ea0(r2)            r2 = Max Map Y
00000148: 25290001 addiu r9,r9,0x0001           Y Counter++
0000014c: 0122102a slt r2,r9,r2                 If Y Counter < Max Y
00000150: 1440ffbf bne r2,r0,0x00000050         Branch Back if True
00000154: 01a9102a slt r2,r13,r9                If Caster Y < Y Counter
00000158: 8fbf0028 lw r31,0x0028(r29)
0000015c: 8fb10024 lw r17,0x0024(r29)
00000160: 8fb00020 lw r16,0x0020(r29)
00000164: 27bd0030 addiu r29,r29,0x0030
00000168: 03e00008 jr r31
0000016c: 00000000 nop