Difference between revisions of "AI Target Unit for Direct vs Arc Attack (0019cd9c)"

From Final Fantasy Hacktics Wiki
Jump to navigation Jump to search
(Created page with "<font face='Courier New'> 0019cd9c: 3c02801a lui r2,0x801a 0019cda0: 90420d7b lbu r2,0x0d7b(r2) 0019cda4: 27bdffb8 addiu r29,r29,0xffb8 0019cda8: afb10034 sw r17,0x0034(...")
 
 
(3 intermediate revisions by 2 users not shown)
Line 1: Line 1:
<font face='Courier New'>
+
'''BATTLE.BIN''' :  - AI_Target_Unit_for_Direct_vs_Arc_Attack_(0019cd9c)
 +
Ability simulation from a given position : handle Targeting and outcome. Test all targetable tiles, compare priority score, keep the best in AI 0x34 Table
 +
------------------------------------------------------------------------------------------
 +
Parameter : Nothing
 +
Return : r2 = 0x00 Default result / No tiles to Target ( [[Set_Target_Tiles]] ) / AI 0x19bc = 0x00 (after checking priority)
 +
          r2 = -0x01 if [[VSync_call]] returns r2 > 0x1b8
 +
          r2 = -0x01 if [[Check_Set_Highest_Unit_Priority_(0019d308)]] returns r2 -0x01
 +
------------------------------------------------------------------------------------------
 +
0019cd9c: 3c02801a lui r2,0x801a            |
 +
0019cda0: 90420d7b lbu r2,0x0d7b(r2)        |{{f/load|AI 0x19b7}}
 +
0019cda4: 27bdffb8 addiu r29,r29,-0x0048    |
 +
0019cda8: afb10034 sw r17,0x0034(r29)        |
 +
0019cdac: 3c11801a lui r17,0x801a            |
 +
0019cdb0: 2631f3c4 addiu r17,r17,-0x0c3c    |{{f/adr|0x8019f3c4}}
 +
0019cdb4: afbf0044 sw r31,0x0044(r29)        |
 +
0019cdb8: afb40040 sw r20,0x0040(r29)        |
 +
0019cdbc: afb3003c sw r19,0x003c(r29)        |
 +
0019cdc0: afb20038 sw r18,0x0038(r29)        |
 +
0019cdc4: 10400015 beq r2,r0,0x0019ce1c      {{f/Cond|If AI 0x19b7 <> 0x00}}
 +
0019cdc8: afb00030 sw r16,0x0030(r29)            |
 +
0019cdcc: 3c02801a lui r2,0x801a                |
 +
0019cdd0: 90420036 lbu r2,0x0036(r2)            |{{f/load|AI 0xc72}}
 +
0019cdd4: 00000000 nop                          |
 +
0019cdd8: 10400010 beq r2,r0,0x0019ce1c          {{f/Cond|<nowiki>If AI 0xc72 = 0x00</nowiki>}} {{f/loc|<nowiki>branch to AI 0x19b7 = 0x00 Section</nowiki>}}
 +
0019cddc: 00000000 nop                          |
 +
0019cde0: 3c10801a lui r16,0x801a                |
 +
0019cde4: 9610f3ec lhu r16,-0x0c14(r16)          |{{f/load|Considered Action X coordinates}} {{f/std|AI 0x1c + 0x0c}}
 +
0019cde8: 3c13801a lui r19,0x801a                |
 +
0019cdec: 9673f3ee lhu r19,-0x0c12(r19)          |{{f/load|Considered Action Elevation}} {{f/std|AI 0x1c + 0x0e}}
 +
0019cdf0: 3c12801a lui r18,0x801a                |
 +
0019cdf4: 9652f3f0 lhu r18,-0x0c10(r18)          |{{f/load|Considered Action Y coordinates}} {{f/std|AI 0x1c + 0x10}}
 +
0019cdf8: 001310c0 sll r2,r19,0x03              |
 +
0019cdfc: 00531021 addu r2,r2,r19                |
 +
0019ce00: 00021080 sll r2,r2,0x02                |{{f/std|Elevation offset (0x24)}}
 +
0019ce04: 00511021 addu r2,r2,r17                |
 +
0019ce08: 00121840 sll r3,r18,0x01              |{{f/std|Y offset (halfword)}}
 +
0019ce0c: 00431021 addu r2,r2,r3                |
 +
0019ce10: 94540b4c lhu r20,0x0b4c(r2)            |{{f/load|Considered Action Y row flags in AI 0xb4c Table}} {{f/adr|AI 0xb4c + Elevation offset + Y row offset}}
 +
0019ce14: 0806744f j 0x0019d13c                  {{f/jump|Jump to }} {{f/loc|Check priority section}} {{f/std|Checking only one tile ?}}
 +
0019ce18: 00000000 nop                          |
 
   
 
   
  0019cd9c: 3c02801a lui r2,0x801a
+
  {{f/sec|<nowiki>=== TARGETING SECTION ===</nowiki>}}
  0019cda0: 90420d7b lbu r2,0x0d7b(r2)
+
                                              '''<nowiki>Else : AI 0x19b7 = 0x00 or AI 0x0c72 = 0x00</nowiki>'''
  0019cda4: 27bdffb8 addiu r29,r29,0xffb8
+
  0019ce1c: 0c0076ea jal 0x0001dba8                |{{f/jal|VSync_call|VSync_call}}
  0019cda8: afb10034 sw r17,0x0034(r29)
+
  0019ce20: 34040001 ori r4,r0,0x0001              |{{f/std|send 0x01}}
  0019cdac: 3c11801a lui r17,0x801a
+
  0019ce24: 284201b9 slti r2,r2,0x01b9            |
  0019cdb0: 2631f3c4 addiu r17,r17,0xf3c4
+
  0019ce28: 14400003 bne r2,r0,0x0019ce38          {{f/Cond|If Vsync call returns a value > 0x1b8}}
  0019cdb4: afbf0044 sw r31,0x0044(r29)
+
  0019ce2c: 2402ffff addiu r2,r0,-0x0001              |
  0019cdb8: afb40040 sw r20,0x0040(r29)
+
  0019ce30: 0806747d j 0x0019d1f4                      |{{f/loc|Exit }} {{f/Returns|Return -0x01}}
  0019cdbc: afb3003c sw r19,0x003c(r29)
+
  0019ce34: a2200c72 sb r0,0x0c72(r17)                 |{{f/store|No units are in range}}
  0019cdc0: afb20038 sw r18,0x0038(r29)
+
                                                  '''Else : Vsync is Ok do not abort the routine'''
  0019cdc4: 10400015 beq r2,r0,0x0019ce1c
+
0019ce38: 92220014 lbu r2,0x0014(r17)               |{{f/load|AI 0x0014}} {{f/std|Related to caster position ?}}
  0019cdc8: afb00030 sw r16,0x0030(r29)
+
  0019ce3c: 00000000 nop                              |
  0019cdcc: 3c02801a lui r2,0x801a
+
  0019ce40: 10400003 beq r2,r0,0x0019ce50              {{f/Cond|If AI 0x14 <> 0x00 }} {{f/std|Caster already is at action location ?}}
  0019cdd0: 90420036 lbu r2,0x0036(r2)
+
  0019ce44: a22019b7 sb r0,0x19b7(r17)                 |{{f/store|<nowiki>Set AI 0x19b7 = 0x00</nowiki>}}
0019cdd4: 00000000 nop
+
  0019ce48: 08067395 j 0x0019ce54                          {{f/jump|Avoid opposite section}}
  0019cdd8: 10400010 beq r2,r0,0x0019ce1c
+
  0019ce4c: 26300e30 addiu r16,r17,0x0e30                  |{{f/adr|<nowiki>r16 =  Acting Unit coordinates pointer</nowiki>}}
  0019cddc: 00000000 nop
+
                                                      '''<nowiki>Else : AI 0x14 = 0x00</nowiki>'''
  0019cde0: 3c10801a lui r16,0x801a
+
  0019ce50: 26300018 addiu r16,r17,0x0018                  |{{f/adr|<nowiki>r16 = AI 0x0018 Coordinates pointer</nowiki>}} {{f/std|Considered Tile (Destination - Best priority score)}}
  0019cde4: 9610f3ec lhu r16,-0x0c14(r16)
+
  0019ce54: 0c067c96 jal 0x0019f258                    |{{f/jal|Store units coordinates|Store units coordinates}} {{f/std|Send considered coordinates in Acting Unit Battle data (Placement simulation ?)}}
  0019cde8: 3c13801a lui r19,0x801a
+
  0019ce58: 02002021 addu r4,r16,r0                    |{{f/std|Send pointer}}
  0019cdec: 9673f3ee lhu r19,-0x0c12(r19)
+
  0019ce5c: 92220004 lbu r2,0x0004(r17)               |{{f/load|Considered Ability Range}}
  0019cdf0: 3c12801a lui r18,0x801a
+
  0019ce60: 00000000 nop                              |
  0019cdf4: 9652f3f0 lhu r18,-0x0c10(r18)
+
   
  0019cdf8: 001310c0 sll r2,r19,0x03
+
                  {{f/sec|--- Set Targetable Tiles (range > 0x00) ---}}
  0019cdfc: 00531021 addu r2,r2,r19
+
  0019ce64: 1040000b beq r2,r0,0x0019ce94              {{f/Cond|If Ability range <> 0x00}}
  0019ce00: 00021080 sll r2,r2,0x02
+
  0019ce68: 00002021 addu r4,r0,r0                    |
  0019ce04: 00511021 addu r2,r2,r17
+
0019ce6c: 0c05ea30 jal 0x0017a8c0                        |{{f/jal|Set_Target_Tiles|Set_Target_Tiles}} {{f/std|Returns 0x0 or 0x1 if There are tiles to target    -   Enable all targetable tiles around caster (Tile data byte 0x05 flag 0x40)}}
  0019ce08: 00121840 sll r3,r18,0x01
+
  0019ce70: 2624001c addiu r4,r17,0x001c                  |{{f/std|Send }} {{f/adr|AI 0x001c}}
  0019ce0c: 00431021 addu r2,r2,r3
+
  0019ce74: 34030003 ori r3,r0,0x0003                      |
  0019ce10: 94540b4c lhu r20,0x0b4c(r2)
+
  0019ce78: 14430023 bne r2,r3,0x0019cf08                  {{f/Cond|If Nb of Targeted Tiles > 0x00 : Branch to }} {{f/loc|Post-Range section}}
  0019ce14: 0806744f j 0x0019d13c
+
  0019ce7c: 00009821 addu r19,r0,r0                        |
  0019ce18: 00000000 nop
+
                                                          '''<nowiki>Else : No Tile to Target (r2 = 0x03)</nowiki>'''
  0019ce1c: 0c0076ea jal 0x0001dba8
+
  0019ce80: 0806747d j 0x0019d1f4                              |{{f/loc|Exit}} {{f/Returns|returns 0x00}}
  0019ce20: 34040001 ori r4,r0,0x0001
+
  0019ce84: 00001021 addu r2,r0,r0                            |
  0019ce24: 284201b9 slti r2,r2,0x01b9
+
   
  0019ce28: 14400003 bne r2,r0,0x0019ce38
+
                                                    {{f/sec|Weird BACK JUMP (fail section ? Update AI 0xc72 and exit)}}
  0019ce2c: 2402ffff addiu r2,r0,0xffff
+
0019ce88: a2220c72 sb r2,0x0c72(r17)                     |{{f/store|Update AI 0xc72 }} {{f/std|? Control variable for this routine ? }}
  0019ce30: 0806747d j 0x0019d1f4
+
  0019ce8c: 0806747d j 0x0019d1f4                          |{{f/loc|Exit}} {{f/Returns|returns -0x01}}
  0019ce34: a2200c72 sb r0,0x0c72(r17)
+
  0019ce90: 2402ffff addiu r2,r0,-0x0001                      |
  0019ce38: 92220014 lbu r2,0x0014(r17)
+
   
  0019ce3c: 00000000 nop
+
                  {{f/sec|<nowiki>--- Set Targetable Tiles (range = 0x00) ---</nowiki>}}
  0019ce40: 10400003 beq r2,r0,0x0019ce50
+
                                                      '''<nowiki>Else : Ability Range = 0x00</nowiki>'''
  0019ce44: a22019b7 sb r0,0x19b7(r17)
+
  0019ce94: 3c038019 lui r3,0x8019                        |
  0019ce48: 08067395 j 0x0019ce54
+
  0019ce98: 2463f8d1 addiu r3,r3,-0x072f                  |{{f/adr|Dynamic pointer to Tile data 0x05}} {{f/std|8018f8cc + 0x05}}
  0019ce4c: 26300e30 addiu r16,r17,0x0e30
+
                                                        {{f/bloop|LOOP - All tiles (remove targeting flag)}}
  0019ce50: 26300018 addiu r16,r17,0x0018
+
  0019ce9c: 90620000 lbu r2,0x0000(r3)                        |{{f/load|This iteration Tile 0x05}}
  0019ce54: 0c067c96 jal 0x0019f258
+
  0019cea0: 24840001 addiu r4,r4,0x0001                        |{{f/std|Tile counter +1}}
  0019ce58: 02002021 addu r4,r16,r0
+
  0019cea4: 304200bf andi r2,r2,0x00bf                        |{{f/std|Remove flag 0x40 (targeted flag)}}
  0019ce5c: 92220004 lbu r2,0x0004(r17)
+
  0019cea8: a0620000 sb r2,0x0000(r3)                         |{{f/store|Remove Targeting from Tile}}
  0019ce60: 00000000 nop
+
  0019ceac: 28820200 slti r2,r4,0x0200                        |
  0019ce64: 1040000b beq r2,r0,0x0019ce94
+
  0019ceb0: 1440fffa bne r2,r0,0x0019ce9c                  {{f/eloop|Loop 0x200 times}}
  0019ce68: 00002021 addu r4,r0,r0
+
  0019ceb4: 24630008 addiu r3,r3,0x0008                        |{{f/std|Tile data offset}}
  0019ce6c: 0c05ea30 jal 0x0017a8c0
+
  0019ceb8: 92030002 lbu r3,0x0002(r16)                   |{{f/load|Caster Y coordinates}}
  0019ce70: 2624001c addiu r4,r17,0x001c
+
  0019cebc: 92220e3a lbu r2,0x0e3a(r17)                    |{{f/load|Map max X}}
  0019ce74: 34030003 ori r3,r0,0x0003
+
  0019cec0: 00000000 nop                                  |
  0019ce78: 14430023 bne r2,r3,0x0019cf08
+
  0019cec4: 00620018 mult r3,r2                            |
  0019ce7c: 00009821 addu r19,r0,r0
+
  0019cec8: 92020001 lbu r2,0x0001(r16)                    |{{f/load|Caster elevation}}
  0019ce80: 0806747d j 0x0019d1f4
+
  0019cecc: 92040000 lbu r4,0x0000(r16)                    |{{f/load|Caster X coordinates}}
  0019ce84: 00001021 addu r2,r0,r0
+
  0019ced0: 00021200 sll r2,r2,0x08                        |{{f/std|Elevation offset}}
  0019ce88: a2220c72 sb r2,0x0c72(r17)
+
  0019ced4: 00001812 mflo r3                              |
  0019ce8c: 0806747d j 0x0019d1f4
+
  0019ced8: 00641821 addu r3,r3,r4                        |
0019ce90: 2402ffff addiu r2,r0,0xffff
+
  0019cedc: 00621821 addu r3,r3,r2                        |{{f/std|Unit Tile ID}} {{f/std| X + YMax X + Elvation offset}}
  0019ce94: 3c038019 lui r3,0x8019
+
  0019cee0: 000318c0 sll r3,r3,0x03                        |
  0019ce98: 2463f8d1 addiu r3,r3,0xf8d1
+
  0019cee4: 3c018019 lui r1,0x8019                        |
  0019ce9c: 90620000 lbu r2,0x0000(r3)
+
  0019cee8: 00230821 addu r1,r1,r3                        |
  0019cea0: 24840001 addiu r4,r4,0x0001
+
  0019ceec: 9022f8d1 lbu r2,-0x072f(r1)                    |{{f/load|Unit Tile data 0x05}} {{f/adr|0x8018f8cc + 0x05 + Tile offset}}
  0019cea4: 304200bf andi r2,r2,0x00bf
+
  0019cef0: 00000000 nop                                  |
  0019cea8: a0620000 sb r2,0x0000(r3)
+
  0019cef4: 34420040 ori r2,r2,0x0040                      |
  0019ceac: 28820200 slti r2,r4,0x0200
+
  0019cef8: 3c018019 lui r1,0x8019                        |
  0019ceb0: 1440fffa bne r2,r0,0x0019ce9c
+
0019cefc: 00230821 addu r1,r1,r3                        |
  0019ceb4: 24630008 addiu r3,r3,0x0008
+
  0019cf00: a022f8d1 sb r2,-0x072f(r1)                     |{{f/store|Enable Targeted flag on Unit Tile}} {{f/std|0x8018f8cc + 0x05 + Tile offset}}
  0019ceb8: 92030002 lbu r3,0x0002(r16)
+
  0019cf04: 00009821 addu r19,r0,r0                       |{{f/std|Force r19 to 0x00}}
  0019cebc: 92220e3a lbu r2,0x0e3a(r17)
+
   
0019cec0: 00000000 nop
+
  {{f/sec|<nowiki>=== POST TARGETING SECTION - Enable Tile's flags in AI 0xb4c if Tile is ON in AI 0xbdc and Targetable (Tile 0x05 flag 0x40 is ON) ===</nowiki>}}
  0019cec4: 00620018 mult r3,r2
+
  0019cf08: 02204021 addu r8,r17,r0                |{{f/adr|Prepare Dynamic AI pointer (+0x24 for high elevation)}}
  0019cec8: 92020001 lbu r2,0x0001(r16)
+
                                                {{f/bloop|LOOP - Both elevation}}
  0019cecc: 92040000 lbu r4,0x0000(r16)
+
0019cf0c: 92220e3b lbu r2,0x0e3b(r17)               |{{f/load|Map Max Y}}
  0019ced0: 00021200 sll r2,r2,0x08
+
  0019cf10: 00000000 nop                              |
  0019ced4: 00001812 mflo r3
+
  0019cf14: 1840002e blez r2,0x0019cfd0                {{f/Cond|If max Y is invalid : branch to }}
  0019ced8: 00641821 addu r3,r3,r4
+
  0019cf18: 00009021 addu r18,r0,r0                    |{{f/std|intialize Y counter}}
  0019cedc: 00621821 addu r3,r3,r2
+
  0019cf1c: 00134a00 sll r9,r19,0x08                  |{{f/std|Elevation offset for tile data}}
  0019cee0: 000318c0 sll r3,r3,0x03
+
  0019cf20: 25050b4c addiu r5,r8,0x0b4c                |{{f/adr|Dynamic pointer to AI 0xb4c (+Elevation offset)}}
  0019cee4: 3c018019 lui r1,0x8019
+
  0019cf24: 25060bdc addiu r6,r8,0x0bdc                |{{f/adr|Dynamic pointer to AI 0xbdc (+Elevation offset)}} {{f/std|Tiles you can target to hit a unit}}
0019cee8: 00230821 addu r1,r1,r3
+
                                                    {{f/bloop|LOOP - All Y rows}}
  0019ceec: 9022f8d1 lbu r2,-0x072f(r1)
+
  0019cf28: 94d40000 lhu r20,0x0000(r6)                   |{{f/load|This Y row flags in AI 0xbdc}} {{f/std|Tiles from where you can hit a target}}
0019cef0: 00000000 nop
+
  0019cf2c: 00000000 nop                                   |
  0019cef4: 34420040 ori r2,r2,0x0040
+
  0019cf30: 3282ffff andi r2,r20,0xffff                    |
  0019cef8: 3c018019 lui r1,0x8019
+
  0019cf34: 10400020 beq r2,r0,0x0019cfb8                  {{f/Cond|If there is no flags in this row  (AI 0xbdc): branch to }} {{f/loc|Next Y row}} {{f/std|AI 0xbdc is Targetable tiles Table}}
  0019cefc: 00230821 addu r1,r1,r3
+
  0019cf38: a4a00000 sh r0,0x0000(r5)                     |{{f/store|Initialize this row flag in AI 0x0b4c}}
  0019cf00: a022f8d1 sb r2,-0x072f(r1)
+
  0019cf3c: 92230e3a lbu r3,0x0e3a(r17)                    |{{f/load|Max X}}
  0019cf04: 00009821 addu r19,r0,r0
+
  0019cf40: 00000000 nop                                  |
  0019cf08: 02204021 addu r8,r17,r0
+
  0019cf44: 1060001c beq r3,r0,0x0019cfb8                  {{f/Cond|If Map max X is invalid : branch to }} {{f/loc|Next Y row}}
  0019cf0c: 92220e3b lbu r2,0x0e3b(r17)
+
  0019cf48: 00008021 addu r16,r0,r0                        |{{f/std|Initialize X counter}}
  0019cf10: 00000000 nop
+
  0019cf4c: 00403821 addu r7,r2,r0                        |{{f/std|Row of flag (AI 0xbdc)}}
  0019cf14: 1840002e blez r2,0x0019cfd0
+
  0019cf50: 00a02021 addu r4,r5,r0                        |{{f/adr|Dynamic pointer to AI 0xb4c (+Y row and Elevation offset)}}
  0019cf18: 00009021 addu r18,r0,r0
+
  0019cf54: 02071004 sllv r2,r7,r16                        |{{f/std|Shift by X counter (Tiles of interest flag is in 0x8000 position)}}
  0019cf1c: 00134a00 sll r9,r19,0x08
+
                                                        {{f/bloop|LOOP All Tiles in Row}}
  0019cf20: 25050b4c addiu r5,r8,0x0b4c
+
  0019cf58: 30428000 andi r2,r2,0x8000                        |{{f/std|Bitmask}}
  0019cf24: 25060bdc addiu r6,r8,0x0bdc
+
  0019cf5c: 10400011 beq r2,r0,0x0019cfa4                      {{f/Cond|If This tile flag is disabled (AI 0xbdc) : branch to }} {{f/loc|Next Tile}}
  0019cf28: 94d40000 lhu r20,0x0000(r6)
+
  0019cf60: 02430018 mult r18,r3                               |
  0019cf2c: 00000000 nop
+
  0019cf64: 00001012 mflo r2                                   |{{f/std|Y counter * Max X}}
  0019cf30: 3282ffff andi r2,r20,0xffff
+
  0019cf68: 00501021 addu r2,r2,r16                            |{{f/std|+ X }}
0019cf34: 10400020 beq r2,r0,0x0019cfb8
+
  0019cf6c: 00491021 addu r2,r2,r9                            |{{f/std|+ Elevation offset}}
  0019cf38: a4a00000 sh r0,0x0000(r5)
+
  0019cf70: 000210c0 sll r2,r2,0x03                            |
  0019cf3c: 92230e3a lbu r3,0x0e3a(r17)
+
  0019cf74: 3c018019 lui r1,0x8019                            |
  0019cf40: 00000000 nop
+
  0019cf78: 00220821 addu r1,r1,r2                            |
0019cf44: 1060001c beq r3,r0,0x0019cfb8
+
  0019cf7c: 9022f8d1 lbu r2,-0x072f(r1)                        |{{f/load|This Tile data 0x05}} {{f/adr|0x8018f8cc + 0x05 + Tile offset}}
  0019cf48: 00008021 addu r16,r0,r0
+
  0019cf80: 00000000 nop                                      |
  0019cf4c: 00403821 addu r7,r2,r0
+
  0019cf84: 00021182 srl r2,r2,0x06                            |{{f/std|Shift Byte (0x40 becomes 0x1)}}
  0019cf50: 00a02021 addu r4,r5,r0
+
  0019cf88: 30420001 andi r2,r2,0x0001                        |
  0019cf54: 02071004 sllv r2,r7,r16
+
  0019cf8c: 10400005 beq r2,r0,0x0019cfa4                      {{f/Cond|If This Tile is not in Targeted AoE : branch to }} {{f/loc|Next Tile}}
  0019cf58: 30428000 andi r2,r2,0x8000
+
   
  0019cf5c: 10400011 beq r2,r0,0x0019cfa4
+
  0019cf90: 34028000 ori r2,r0,0x8000                          |
  0019cf60: 02430018 mult r18,r3
+
  0019cf94: 94830000 lhu r3,0x0000(r4)                         |{{f/load|This Y row flags in AI 0x0b4c}}
  0019cf64: 00001012 mflo r2
+
  0019cf98: 02021007 srav r2,r2,r16                            |{{f/std|Bitmask for this iteration Tile}}
  0019cf68: 00501021 addu r2,r2,r16
+
  0019cf9c: 00621825 or r3,r3,r2                              |
  0019cf6c: 00491021 addu r2,r2,r9
+
  0019cfa0: a4830000 sh r3,0x0000(r4)                          |{{f/store|Enable this Tile in AI 0x0b4c}} {{f/std|If this tile is in AI 0xbdc and is in Targeted AoE}}
  0019cf70: 000210c0 sll r2,r2,0x03
+
  0019cf74: 3c018019 lui r1,0x8019
+
  0019cfa4: 92230e3a lbu r3,0x0e3a(r17)                        |{{f/load|Max X}}
  0019cf78: 00220821 addu r1,r1,r2
+
  0019cfa8: 26100001 addiu r16,r16,0x0001                      |{{f/std|X counter +1}}
  0019cf7c: 9022f8d1 lbu r2,-0x072f(r1)
+
  0019cfac: 0203102a slt r2,r16,r3                            |
  0019cf80: 00000000 nop
+
  0019cfb0: 1440ffe9 bne r2,r0,0x0019cf58                  {{f/eloop|Loop while X < Max X}}
0019cf84: 00021182 srl r2,r2,0x06
+
  0019cfb4: 02071004 sllv r2,r7,r16                            |{{f/std|Shift Row's Flag by X counter (bit of interest is 0x8000)}}
  0019cf88: 30420001 andi r2,r2,0x0001
+
  0019cfb8: 24a50002 addiu r5,r5,0x0002                    |{{f/std|Y offset (halfword) for AI 0xb4c}}
  0019cf8c: 10400005 beq r2,r0,0x0019cfa4
+
  0019cfbc: 92220e3b lbu r2,0x0e3b(r17)                    |{{f/load|Max Y}}
  0019cf90: 34028000 ori r2,r0,0x8000
+
  0019cfc0: 26520001 addiu r18,r18,0x0001                  |{{f/std|Y counter +1}}
  0019cf94: 94830000 lhu r3,0x0000(r4)
+
  0019cfc4: 0242102a slt r2,r18,r2                         |
  0019cf98: 02021007 srav r2,r2,r16
+
  0019cfc8: 1440ffd7 bne r2,r0,0x0019cf28              {{f/eloop|Loop while Y < Max Y}}
  0019cf9c: 00621825 or r3,r3,r2
+
  0019cfcc: 24c60002 addiu r6,r6,0x0002                    |{{f/std|Y offset (halfword) for AI 0xbdc}}
  0019cfa0: a4830000 sh r3,0x0000(r4)
+
  0019cfd0: 26730001 addiu r19,r19,0x0001              |{{f/std|Elevation counter + 1}}
  0019cfa4: 92230e3a lbu r3,0x0e3a(r17)
+
  0019cfd4: 2a620002 slti r2,r19,0x0002                |
  0019cfa8: 26100001 addiu r16,r16,0x0001
+
  0019cfd8: 1440ffcc bne r2,r0,0x0019cf0c          {{f/eloop|Loop 2 times}}
  0019cfac: 0203102a slt r2,r16,r3
+
  0019cfdc: 25080024 addiu r8,r8,0x0024                |{{f/std|AI data elevation offset}}
  0019cfb0: 1440ffe9 bne r2,r0,0x0019cf58
+
  0019cfe0: 00009821 addu r19,r0,r0                    |
  0019cfb4: 02071004 sllv r2,r7,r16
+
   
  0019cfb8: 24a50002 addiu r5,r5,0x0002
+
  {{f/sec|<nowiki>=== TEST ALL TARGETABLE TILES (in AI 0xb4c) ===</nowiki>}}
  0019cfbc: 92220e3b lbu r2,0x0e3b(r17)
+
                                                {{f/bloop|LOOP - Both elevation}}
  0019cfc0: 26520001 addiu r18,r18,0x0001
+
  0019cfe4: 92220e3b lbu r2,0x0e3b(r17)                |{{f/load|Max Y}}
  0019cfc4: 0242102a slt r2,r18,r2
+
  0019cfe8: 00000000 nop                              |
  0019cfc8: 1440ffd7 bne r2,r0,0x0019cf28
+
  0019cfec: 1840007d blez r2,0x0019d1e4                {{f/Cond|If Map Max Y is invalid : branch to }} {{f/loc|Next elevation}}
  0019cfcc: 24c60002 addiu r6,r6,0x0002
+
  0019cff0: 00009021 addu r18,r0,r0                    |{{f/std|Initialize Y counter}}
  0019cfd0: 26730001 addiu r19,r19,0x0001
+
  0019cff4: 001310c0 sll r2,r19,0x03                  |
  0019cfd4: 2a620002 slti r2,r19,0x0002
+
                                                    {{f/bloop|LOOP - All Y rows}}
  0019cfd8: 1440ffcc bne r2,r0,0x0019cf0c
+
  0019cff8: 00531021 addu r2,r2,r19                        |
  0019cfdc: 25080024 addiu r8,r8,0x0024
+
  0019cffc: 00021080 sll r2,r2,0x02                        |
  0019cfe0: 00009821 addu r19,r0,r0
+
  0019d000: 00511021 addu r2,r2,r17                        |
  0019cfe4: 92220e3b lbu r2,0x0e3b(r17)
+
  0019d004: 00121840 sll r3,r18,0x01                      |
  0019cfe8: 00000000 nop
+
  0019d008: 00431021 addu r2,r2,r3                        |
0019cfec: 1840007d blez r2,0x0019d1e4
+
  0019d00c: 94540b4c lhu r20,0x0b4c(r2)                    |{{f/load|This Y row flags in AI 0x0b4c}} {{f/adr|0x8019f3c4 + 0xb4c + Elevation offset (0x24) + Y offset (halfword)}} {{f/std|Targetable and targeted}}
0019cff0: 00009021 addu r18,r0,r0
+
  0019d010: 00000000 nop                                  |
  0019cff4: 001310c0 sll r2,r19,0x03
+
  0019d014: 1280006e beq r20,r0,0x0019d1d0                {{f/Cond|If There is no flags in this row : branch to }} {{f/loc|Next Y row}} {{f/std| in AI 0xb4c}}
  0019cff8: 00531021 addu r2,r2,r19
+
  0019d018: 00000000 nop                                  |
  0019cffc: 00021080 sll r2,r2,0x02
+
  0019d01c: 92220e3a lbu r2,0x0e3a(r17)                    |{{f/load|Max X}}
  0019d000: 00511021 addu r2,r2,r17
+
  0019d020: 00000000 nop                                  |
  0019d004: 00121840 sll r3,r18,0x01
+
  0019d024: 1840006a blez r2,0x0019d1d0                    {{f/Cond|If Map Max X is invalid : Branch to }} {{f/loc|Next Y row}}
  0019d008: 00431021 addu r2,r2,r3
+
  0019d028: 00008021 addu r16,r0,r0                        |{{f/std|Initialize X counter}}
  0019d00c: 94540b4c lhu r20,0x0b4c(r2)
+
  0019d02c: 02141004 sllv r2,r20,r16                      |{{f/std|Shift Y row of flags by X counter (Tile of interest flag is in 0x8000 position)}}
  0019d010: 00000000 nop
+
                                                        {{f/bloop|LOOP - All tiles in Y row}}
  0019d014: 1280006e beq r20,r0,0x0019d1d0
+
  0019d030: 30428000 andi r2,r2,0x8000                        |
  0019d018: 00000000 nop
+
  0019d034: 10400061 beq r2,r0,0x0019d1bc                      {{f/Cond|If This iteration Tile's flag is OFF : branch to }} {{f/loc|Next Tile}} {{f/std| in AI 0xb4c}}
  0019d01c: 92220e3a lbu r2,0x0e3a(r17)
+
  0019d038: 34020006 ori r2,r0,0x0006                          |
  0019d020: 00000000 nop
+
  0019d03c: 92230026 lbu r3,0x0026(r17)                        |{{f/load|Load AI 0x0026 (Targeting type)}}
  0019d024: 1840006a blez r2,0x0019d1d0
+
  0019d040: a6300028 sh r16,0x0028(r17)                        |{{f/store|Store X counter at AI 0x0028}}
  0019d028: 00008021 addu r16,r0,r0
+
  0019d044: a632002c sh r18,0x002c(r17)                        |{{f/store|Store Y counter at AI 0x002c}}
  0019d02c: 02141004 sllv r2,r20,r16
+
   
  0019d030: 30428000 andi r2,r2,0x8000
+
                  {{f/sec|--- More Targeting checks (unit, obstacles) ---}}
  0019d034: 10400061 beq r2,r0,0x0019d1bc
+
  0019d048: 10620006 beq r3,r2,0x0019d064                      {{f/Cond|If Targeting is not Unit specific (<> 0x06)}}
  0019d038: 34020006 ori r2,r0,0x0006
+
  0019d04c: a633002a sh r19,0x002a(r17)                       |{{f/store|Store Elevation counter at AI 0x002a}}
  0019d03c: 92230026 lbu r3,0x0026(r17)
+
  0019d050: 8e23000c lw r3,0x000c(r17)                            |{{f/adr|Considered Ability AI Behavior 1 to 4}}
  0019d040: a6300028 sh r16,0x0028(r17)
+
  0019d054: 3c0200c0 lui r2,0x00c0                                |
  0019d044: a632002c sh r18,0x002c(r17)
+
  0019d058: 00621824 and r3,r3,r2                                  |
  0019d048: 10620006 beq r3,r2,0x0019d064
+
  0019d05c: 10600008 beq r3,r0,0x0019d080                          {{f/Cond|If Considered Ability do NOT have [Longbow Attack] or [Stop at obstacle]}} {{f/loc|Avoid routine below}} {{f/std|Do not seek a Unit on considered panel}}
  0019d04c: a633002a sh r19,0x002a(r17)
+
  0019d060: 00000000 nop                                           |
0019d050: 8e23000c lw r3,0x000c(r17)
+
                                                              '''Else : Targeting is Unit Specific or [Longbow Attack] or [Stop at obstacle]'''
  0019d054: 3c0200c0 lui r2,0x00c0
+
0019d064: 0c067486 jal 0x0019d218                                |{{f/jal|See_if_any_units_are_on_target_panel|See_if_any_units_are_on_target_panel}} {{f/std|returns Unit ID (or 0x15)}}
  0019d058: 00621824 and r3,r3,r2
+
  0019d068: 00000000 nop                                          |
  0019d05c: 10600008 beq r3,r0,0x0019d080
+
  0019d06c: a2220027 sb r2,0x0027(r17)                            |{{f/store|Store Unit ID at AI 0x27}}
  0019d060: 00000000 nop
+
  0019d070: 304200ff andi r2,r2,0x00ff                            |
  0019d064: 0c067486 jal 0x0019d218
+
  0019d074: 34030015 ori r3,r0,0x0015                              |
  0019d068: 00000000 nop
+
  0019d078: 10430039 beq r2,r3,0x0019d160                          {{f/Cond|If No Unit found on Considered Tile}} {{f/loc|Post priority section}}
  0019d06c: a2220027 sb r2,0x0027(r17)
+
  0019d07c: 00000000 nop                                          |
0019d070: 304200ff andi r2,r2,0x00ff
+
  0019d080: 8e23000c lw r3,0x000c(r17)                         |{{f/adr|Considered Ability AI Behavior 1 to 4}}
  0019d074: 34030015 ori r3,r0,0x0015
+
  0019d084: 3c020080 lui r2,0x0080                            |
0019d078: 10430039 beq r2,r3,0x0019d160
+
  0019d088: 00621024 and r2,r3,r2                             |
  0019d07c: 00000000 nop
+
  0019d08c: 10400007 beq r2,r0,0x0019d0ac                      {{f/Cond|If considered Ability has [Longbow attack]}}
  0019d080: 8e23000c lw r3,0x000c(r17)
+
  0019d090: 3c020040 lui r2,0x0040                                |
  0019d084: 3c020080 lui r2,0x0080
+
  0019d094: 92240e2e lbu r4,0x0e2e(r17)                            |{{f/load|Acting Unit ID}}
  0019d088: 00621024 and r2,r3,r2
+
  0019d098: 92250027 lbu r5,0x0027(r17)                            |{{f/load|Target ID}}
  0019d08c: 10400007 beq r2,r0,0x0019d0ac
+
  0019d09c: 0c06bf64 jal 0x001afd90                                |{{f/jal|001afd90_-_001aff14|001afd90_-_001aff14}} {{f/std|Trajectory ? }}
  0019d090: 3c020040 lui r2,0x0040
+
0019d0a0: 00000000 nop                                           |
  0019d094: 92240e2e lbu r4,0x0e2e(r17)
+
  0019d0a4: 08067445 j 0x0019d114                                  {{f/jump|jump and }} {{f/loc|check result (obstacle ?)}}
  0019d098: 92250027 lbu r5,0x0027(r17)
+
  0019d0a8: 00000000 nop                                           |
  0019d09c: 0c06bf64 jal 0x001afd90
+
                                                              '''Else : not longbow attack'''
  0019d0a0: 00000000 nop
+
  0019d0ac: 00621024 and r2,r3,r2                             |
  0019d0a4: 08067445 j 0x0019d114
+
  0019d0b0: 1040001a beq r2,r0,0x0019d11c                      {{f/Cond|If Considered Ability has [Stop at obstacle]}}
  0019d0a8: 00000000 nop
+
  0019d0b4: 00000000 nop                                           |
  0019d0ac: 00621024 and r2,r3,r2
+
  0019d0b8: 92220000 lbu r2,0x0000(r17)                           |{{f/load|Considered Ability's skillset}}
  0019d0b0: 1040001a beq r2,r0,0x0019d11c
+
  0019d0bc: 3c018006 lui r1,0x8006                                |
  0019d0b4: 00000000 nop
+
  0019d0c0: 00220821 addu r1,r1,r2                                 |
  0019d0b8: 92220000 lbu r2,0x0000(r17)
+
  0019d0c4: 90235cb4 lbu r3,0x5cb4(r1)                            |{{f/load|Considered skillset's action menu}}
  0019d0bc: 3c018006 lui r1,0x8006
+
  0019d0c8: 34020001 ori r2,r0,0x0001                              |
0019d0c0: 00220821 addu r1,r1,r2
+
  0019d0cc: 1462000d bne r3,r2,0x0019d104                          {{f/Cond|If Considered Action menu is [Item inventory]}}
0019d0c4: 90235cb4 lbu r3,0x5cb4(r1)
+
  0019d0d0: 00000000 nop                                              |
  0019d0c8: 34020001 ori r2,r0,0x0001
+
0019d0d4: 92220027 lbu r2,0x0027(r17)                               |{{f/load|Target ID}}
  0019d0cc: 1462000d bne r3,r2,0x0019d104
+
  0019d0d8: 8e2417f8 lw r4,0x17f8(r17)                                |{{f/std|Send}}
0019d0d0: 00000000 nop
+
  0019d0dc: 000228c0 sll r5,r2,0x03                                    |
  0019d0d4: 92220027 lbu r2,0x0027(r17)
+
  0019d0e0: 00a22823 subu r5,r5,r2                                    |
  0019d0d8: 8e2417f8 lw r4,0x17f8(r17)
+
  0019d0e4: 00052980 sll r5,r5,0x06                                    |
  0019d0dc: 000228c0 sll r5,r2,0x03
+
  0019d0e8: 3c028019 lui r2,0x8019                                    |
  0019d0e0: 00a22823 subu r5,r5,r2
+
  0019d0ec: 244208cc addiu r2,r2,0x08cc                                |
  0019d0e4: 00052980 sll r5,r5,0x06
+
  0019d0f0: 0c0664db jal 0x0019936c                                    |{{f/jal|Calculate_Distance_Between_Units|Calculate_Distance_Between_Units}}
  0019d0e8: 3c028019 lui r2,0x8019
+
  0019d0f4: 00a22821 addu r5,r5,r2                                     |{{f/std|Send}} {{f/adr|Targeted Unit data pointer}}
  0019d0ec: 244208cc addiu r2,r2,0x08cc
+
  0019d0f8: 28420002 slti r2,r2,0x0002                                |
  0019d0f0: 0c0664db jal 0x0019936c
+
  0019d0fc: 14400007 bne r2,r0,0x0019d11c                              {{f/Cond|If Item inventory with point blank target or self targeting}} {{f/loc|Do not seek obstacles}}
  0019d0f4: 00a22821 addu r5,r5,r2
+
  0019d100: 00000000 nop                                              |
  0019d0f8: 28420002 slti r2,r2,0x0002
+
                                                                  '''Else : Ability has [Stop at Obstacle] or Item is throwed'''
  0019d0fc: 14400007 bne r2,r0,0x0019d11c
+
  0019d104: 92240e2e lbu r4,0x0e2e(r17)                               |{{f/load|Caster ID}}
  0019d100: 00000000 nop
+
  0019d108: 92250027 lbu r5,0x0027(r17)                               |{{f/load|Target ID}}
  0019d104: 92240e2e lbu r4,0x0e2e(r17)
+
  0019d10c: 0c06c1b4 jal 0x001b06d0                                    |{{f/jal|001b06d0_-_001b0814|001b06d0_-_001b0814}} {{f/std|Obstacle related}}
  0019d108: 92250027 lbu r5,0x0027(r17)
+
0019d110: 00000000 nop                                              |
  0019d10c: 0c06c1b4 jal 0x001b06d0
+
                                                            {{f/sec|Check if Obstacle (longbow or direct)}}
  0019d110: 00000000 nop
+
  0019d114: 10400029 beq r2,r0,0x0019d1bc                      {{f/Cond|<nowiki>If r2 = 0x00 (Obstacle ?) branch to </nowiki>}} {{f/loc|Next Tile}}
  0019d114: 10400029 beq r2,r0,0x0019d1bc
+
  0019d118: 00000000 nop                                      |
  0019d118: 00000000 nop
+
   
0019d11c: 8e230cb4 lw r3,0x0cb4(r17)
+
                  {{f/sec| --- (AI 0x0cb4) POST TARGETING / OBSTACLE ---}}
  0019d120: 3c020200 lui r2,0x0200
+
  0019d11c: 8e230cb4 lw r3,0x0cb4(r17)                        |{{f/load|Load AI 0x0cb4}} {{f/std|AI processing ?}}
0019d124: 00621824 and r3,r3,r2
+
  0019d120: 3c020200 lui r2,0x0200                            |
0019d128: 10600003 beq r3,r0,0x0019d138
+
  0019d124: 00621824 and r3,r3,r2                             |
  0019d12c: 34020001 ori r2,r0,0x0001
+
  0019d128: 10600003 beq r3,r0,0x0019d138                      {{f/Cond|If AI 0xcb4 flag 0x02000000 is ON}}
  0019d130: 0806744f j 0x0019d13c
+
  0019d12c: 34020001 ori r2,r0,0x0001                              |
  0019d134: a2220e4e sb r2,0x0e4e(r17)
+
  0019d130: 0806744f j 0x0019d13c                                  {{f/jump|Avoid opposite case}}
  0019d138: a2200e4e sb r0,0x0e4e(r17)
+
  0019d134: a2220e4e sb r2,0x0e4e(r17)                             |{{f/store|Set AI 0xe4e to 0x01}}
  0019d13c: 0c0674c2 jal 0x0019d308
+
                                                              '''Else : AI 0xcb4 flag 0x02000000 is OFF'''
  0019d140: 00000000 nop
+
  0019d138: a2200e4e sb r0,0x0e4e(r17)                             |{{f/store|Set AI 0xe4e to 0x00}}
  0019d144: 2403ffff addiu r3,r0,0xffff
+
   
  0019d148: 1043ff4f beq r2,r3,0x0019ce88
+
                  {{f/sec| --- CHECK ABILITY RESULT (store best outcome in AI 0x34) ---}}
  0019d14c: 34020001 ori r2,r0,0x0001
+
0019d13c: 0c0674c2 jal 0x0019d308                            |{{f/jal|Check_Set_Highest_Unit_Priority_(0019d308)|Check_Set_Highest_Unit_Priority_(0019d308)}} {{f/std| Simulate Considered Ability from considered Position Targeting considered Tile and store it in AI 0x34 if better}}
  0019d150: 922219bc lbu r2,0x19bc(r17)
+
  0019d140: 00000000 nop                                       |
  0019d154: 00000000 nop
+
  0019d144: 2403ffff addiu r3,r0,-0x0001                      |
0019d158: 10400026 beq r2,r0,0x0019d1f4
+
  0019d148: 1043ff4f beq r2,r3,0x0019ce88                      {{f/Cond|If Returned value is -0x01}} {{f/loc|Store 0x01 in AI 0xc72 and exit}} {{f/std| 0x19d37c didn't update priority ?}}
  0019d15c: 00001021 addu r2,r0,r0
+
  0019d14c: 34020001 ori r2,r0,0x0001                          |
  0019d160: 92220e4e lbu r2,0x0e4e(r17)
+
                                                              '''Else : returned value <> -0x01'''
  0019d164: 00000000 nop
+
  0019d150: 922219bc lbu r2,0x19bc(r17)                            |{{f/load|AI 0x19bc}}
  0019d168: 10400014 beq r2,r0,0x0019d1bc
+
  0019d154: 00000000 nop                                          |
  0019d16c: 001310c0 sll r2,r19,0x03
+
  0019d158: 10400026 beq r2,r0,0x0019d1f4                          {{f/Cond|<nowiki>if AI 0x19bc = 0x00 </nowiki>}} {{f/loc|Exit}} {{f/Returns|returns 0x00}}
  0019d170: 00531021 addu r2,r2,r19
+
  0019d15c: 00001021 addu r2,r0,r0                                |
  0019d174: 00021080 sll r2,r2,0x02
+
  0019d178: 00511021 addu r2,r2,r17
+
                  {{f/sec|--- (AI 0x0e4e) POST-PRIORITY Section}}
  0019d17c: 24420bdc addiu r2,r2,0x0bdc
+
  0019d160: 92220e4e lbu r2,0x0e4e(r17)                        |{{f/load|AI 0xe4e}}
  0019d180: 00122040 sll r4,r18,0x01
+
  0019d164: 00000000 nop                                       |
  0019d184: 00822021 addu r4,r4,r2
+
  0019d168: 10400014 beq r2,r0,0x0019d1bc                      {{f/Cond|<nowiki>If AI 0xe4e = 0x00 (not fine for caster ?) branch to </nowiki>}} {{f/loc|Next tile}}
  0019d188: 34028000 ori r2,r0,0x8000
+
  0019d16c: 001310c0 sll r2,r19,0x03                          |
0019d18c: 94830000 lhu r3,0x0000(r4)
+
                                                              '''Else : Ok for caster ?'''
0019d190: 02021007 srav r2,r2,r16
+
  0019d170: 00531021 addu r2,r2,r19                                |
0019d194: 00621826 xor r3,r3,r2
+
  0019d174: 00021080 sll r2,r2,0x02                                |{{f/std|Elevation offset (0x24)}}
0019d198: a4830000 sh r3,0x0000(r4)
+
  0019d178: 00511021 addu r2,r2,r17                                |
0019d19c: 92220cbb lbu r2,0x0cbb(r17)
+
  0019d17c: 24420bdc addiu r2,r2,0x0bdc                            |
0019d1a0: 00000000 nop
+
  0019d180: 00122040 sll r4,r18,0x01                              |{{f/std|Y row offset (halfword)}}
0019d1a4: 2442ffff addiu r2,r2,0xffff
+
  0019d184: 00822021 addu r4,r4,r2                                |{{f/adr|0x8019f3c4 + 0xbdc + this row offset}}
0019d1a8: a2220cbb sb r2,0x0cbb(r17)
+
  0019d188: 34028000 ori r2,r0,0x8000                              |
0019d1ac: 92220cbb lbu r2,0x0cbb(r17)
+
  0019d18c: 94830000 lhu r3,0x0000(r4)                            |{{f/load|This Y row flags in AI 0xbdc}}
0019d1b0: 00000000 nop
+
  0019d190: 02021007 srav r2,r2,r16                                |{{f/std|Bitmask for this iteration Tile}}
0019d1b4: 10400006 beq r2,r0,0x0019d1d0
+
  0019d194: 00621826 xor r3,r3,r2                                 |
  0019d1b8: 00000000 nop
+
  0019d198: a4830000 sh r3,0x0000(r4)                              |{{f/store|Delete this Tile flag in AI 0xbdc}}
  0019d1bc: 92220e3a lbu r2,0x0e3a(r17)
+
0019d19c: 92220cbb lbu r2,0x0cbb(r17)                            |{{f/load|Nb of Tiles in AI 0xbdc}}
  0019d1c0: 26100001 addiu r16,r16,0x0001
+
  0019d1a0: 00000000 nop                                          |
  0019d1c4: 0202102a slt r2,r16,r2
+
0019d1a4: 2442ffff addiu r2,r2,-0x0001                          |
  0019d1c8: 1440ff99 bne r2,r0,0x0019d030
+
  0019d1a8: a2220cbb sb r2,0x0cbb(r17)                            |{{f/store|Decrease Tile's counter in 0xbdc}}
  0019d1cc: 02141004 sllv r2,r20,r16
+
0019d1ac: 92220cbb lbu r2,0x0cbb(r17)                            |{{f/load|Tile counter}}
  0019d1d0: 92220e3b lbu r2,0x0e3b(r17)
+
  0019d1b0: 00000000 nop                                          |
  0019d1d4: 26520001 addiu r18,r18,0x0001
+
  0019d1b4: 10400006 beq r2,r0,0x0019d1d0                          {{f/Cond|If there is no tiles left in AI 0xbdc : branch to }} {{f/loc|Next Y row}}
  0019d1d8: 0242102a slt r2,r18,r2
+
  0019d1b8: 00000000 nop                                           |
  0019d1dc: 1440ff86 bne r2,r0,0x0019cff8
+
  0019d1bc: 92220e3a lbu r2,0x0e3a(r17)                       |{{f/load|Map Max X}}
  0019d1e0: 001310c0 sll r2,r19,0x03
+
  0019d1c0: 26100001 addiu r16,r16,0x0001                     |{{f/std|X counter + 1}}
  0019d1e4: 26730001 addiu r19,r19,0x0001
+
  0019d1c4: 0202102a slt r2,r16,r2                             |
  0019d1e8: 2a620002 slti r2,r19,0x0002
+
  0019d1c8: 1440ff99 bne r2,r0,0x0019d030                 {{f/eloop|Loop while X < Max X}}
  0019d1ec: 1440ff7d bne r2,r0,0x0019cfe4
+
  0019d1cc: 02141004 sllv r2,r20,r16                       |
  0019d1f0: 00001021 addu r2,r0,r0
+
  0019d1d0: 92220e3b lbu r2,0x0e3b(r17)                   |{{f/load|Max Y}}
 +
  0019d1d4: 26520001 addiu r18,r18,0x0001                 |{{f/std|Y counter + 1}}
 +
  0019d1d8: 0242102a slt r2,r18,r2                         |
 +
  0019d1dc: 1440ff86 bne r2,r0,0x0019cff8             {{f/eloop|Loop while Y < Max Y}}
 +
  0019d1e0: 001310c0 sll r2,r19,0x03                       |{{f/std|Prepare elevation offset}}
 +
  0019d1e4: 26730001 addiu r19,r19,0x0001             |{{f/std|Elevation + 1}}
 +
  0019d1e8: 2a620002 slti r2,r19,0x0002               |
 +
  0019d1ec: 1440ff7d bne r2,r0,0x0019cfe4         {{f/eloop|Loop 2 times}}
 +
  0019d1f0: 00001021 addu r2,r0,r0                 |{{f/Returns|Return 0x00}}
 
  0019d1f4: 8fbf0044 lw r31,0x0044(r29)
 
  0019d1f4: 8fbf0044 lw r31,0x0044(r29)
 
  0019d1f8: 8fb40040 lw r20,0x0040(r29)
 
  0019d1f8: 8fb40040 lw r20,0x0040(r29)
Line 288: Line 335:
 
  0019d210: 03e00008 jr r31
 
  0019d210: 03e00008 jr r31
 
  0019d214: 00000000 nop
 
  0019d214: 00000000 nop
</font>
+
===Return locations===
 +
'''BATTLE.BIN'''
 +
  0019b480: [[Check_if_any_units_are_in_range_(0019b30c)]]
 +
  0019ba5c: [[AI_Targeting_Matrix_Analysis_(0019b7b8)]]
 +
  0019c0c4: [[Find_Highest_Target_Priority_in_Ability_Range_(0019bf2c)]]
 +
  0019c16c: [[Find_Highest_Target_Priority_in_Ability_Range_(0019bf2c)]]

Latest revision as of 19:45, 8 June 2024

BATTLE.BIN :  - AI_Target_Unit_for_Direct_vs_Arc_Attack_(0019cd9c)
Ability simulation from a given position : handle Targeting and outcome. Test all targetable tiles, compare priority score, keep the best in AI 0x34 Table
------------------------------------------------------------------------------------------
Parameter : Nothing
Return : r2 = 0x00 Default result / No tiles to Target ( Set_Target_Tiles ) / AI 0x19bc = 0x00 (after checking priority)
         r2 = -0x01 if VSync_call returns r2 > 0x1b8
         r2 = -0x01 if Check_Set_Highest_Unit_Priority_(0019d308) returns r2 -0x01
------------------------------------------------------------------------------------------
0019cd9c: 3c02801a lui r2,0x801a             |
0019cda0: 90420d7b lbu r2,0x0d7b(r2)         |AI 0x19b7
0019cda4: 27bdffb8 addiu r29,r29,-0x0048     |
0019cda8: afb10034 sw r17,0x0034(r29)        |
0019cdac: 3c11801a lui r17,0x801a            |
0019cdb0: 2631f3c4 addiu r17,r17,-0x0c3c     |0x8019f3c4
0019cdb4: afbf0044 sw r31,0x0044(r29)        |
0019cdb8: afb40040 sw r20,0x0040(r29)        |
0019cdbc: afb3003c sw r19,0x003c(r29)        |
0019cdc0: afb20038 sw r18,0x0038(r29)        |
0019cdc4: 10400015 beq r2,r0,0x0019ce1c      #If AI 0x19b7 <> 0x00
0019cdc8: afb00030 sw r16,0x0030(r29)            |
0019cdcc: 3c02801a lui r2,0x801a                 |
0019cdd0: 90420036 lbu r2,0x0036(r2)             |AI 0xc72
0019cdd4: 00000000 nop                           |
0019cdd8: 10400010 beq r2,r0,0x0019ce1c          #If AI 0xc72 = 0x00 branch to AI 0x19b7 = 0x00 Section
0019cddc: 00000000 nop                           |
0019cde0: 3c10801a lui r16,0x801a                |
0019cde4: 9610f3ec lhu r16,-0x0c14(r16)          |Considered Action X coordinates AI 0x1c + 0x0c
0019cde8: 3c13801a lui r19,0x801a                |
0019cdec: 9673f3ee lhu r19,-0x0c12(r19)          |Considered Action Elevation AI 0x1c + 0x0e
0019cdf0: 3c12801a lui r18,0x801a                |
0019cdf4: 9652f3f0 lhu r18,-0x0c10(r18)          |Considered Action Y coordinates AI 0x1c + 0x10
0019cdf8: 001310c0 sll r2,r19,0x03               |
0019cdfc: 00531021 addu r2,r2,r19                |
0019ce00: 00021080 sll r2,r2,0x02                |Elevation offset (0x24)
0019ce04: 00511021 addu r2,r2,r17                |
0019ce08: 00121840 sll r3,r18,0x01               |Y offset (halfword)
0019ce0c: 00431021 addu r2,r2,r3                 |
0019ce10: 94540b4c lhu r20,0x0b4c(r2)            |Considered Action Y row flags in AI 0xb4c Table AI 0xb4c + Elevation offset + Y row offset
0019ce14: 0806744f j 0x0019d13c                  >>Jump to  Check priority section Checking only one tile ?
0019ce18: 00000000 nop                           |

=== TARGETING SECTION ===
                                             Else : AI 0x19b7 = 0x00 or AI 0x0c72 = 0x00
0019ce1c: 0c0076ea jal 0x0001dba8                |-->VSync_call
0019ce20: 34040001 ori r4,r0,0x0001              |send 0x01
0019ce24: 284201b9 slti r2,r2,0x01b9             |
0019ce28: 14400003 bne r2,r0,0x0019ce38          #If Vsync call returns a value > 0x1b8
0019ce2c: 2402ffff addiu r2,r0,-0x0001               |
0019ce30: 0806747d j 0x0019d1f4                      |Exit  Return -0x01
0019ce34: a2200c72 sb r0,0x0c72(r17)                 |No units are in range
                                                 Else :  Vsync is Ok do not abort the routine
0019ce38: 92220014 lbu r2,0x0014(r17)                |AI 0x0014 Related to caster position ?
0019ce3c: 00000000 nop                               |
0019ce40: 10400003 beq r2,r0,0x0019ce50              #If AI 0x14 <> 0x00  Caster already is at action location ?
0019ce44: a22019b7 sb r0,0x19b7(r17)                 |Set AI 0x19b7 = 0x00
0019ce48: 08067395 j 0x0019ce54                          >>Avoid opposite section
0019ce4c: 26300e30 addiu r16,r17,0x0e30                  |r16 =  Acting Unit coordinates pointer
                                                     Else : AI 0x14 = 0x00
0019ce50: 26300018 addiu r16,r17,0x0018                  |r16 = AI 0x0018 Coordinates pointer Considered Tile (Destination - Best priority score)
0019ce54: 0c067c96 jal 0x0019f258                    |-->Store units coordinates Send considered coordinates in Acting Unit Battle data (Placement simulation ?)
0019ce58: 02002021 addu r4,r16,r0                    |Send pointer
0019ce5c: 92220004 lbu r2,0x0004(r17)                |Considered Ability Range
0019ce60: 00000000 nop                               |

                  --- Set Targetable Tiles (range > 0x00) ---
0019ce64: 1040000b beq r2,r0,0x0019ce94              #If Ability range <> 0x00
0019ce68: 00002021 addu r4,r0,r0                     |
0019ce6c: 0c05ea30 jal 0x0017a8c0                        |-->Set_Target_Tiles Returns 0x0 or 0x1 if There are tiles to target    -   Enable all targetable tiles around caster (Tile data byte 0x05 flag 0x40)
0019ce70: 2624001c addiu r4,r17,0x001c                   |Send  AI 0x001c
0019ce74: 34030003 ori r3,r0,0x0003                      |
0019ce78: 14430023 bne r2,r3,0x0019cf08                  #If Nb of Targeted Tiles > 0x00 : Branch to  Post-Range section
0019ce7c: 00009821 addu r19,r0,r0                        |
                                                         Else : No Tile to Target (r2 = 0x03)
0019ce80: 0806747d j 0x0019d1f4                              |Exit returns 0x00
0019ce84: 00001021 addu r2,r0,r0                             |

                                                    Weird BACK JUMP (fail section ? Update AI 0xc72 and exit)
0019ce88: a2220c72 sb r2,0x0c72(r17)                     |Update AI 0xc72  ? Control variable for this routine ? 
0019ce8c: 0806747d j 0x0019d1f4                          |Exit returns -0x01
0019ce90: 2402ffff addiu r2,r0,-0x0001                       |

                  --- Set Targetable Tiles (range = 0x00) ---
                                                     Else : Ability Range = 0x00
0019ce94: 3c038019 lui r3,0x8019                         |
0019ce98: 2463f8d1 addiu r3,r3,-0x072f                   |Dynamic pointer to Tile data 0x05 8018f8cc + 0x05
                                                        @LOOP - All tiles (remove targeting flag)
0019ce9c: 90620000 lbu r2,0x0000(r3)                         |This iteration Tile 0x05
0019cea0: 24840001 addiu r4,r4,0x0001                        |Tile counter +1
0019cea4: 304200bf andi r2,r2,0x00bf                         |Remove flag 0x40 (targeted flag)
0019cea8: a0620000 sb r2,0x0000(r3)                          |Remove Targeting from Tile
0019ceac: 28820200 slti r2,r4,0x0200                         |
0019ceb0: 1440fffa bne r2,r0,0x0019ce9c                  Λ Loop 0x200 times
0019ceb4: 24630008 addiu r3,r3,0x0008                        |Tile data offset
0019ceb8: 92030002 lbu r3,0x0002(r16)                    |Caster Y coordinates
0019cebc: 92220e3a lbu r2,0x0e3a(r17)                    |Map max X
0019cec0: 00000000 nop                                   |
0019cec4: 00620018 mult r3,r2                            |
0019cec8: 92020001 lbu r2,0x0001(r16)                    |Caster elevation
0019cecc: 92040000 lbu r4,0x0000(r16)                    |Caster X coordinates
0019ced0: 00021200 sll r2,r2,0x08                        |Elevation offset
0019ced4: 00001812 mflo r3                               |
0019ced8: 00641821 addu r3,r3,r4                         |
0019cedc: 00621821 addu r3,r3,r2                         |Unit Tile ID  X + YMax X + Elvation offset
0019cee0: 000318c0 sll r3,r3,0x03                        |
0019cee4: 3c018019 lui r1,0x8019                         |
0019cee8: 00230821 addu r1,r1,r3                         |
0019ceec: 9022f8d1 lbu r2,-0x072f(r1)                    |Unit Tile data 0x05 0x8018f8cc + 0x05 + Tile offset
0019cef0: 00000000 nop                                   |
0019cef4: 34420040 ori r2,r2,0x0040                      |
0019cef8: 3c018019 lui r1,0x8019                         |
0019cefc: 00230821 addu r1,r1,r3                         |
0019cf00: a022f8d1 sb r2,-0x072f(r1)                     |Enable Targeted flag on Unit Tile 0x8018f8cc + 0x05 + Tile offset
0019cf04: 00009821 addu r19,r0,r0                        |Force r19 to 0x00

=== POST TARGETING SECTION - Enable Tile's flags in AI 0xb4c if Tile is ON in AI 0xbdc and Targetable (Tile 0x05 flag 0x40 is ON) ===
0019cf08: 02204021 addu r8,r17,r0                |Prepare Dynamic AI pointer (+0x24 for high elevation)
                                                @LOOP - Both elevation
0019cf0c: 92220e3b lbu r2,0x0e3b(r17)                |Map Max Y
0019cf10: 00000000 nop                               |
0019cf14: 1840002e blez r2,0x0019cfd0                #If max Y is invalid : branch to 
0019cf18: 00009021 addu r18,r0,r0                    |intialize Y counter
0019cf1c: 00134a00 sll r9,r19,0x08                   |Elevation offset for tile data
0019cf20: 25050b4c addiu r5,r8,0x0b4c                |Dynamic pointer to AI 0xb4c (+Elevation offset)
0019cf24: 25060bdc addiu r6,r8,0x0bdc                |Dynamic pointer to AI 0xbdc (+Elevation offset) Tiles you can target to hit a unit
                                                    @LOOP - All Y rows
0019cf28: 94d40000 lhu r20,0x0000(r6)                    |This Y row flags in AI 0xbdc Tiles from where you can hit a target
0019cf2c: 00000000 nop                                   |
0019cf30: 3282ffff andi r2,r20,0xffff                    |
0019cf34: 10400020 beq r2,r0,0x0019cfb8                  #If there is no flags in this row  (AI 0xbdc): branch to  Next Y row AI 0xbdc is Targetable tiles Table
0019cf38: a4a00000 sh r0,0x0000(r5)                      |Initialize this row flag in AI 0x0b4c
0019cf3c: 92230e3a lbu r3,0x0e3a(r17)                    |Max X
0019cf40: 00000000 nop                                   |
0019cf44: 1060001c beq r3,r0,0x0019cfb8                  #If Map max X is invalid : branch to  Next Y row
0019cf48: 00008021 addu r16,r0,r0                        |Initialize X counter
0019cf4c: 00403821 addu r7,r2,r0                         |Row of flag (AI 0xbdc)
0019cf50: 00a02021 addu r4,r5,r0                         |Dynamic pointer to AI 0xb4c (+Y row and Elevation offset)
0019cf54: 02071004 sllv r2,r7,r16                        |Shift by X counter (Tiles of interest flag is in 0x8000 position)
                                                        @LOOP All Tiles in Row
0019cf58: 30428000 andi r2,r2,0x8000                         |Bitmask
0019cf5c: 10400011 beq r2,r0,0x0019cfa4                      #If This tile flag is disabled (AI 0xbdc) : branch to  Next Tile
0019cf60: 02430018 mult r18,r3                               |
0019cf64: 00001012 mflo r2                                   |Y counter * Max X
0019cf68: 00501021 addu r2,r2,r16                            |+ X 
0019cf6c: 00491021 addu r2,r2,r9                             |+ Elevation offset
0019cf70: 000210c0 sll r2,r2,0x03                            |
0019cf74: 3c018019 lui r1,0x8019                             |
0019cf78: 00220821 addu r1,r1,r2                             |
0019cf7c: 9022f8d1 lbu r2,-0x072f(r1)                        |This Tile data 0x05 0x8018f8cc + 0x05 + Tile offset
0019cf80: 00000000 nop                                       |
0019cf84: 00021182 srl r2,r2,0x06                            |Shift Byte (0x40 becomes 0x1)
0019cf88: 30420001 andi r2,r2,0x0001                         |
0019cf8c: 10400005 beq r2,r0,0x0019cfa4                      #If This Tile is not in Targeted AoE : branch to  Next Tile

0019cf90: 34028000 ori r2,r0,0x8000                          |
0019cf94: 94830000 lhu r3,0x0000(r4)                         |This Y row flags in AI 0x0b4c
0019cf98: 02021007 srav r2,r2,r16                            |Bitmask for this iteration Tile
0019cf9c: 00621825 or r3,r3,r2                               |
0019cfa0: a4830000 sh r3,0x0000(r4)                          |Enable this Tile in AI 0x0b4c If this tile is in AI 0xbdc and is in Targeted AoE

0019cfa4: 92230e3a lbu r3,0x0e3a(r17)                        |Max X
0019cfa8: 26100001 addiu r16,r16,0x0001                      |X counter +1
0019cfac: 0203102a slt r2,r16,r3                             |
0019cfb0: 1440ffe9 bne r2,r0,0x0019cf58                  Λ Loop while X < Max X
0019cfb4: 02071004 sllv r2,r7,r16                            |Shift Row's Flag by X counter (bit of interest is 0x8000)
0019cfb8: 24a50002 addiu r5,r5,0x0002                    |Y offset (halfword) for AI 0xb4c
0019cfbc: 92220e3b lbu r2,0x0e3b(r17)                    |Max Y
0019cfc0: 26520001 addiu r18,r18,0x0001                  |Y counter +1
0019cfc4: 0242102a slt r2,r18,r2                         |
0019cfc8: 1440ffd7 bne r2,r0,0x0019cf28              Λ Loop while Y < Max Y
0019cfcc: 24c60002 addiu r6,r6,0x0002                    |Y offset (halfword) for AI 0xbdc
0019cfd0: 26730001 addiu r19,r19,0x0001              |Elevation counter + 1
0019cfd4: 2a620002 slti r2,r19,0x0002                |
0019cfd8: 1440ffcc bne r2,r0,0x0019cf0c          Λ Loop 2 times
0019cfdc: 25080024 addiu r8,r8,0x0024                |AI data elevation offset
0019cfe0: 00009821 addu r19,r0,r0                    |

=== TEST ALL TARGETABLE TILES (in AI 0xb4c) ===
                                                @LOOP - Both elevation
0019cfe4: 92220e3b lbu r2,0x0e3b(r17)                |Max Y
0019cfe8: 00000000 nop                               |
0019cfec: 1840007d blez r2,0x0019d1e4                #If Map Max Y is invalid : branch to  Next elevation
0019cff0: 00009021 addu r18,r0,r0                    |Initialize Y counter
0019cff4: 001310c0 sll r2,r19,0x03                   |
                                                    @LOOP - All Y rows
0019cff8: 00531021 addu r2,r2,r19                        |
0019cffc: 00021080 sll r2,r2,0x02                        |
0019d000: 00511021 addu r2,r2,r17                        |
0019d004: 00121840 sll r3,r18,0x01                       |
0019d008: 00431021 addu r2,r2,r3                         |
0019d00c: 94540b4c lhu r20,0x0b4c(r2)                    |This Y row flags in AI 0x0b4c 0x8019f3c4 + 0xb4c + Elevation offset (0x24) + Y offset (halfword) Targetable and targeted
0019d010: 00000000 nop                                   |
0019d014: 1280006e beq r20,r0,0x0019d1d0                 #If There is no flags in this row : branch to  Next Y row  in AI 0xb4c
0019d018: 00000000 nop                                   |
0019d01c: 92220e3a lbu r2,0x0e3a(r17)                    |Max X
0019d020: 00000000 nop                                   |
0019d024: 1840006a blez r2,0x0019d1d0                    #If Map Max X is invalid : Branch to  Next Y row
0019d028: 00008021 addu r16,r0,r0                        |Initialize X counter
0019d02c: 02141004 sllv r2,r20,r16                       |Shift Y row of flags by X counter (Tile of interest flag is in 0x8000 position)
                                                        @LOOP - All tiles in Y row
0019d030: 30428000 andi r2,r2,0x8000                         |
0019d034: 10400061 beq r2,r0,0x0019d1bc                      #If This iteration Tile's flag is OFF : branch to  Next Tile  in AI 0xb4c
0019d038: 34020006 ori r2,r0,0x0006                          |
0019d03c: 92230026 lbu r3,0x0026(r17)                        |Load AI 0x0026 (Targeting type)
0019d040: a6300028 sh r16,0x0028(r17)                        |Store X counter at AI 0x0028
0019d044: a632002c sh r18,0x002c(r17)                        |Store Y counter at AI 0x002c

                  --- More Targeting checks (unit, obstacles) ---
0019d048: 10620006 beq r3,r2,0x0019d064                      #If Targeting is not Unit specific (<> 0x06)
0019d04c: a633002a sh r19,0x002a(r17)                        |Store Elevation counter at AI 0x002a
0019d050: 8e23000c lw r3,0x000c(r17)                             |Considered Ability AI Behavior 1 to 4
0019d054: 3c0200c0 lui r2,0x00c0                                 |
0019d058: 00621824 and r3,r3,r2                                  |
0019d05c: 10600008 beq r3,r0,0x0019d080                          #If Considered Ability do NOT have [Longbow Attack] or [Stop at obstacle] Avoid routine below Do not seek a Unit on considered panel
0019d060: 00000000 nop                                           |
                                                             Else : Targeting is Unit Specific or  [Longbow Attack] or [Stop at obstacle]
0019d064: 0c067486 jal 0x0019d218                                |-->See_if_any_units_are_on_target_panel returns Unit ID (or 0x15)
0019d068: 00000000 nop                                           |
0019d06c: a2220027 sb r2,0x0027(r17)                             |Store Unit ID at AI 0x27
0019d070: 304200ff andi r2,r2,0x00ff                             |
0019d074: 34030015 ori r3,r0,0x0015                              |
0019d078: 10430039 beq r2,r3,0x0019d160                          #If No Unit found on Considered Tile Post priority section
0019d07c: 00000000 nop                                           |
0019d080: 8e23000c lw r3,0x000c(r17)                         |Considered Ability AI Behavior 1 to 4
0019d084: 3c020080 lui r2,0x0080                             |
0019d088: 00621024 and r2,r3,r2                              |
0019d08c: 10400007 beq r2,r0,0x0019d0ac                      #If considered Ability has [Longbow attack]
0019d090: 3c020040 lui r2,0x0040                                 |
0019d094: 92240e2e lbu r4,0x0e2e(r17)                            |Acting Unit ID
0019d098: 92250027 lbu r5,0x0027(r17)                            |Target ID
0019d09c: 0c06bf64 jal 0x001afd90                                |-->001afd90_-_001aff14 Trajectory ? 
0019d0a0: 00000000 nop                                           |
0019d0a4: 08067445 j 0x0019d114                                  >>jump and  check result (obstacle ?)
0019d0a8: 00000000 nop                                           |
                                                             Else : not longbow attack
0019d0ac: 00621024 and r2,r3,r2                              |
0019d0b0: 1040001a beq r2,r0,0x0019d11c                      #If Considered Ability has [Stop at obstacle]
0019d0b4: 00000000 nop                                           |
0019d0b8: 92220000 lbu r2,0x0000(r17)                            |Considered Ability's skillset
0019d0bc: 3c018006 lui r1,0x8006                                 |
0019d0c0: 00220821 addu r1,r1,r2                                 |
0019d0c4: 90235cb4 lbu r3,0x5cb4(r1)                             |Considered skillset's action menu
0019d0c8: 34020001 ori r2,r0,0x0001                              |
0019d0cc: 1462000d bne r3,r2,0x0019d104                          #If Considered Action menu is [Item inventory]
0019d0d0: 00000000 nop                                               |
0019d0d4: 92220027 lbu r2,0x0027(r17)                                |Target ID
0019d0d8: 8e2417f8 lw r4,0x17f8(r17)                                 |Send
0019d0dc: 000228c0 sll r5,r2,0x03                                    |
0019d0e0: 00a22823 subu r5,r5,r2                                     |
0019d0e4: 00052980 sll r5,r5,0x06                                    |
0019d0e8: 3c028019 lui r2,0x8019                                     |
0019d0ec: 244208cc addiu r2,r2,0x08cc                                |
0019d0f0: 0c0664db jal 0x0019936c                                    |-->Calculate_Distance_Between_Units
0019d0f4: 00a22821 addu r5,r5,r2                                     |Send Targeted Unit data pointer
0019d0f8: 28420002 slti r2,r2,0x0002                                 |
0019d0fc: 14400007 bne r2,r0,0x0019d11c                              #If Item inventory with point blank target or self targeting Do not seek obstacles
0019d100: 00000000 nop                                               |
                                                                 Else : Ability has [Stop at Obstacle] or Item is throwed
0019d104: 92240e2e lbu r4,0x0e2e(r17)                                |Caster ID
0019d108: 92250027 lbu r5,0x0027(r17)                                |Target ID
0019d10c: 0c06c1b4 jal 0x001b06d0                                    |-->001b06d0_-_001b0814 Obstacle related
0019d110: 00000000 nop                                               |
                                                            Check if Obstacle (longbow or direct)
0019d114: 10400029 beq r2,r0,0x0019d1bc                      #If r2 = 0x00 (Obstacle ?) branch to  Next Tile
0019d118: 00000000 nop                                       |

                   --- (AI 0x0cb4) POST TARGETING / OBSTACLE ---
0019d11c: 8e230cb4 lw r3,0x0cb4(r17)                         |Load AI 0x0cb4 AI processing ?
0019d120: 3c020200 lui r2,0x0200                             |
0019d124: 00621824 and r3,r3,r2                              |
0019d128: 10600003 beq r3,r0,0x0019d138                      #If AI 0xcb4 flag 0x02000000 is ON
0019d12c: 34020001 ori r2,r0,0x0001                              |
0019d130: 0806744f j 0x0019d13c                                  >>Avoid opposite case
0019d134: a2220e4e sb r2,0x0e4e(r17)                             |Set AI 0xe4e to 0x01
                                                             Else : AI 0xcb4 flag 0x02000000 is OFF
0019d138: a2200e4e sb r0,0x0e4e(r17)                             |Set AI 0xe4e to 0x00

                   --- CHECK ABILITY RESULT (store best outcome in AI 0x34) ---
0019d13c: 0c0674c2 jal 0x0019d308                            |-->Check_Set_Highest_Unit_Priority_(0019d308)  Simulate Considered Ability from considered Position Targeting considered Tile and store it in AI 0x34 if better
0019d140: 00000000 nop                                       |
0019d144: 2403ffff addiu r3,r0,-0x0001                       |
0019d148: 1043ff4f beq r2,r3,0x0019ce88                      #If Returned value is -0x01 Store 0x01 in AI 0xc72 and exit  0x19d37c didn't update priority ?
0019d14c: 34020001 ori r2,r0,0x0001                          |
                                                             Else : returned value <> -0x01
0019d150: 922219bc lbu r2,0x19bc(r17)                            |AI 0x19bc
0019d154: 00000000 nop                                           |
0019d158: 10400026 beq r2,r0,0x0019d1f4                          #if AI 0x19bc = 0x00  Exit returns 0x00
0019d15c: 00001021 addu r2,r0,r0                                 |

                  --- (AI 0x0e4e) POST-PRIORITY Section
0019d160: 92220e4e lbu r2,0x0e4e(r17)                        |AI 0xe4e
0019d164: 00000000 nop                                       |
0019d168: 10400014 beq r2,r0,0x0019d1bc                      #If AI 0xe4e = 0x00 (not fine for caster ?) branch to  Next tile
0019d16c: 001310c0 sll r2,r19,0x03                           |
                                                             Else : Ok for caster ?
0019d170: 00531021 addu r2,r2,r19                                |
0019d174: 00021080 sll r2,r2,0x02                                |Elevation offset (0x24)
0019d178: 00511021 addu r2,r2,r17                                |
0019d17c: 24420bdc addiu r2,r2,0x0bdc                            |
0019d180: 00122040 sll r4,r18,0x01                               |Y row offset (halfword)
0019d184: 00822021 addu r4,r4,r2                                 |0x8019f3c4 + 0xbdc + this row offset
0019d188: 34028000 ori r2,r0,0x8000                              |
0019d18c: 94830000 lhu r3,0x0000(r4)                             |This Y row flags in AI 0xbdc
0019d190: 02021007 srav r2,r2,r16                                |Bitmask for this iteration Tile
0019d194: 00621826 xor r3,r3,r2                                  |
0019d198: a4830000 sh r3,0x0000(r4)                              |Delete this Tile flag in AI 0xbdc
0019d19c: 92220cbb lbu r2,0x0cbb(r17)                            |Nb of Tiles in AI 0xbdc
0019d1a0: 00000000 nop                                           |
0019d1a4: 2442ffff addiu r2,r2,-0x0001                           |
0019d1a8: a2220cbb sb r2,0x0cbb(r17)                             |Decrease Tile's counter in 0xbdc
0019d1ac: 92220cbb lbu r2,0x0cbb(r17)                            |Tile counter
0019d1b0: 00000000 nop                                           |
0019d1b4: 10400006 beq r2,r0,0x0019d1d0                          #If there is no tiles left in AI 0xbdc : branch to  Next Y row
0019d1b8: 00000000 nop                                           |
0019d1bc: 92220e3a lbu r2,0x0e3a(r17)                        |Map Max X
0019d1c0: 26100001 addiu r16,r16,0x0001                      |X counter + 1
0019d1c4: 0202102a slt r2,r16,r2                             |
0019d1c8: 1440ff99 bne r2,r0,0x0019d030                  Λ Loop while X < Max X
0019d1cc: 02141004 sllv r2,r20,r16                       |
0019d1d0: 92220e3b lbu r2,0x0e3b(r17)                    |Max Y
0019d1d4: 26520001 addiu r18,r18,0x0001                  |Y counter + 1
0019d1d8: 0242102a slt r2,r18,r2                         |
0019d1dc: 1440ff86 bne r2,r0,0x0019cff8              Λ Loop while Y < Max Y
0019d1e0: 001310c0 sll r2,r19,0x03                       |Prepare elevation offset
0019d1e4: 26730001 addiu r19,r19,0x0001              |Elevation + 1
0019d1e8: 2a620002 slti r2,r19,0x0002                |
0019d1ec: 1440ff7d bne r2,r0,0x0019cfe4          Λ Loop 2 times
0019d1f0: 00001021 addu r2,r0,r0                 |Return 0x00
0019d1f4: 8fbf0044 lw r31,0x0044(r29)
0019d1f8: 8fb40040 lw r20,0x0040(r29)
0019d1fc: 8fb3003c lw r19,0x003c(r29)
0019d200: 8fb20038 lw r18,0x0038(r29)
0019d204: 8fb10034 lw r17,0x0034(r29)
0019d208: 8fb00030 lw r16,0x0030(r29)
0019d20c: 27bd0048 addiu r29,r29,0x0048
0019d210: 03e00008 jr r31
0019d214: 00000000 nop

Return locations

BATTLE.BIN
 0019b480: Check_if_any_units_are_in_range_(0019b30c)
 0019ba5c: AI_Targeting_Matrix_Analysis_(0019b7b8)
 0019c0c4: Find_Highest_Target_Priority_in_Ability_Range_(0019bf2c)
 0019c16c: Find_Highest_Target_Priority_in_Ability_Range_(0019bf2c)