Difference between revisions of "Find Highest Target Priority in Ability Range (0019bf2c)"

From Final Fantasy Hacktics Wiki
Jump to navigation Jump to search
(Created page with "<font face='Courier New'> 0019bf2c: 3c02801a lui r2,0x801a 0019bf30: 90420d7b lbu r2,0x0d7b(r2) 0019bf34: 27bdffe0 addiu r29,r29,0xffe0 0019bf38: afb00010 sw r16,0x0010(...")
 
 
(5 intermediate revisions by one other user not shown)
Line 1: Line 1:
<font face='Courier New'>
+
'''BATTLE.BIN''' :  - Find_Highest_Target_Priority_in_Ability_Range_(0019bf2c)
 +
Test All Tiles to target from all tiles to move - best outcome is stored in AI 0x0034
 +
------------------------------------------------------------------------------------------
 +
Parameter : r4 = Pointer to unit battle data (801908cc)
 +
Return : r2 = 0x00 by default
 +
          r2 = -0x01 (from [[VSync_call]] or  [[AI_Target_Unit_for_Direct_vs_Arc_Attack_(0019cd9c)]]  )
 +
------------------------------------------------------------------------------------------
 +
0019bf2c: 3c02801a lui r2,0x801a            |
 +
0019bf30: 90420d7b lbu r2,0x0d7b(r2)        |{{f/load|AI 0x19b7}}
 +
0019bf34: 27bdffe0 addiu r29,r29,-0x0020    |
 +
0019bf38: afb00010 sw r16,0x0010(r29)        |
 +
0019bf3c: 3c10801a lui r16,0x801a            |
 +
0019bf40: 2610f3c4 addiu r16,r16,0xf3c4      |{{f/adr|0x8019f3c4 (AI pointer)}}
 +
0019bf44: afbf0018 sw r31,0x0018(r29)        |
 +
0019bf48: 10400016 beq r2,r0,0x0019bfa4      {{f/Cond|If AI 0x19b7 <> 0x00}}
 +
0019bf4c: afb10014 sw r17,0x0014(r29)            |
 +
0019bf50: 3c03801a lui r3,0x801a                |
 +
0019bf54: 9063029d lbu r3,0x029d(r3)            |{{f/load|Load AI 0xed9}} {{f/std|This routine control variable ?}}
 +
0019bf58: 00000000 nop                          |
 +
0019bf5c: 1060001d beq r3,r0,0x0019bfd4          {{f/Cond|<nowiki>if AI 0xed9 = 0x00 : branch to </nowiki>}} {{f/loc|Main priority loop}} {{f/std|without setting tiles to move and tile to target matrixes}}
 +
0019bf60: 34020001 ori r2,r0,0x0001              |
 +
0019bf64: 10620055 beq r3,r2,0x0019c0bc          {{f/Cond|<nowiki>if AI 0xed9 = 0x01 : branch to </nowiki>}} {{f/loc|Priority calculation (only 1 combination ? - first loop)}} {{f/std|Destination and Tile to target are already decided ?}}
 +
0019bf68: 00000000 nop                          |
 +
0019bf6c: 3c02801a lui r2,0x801a                |
 +
0019bf70: 904202a0 lbu r2,0x02a0(r2)            |{{f/load|? Elevation}}
 +
0019bf74: 00000000 nop                          |
 +
0019bf78: 000218c0 sll r3,r2,0x03                |
 +
0019bf7c: 00621821 addu r3,r3,r2                |
 +
0019bf80: 00031880 sll r3,r3,0x02                |{{f/std|Elevation offset}}
 +
0019bf84: 3c02801a lui r2,0x801a                |
 +
0019bf88: 9042029f lbu r2,0x029f(r2)            |{{f/load|? Y coordinates}}
 +
0019bf8c: 00701821 addu r3,r3,r16                |
 +
0019bf90: 00021040 sll r2,r2,0x01                |{{f/std|Y offset (halfword)}}
 +
0019bf94: 00621821 addu r3,r3,r2                |{{f/adr|0x8019f3c4 + Elevation and Y offset (1 bit per tile model)}}
 +
0019bf98: 94710b94 lhu r17,0x0b94(r3)            |{{f/load|Y row of flags in AI 0xb94}} {{f/std|Tiles from where you can hit a unit (it is not shifted at all - wtf ?)}}
 +
0019bf9c: 08067059 j 0x0019c164                  {{f/jump|jump to }} {{f/loc|Priority calculation (only 1 combination ? - second loop)}} {{f/std|Destination and Tile to target are already decided ?}}
 +
0019bfa0: 00000000 nop                          |
 +
                                              '''<nowiki>Else : AI 0x19b7 = 0x00</nowiki>'''
 +
0019bfa4: 3c02801a lui r2,0x801a                |
 +
0019bfa8: 904201f2 lbu r2,0x01f2(r2)            |{{f/load|Load Acting Unit's ID}} {{f/std|aka AI  0xe2e}}
 +
0019bfac: 00000000 nop                          |
 +
0019bfb0: 00501021 addu r2,r2,r16                |
 +
0019bfb4: 90510c8d lbu r17,0x0c8d(r2)            |{{f/load|Acting Unit flag in Potentiel Targets list (AI 0xc8d)}}
 +
0019bfb8: 0c0670f5 jal 0x0019c3d4                |{{f/jal|Evaluate_Linear_Ability_Behaviors|Evaluate_Linear_Ability_Behaviors}} {{f/std|Set all desirable Tile to move and tiles to target}}
 +
0019bfbc: a0400c8d sb r0,0x0c8d(r2)              |{{f/store|Remove Unit in Targetable List}}
 +
0019bfc0: 3c02801a lui r2,0x801a                |
 +
0019bfc4: 904201f2 lbu r2,0x01f2(r2)            |{{f/load|Load Acting Unit's ID}}
 +
0019bfc8: 00000000 nop                          |
 +
0019bfcc: 00501021 addu r2,r2,r16                |
 +
0019bfd0: a0510c8d sb r17,0x0c8d(r2)            |{{f/store|Restore Unit Targetable Flag}} {{f/std|0x8019f3c4 + c8d + Unit Offset}}
 
   
 
   
  0019bf2c: 3c02801a lui r2,0x801a
+
  {{f/sec|<nowiki>=== TEST ALL COMBINATIONS (MOVE + TARGET) ===</nowiki>}}
  0019bf30: 90420d7b lbu r2,0x0d7b(r2)
+
  0019bfd4: 0c0076ea jal 0x0001dba8            |{{f/jal|VSync_call|VSync_call}}
  0019bf34: 27bdffe0 addiu r29,r29,0xffe0
+
  0019bfd8: 34040001 ori r4,r0,0x0001          |
  0019bf38: afb00010 sw r16,0x0010(r29)
+
  0019bfdc: 284201b9 slti r2,r2,0x01b9        |
  0019bf3c: 3c10801a lui r16,0x801a
+
  0019bfe0: 14400004 bne r2,r0,0x0019bff4      {{f/Cond|If Vsync returned r2 > 0x1b8}}
  0019bf40: 2610f3c4 addiu r16,r16,0xf3c4
+
  0019bfe4: 3c030400 lui r3,0x0400                |
  0019bf44: afbf0018 sw r31,0x0018(r29)
+
  0019bfe8: a2000ed9 sb r0,0x0ed9(r16)             |{{f/store|Reset AI 0xed9}}
  0019bf48: 10400016 beq r2,r0,0x0019bfa4
+
  0019bfec: 0806707d j 0x0019c1f4                  |{{f/loc|Exit routine}} {{f/Returns|returns -0x01}}
  0019bf4c: afb10014 sw r17,0x0014(r29)
+
0019bff0: 2402ffff addiu r2,r0,-0x0001          |
  0019bf50: 3c03801a lui r3,0x801a
+
                                              '''Else Vsync Call is fine'''
  0019bf54: 9063029d lbu r3,0x029d(r3)
+
  0019bff4: 8e02000c lw r2,0x000c(r16)             |{{f/load|Load AI Flags 1 to 4 }}
  0019bf58: 00000000 nop
+
  0019bff8: a20019b7 sb r0,0x19b7(r16)            |{{f/store|<nowiki>Set AI 0x19b7 = 0x00</nowiki>}}
0019bf5c: 1060001d beq r3,r0,0x0019bfd4
+
  0019bffc: 00431024 and r2,r2,r3                 |
  0019bf60: 34020001 ori r2,r0,0x0001
+
  0019c000: 1040000a beq r2,r0,0x0019c02c          {{f/Cond|If AI Byte 0x04 flag 0x04 is ON (?)}} {{f/std|Not monster skill - byte 0x04 is updated after loading data from SCUS (weapon range related ?)}}
  0019bf64: 10620055 beq r3,r2,0x0019c0bc
+
  0019c004: a2000e4d sb r0,0x0e4d(r16)            |{{f/store|<nowiki>Set AI 0xe4d = 0x00</nowiki>}}
  0019bf68: 00000000 nop
+
  0019c008: 3c03fdff lui r3,0xfdff                    |
0019bf6c: 3c02801a lui r2,0x801a
+
  0019c00c: 8e020cb4 lw r2,0x0cb4(r16)                |{{f/adr|AI 0xcb4 (AI processing order ?)}}
0019bf70: 904202a0 lbu r2,0x02a0(r2)
+
  0019c010: 3463ffff ori r3,r3,0xffff                  |
  0019bf74: 00000000 nop
+
  0019c014: 00431024 and r2,r2,r3                      |
  0019bf78: 000218c0 sll r3,r2,0x03
+
  0019c018: 0806701a j 0x0019c068                      {{f/jump|Jump to }} {{f/loc|Test all move/target combinations}} {{f/std|<nowiki>keep AI 0xe4d = 0x00</nowiki>}}
  0019bf7c: 00621821 addu r3,r3,r2
+
  0019c01c: ae020cb4 sw r2,0x0cb4(r16)                |{{f/store|Remove 0x04000000 Flag from AI 0xcb4}}
  0019bf80: 00031880 sll r3,r3,0x02
+
   
  0019bf84: 3c02801a lui r2,0x801a
+
                                                        {{f/sec|BACK JUMP (fail ?)}}
  0019bf88: 9042029f lbu r2,0x029f(r2)
+
  0019c020: a2020ed9 sb r2,0x0ed9(r16)                     |{{f/store|Update AI 0xed9 depending from where the code is coming}} {{f/std|control variable ?}}
  0019bf8c: 00701821 addu r3,r3,r16
+
  0019c024: 0806707d j 0x0019c1f4                          |{{f/loc|EXIT}} {{f/Returns|Return -0x01}}
  0019bf90: 00021040 sll r2,r2,0x01
+
  0019c028: 2402ffff addiu r2,r0,-0x0001                  |
  0019bf94: 00621821 addu r3,r3,r2
+
   
  0019bf98: 94710b94 lhu r17,0x0b94(r3)
+
                                                  '''Else : Ability AI 0x000f flag 0x04 is OFF'''
  0019bf9c: 08067059 j 0x0019c164
+
0019c02c: 92030cbb lbu r3,0x0cbb(r16)                |{{f/load|Number of Tiles enabled in AI 0x0bdc}} {{f/std|Tiles to hit}}
0019bfa0: 00000000 nop
+
  0019c030: 92020cbc lbu r2,0x0cbc(r16)               |{{f/load|Nb of Tiles enabled in AI 0x0b94}} {{f/std|Tiles to move}}
  0019bfa4: 3c02801a lui r2,0x801a
+
  0019c034: 00000000 nop                               |
  0019bfa8: 904201f2 lbu r2,0x01f2(r2)
+
  0019c038: 00620018 mult r3,r2                       |
  0019bfac: 00000000 nop
+
  0019c03c: a2030eda sb r3,0x0eda(r16)                 |{{f/store|Set AI 0x0eda to AI 0x0cbb}}
  0019bfb0: 00501021 addu r2,r2,r16
+
  0019c040: 00001012 mflo r2                          |
  0019bfb4: 90510c8d lbu r17,0x0c8d(r2)
+
  0019c044: a2020eda sb r2,0x0eda(r16)                |{{f/store|Set AI 0xeda to AI 0xcbb * AI 0xcbc}} {{f/std|????}}
  0019bfb8: 0c0670f5 jal 0x0019c3d4
+
  0019c048: 92020eda lbu r2,0x0eda(r16)               |{{f/load|AI 0x0eda}} {{f/std|Maximum possibilities ?}}
  0019bfbc: a0400c8d sb r0,0x0c8d(r2)
+
  0019c04c: 00000000 nop                              |
  0019bfc0: 3c02801a lui r2,0x801a
+
  0019c050: 2c42000b sltiu r2,r2,0x000b                |{{f/std|0x1 If AI 0xcbb * AI 0xcbc < 0x0b}}
  0019bfc4: 904201f2 lbu r2,0x01f2(r2)
+
  0019c054: 14400003 bne r2,r0,0x0019c064              {{f/Cond|If AI 0xcbb * AI 0xcbc > 0x0a}}
  0019bfc8: 00000000 nop
+
  0019c058: 34020001 ori r2,r0,0x0001                      |
0019bfcc: 00501021 addu r2,r2,r16
+
  0019c05c: a2020e4d sb r2,0x0e4d(r16)                    |{{f/store|Set AI 0xe4d to 0x01}}
  0019bfd0: a0510c8d sb r17,0x0c8d(r2)
+
0019c060: 34020001 ori r2,r0,0x0001                      |
  0019bfd4: 0c0076ea jal 0x0001dba8
+
  0019c064: a2020e4d sb r2,0x0e4d(r16)                 |{{f/store|This saves the exact same information to the exact same place.}}
  0019bfd8: 34040001 ori r4,r0,0x0001
+
  0019c068: 8e020cb4 lw r2,0x0cb4(r16)            |{{f/adr|AI 0xcb4 (AI processing order ?)}}
  0019bfdc: 284201b9 slti r2,r2,0x01b9
+
  0019c06c: 3c030200 lui r3,0x0200                |
  0019bfe0: 14400004 bne r2,r0,0x0019bff4
+
  0019c070: 00431024 and r2,r2,r3                  |
  0019bfe4: 3c030400 lui r3,0x0400
+
  0019c074: 14400005 bne r2,r0,0x0019c08c          {{f/Cond|If AI 0xcb4 flag 0x0200000 is OFF}} {{f/std| Weapon range related ? Targeting type ?}}
  0019bfe8: a2000ed9 sb r0,0x0ed9(r16)
+
  0019c078: 00000000 nop                              |
  0019bfec: 0806707d j 0x0019c1f4
+
  0019c07c: 92020e4d lbu r2,0x0e4d(r16)               |{{f/load|Load 0xe4d }} {{f/std| Set to 0x01 if AI 0x0f flag 0x04 is OFF}}
  0019bff0: 2402ffff addiu r2,r0,0xffff
+
  0019c080: 00000000 nop                              |
0019bff4: 8e02000c lw r2,0x000c(r16)
+
  0019c084: 10400014 beq r2,r0,0x0019c0d8              {{f/Cond|<nowiki>If AI 0xe4d = 0x00 : branch to </nowiki>}} {{f/loc|Second loop (not moving ?)}}
  0019bff8: a20019b7 sb r0,0x19b7(r16)
+
  0019c088: 00000000 nop                              |
  0019bffc: 00431024 and r2,r2,r3
+
  0019c000: 1040000a beq r2,r0,0x0019c02c
+
                  {{f/sec|--- TEST ALL POSSIBILITIES (DESTINATION - TARGETING) ---}}
  0019c004: a2000e4d sb r0,0x0e4d(r16)
+
                                                {{f/bloop|LOOP - Test all destination tiles}}
  0019c008: 3c03fdff lui r3,0xfdff
+
  0019c08c: 92020cbb lbu r2,0x0cbb(r16)                |{{f/load|Load Nb Of Tiles enabled in AI 0x0bdc}} {{f/std|Nb of Targetable tiles to hit a unit}}
0019c00c: 8e020cb4 lw r2,0x0cb4(r16)
+
  0019c090: 00000000 nop                              |
  0019c010: 3463ffff ori r3,r3,0xffff
+
0019c094: 10400054 beq r2,r0,0x0019c1e8              {{f/Cond|If there is no targetable tiles with this ability : }} {{f/loc|Exit loop restore data then exit}} {{f/std| Might be Disabled during priority calculation}}
  0019c014: 00431024 and r2,r2,r3
+
  0019c098: 00000000 nop                              |
  0019c018: 0806701a j 0x0019c068
+
  0019c09c: 92020cbc lbu r2,0x0cbc(r16)               |{{f/load|Load Nb Of Tiles enabled in AI 0x0b94}} {{f/std|Nb of Tiles from where you can hit a unit}}
  0019c01c: ae020cb4 sw r2,0x0cb4(r16)
+
  0019c0a0: 00000000 nop                              |
0019c020: a2020ed9 sb r2,0x0ed9(r16)
+
  0019c0a4: 10400050 beq r2,r0,0x0019c1e8              {{f/Cond|If there is no destination tiles with this ability : branch to }} {{f/loc|Exit loop restore data then exit}} {{f/std|All Tiles done in 19c280}}
  0019c024: 0806707d j 0x0019c1f4
+
  0019c0a8: 00000000 nop                              |
  0019c028: 2402ffff addiu r2,r0,0xffff
+
  0019c0ac: 0c0670a0 jal 0x0019c280                    |{{f/jal|Start_searching_for_Highest_Target_Priority_(0019c280)|Start_searching_for_Highest_Target_Priority_(0019c280)}} {{f/std|Find Best Tile in AI 0xb94 and store its coordinates at AI 0x18 (then disable it)}}
  0019c02c: 92030cbb lbu r3,0x0cbb(r16)
+
  0019c0b0: 00000000 nop                              |
  0019c030: 92020cbc lbu r2,0x0cbc(r16)
+
  0019c0b4: 0c067083 jal 0x0019c20c                    |{{f/jal|0019c20c_-_0019c27c|0019c20c_-_0019c27c}} {{f/std|Set AI 0x14 - Set AI 0x18 to considered caster position}}
  0019c034: 00000000 nop
+
  0019c0b8: 00000000 nop                              |
  0019c038: 00620018 mult r3,r2
+
  0019c0bc: 0c067367 jal 0x0019cd9c                    |{{f/jal|AI_Target_Unit_for_Direct_vs_Arc_Attack_(0019cd9c)|AI_Target_Unit_for_Direct_vs_Arc_Attack_(0019cd9c)}} {{f/std|Test all Targetable tile from considered position (store best result at AI 0x34)}}
  0019c03c: a2030eda sb r3,0x0eda(r16)
+
  0019c0c0: 00000000 nop                               |
  0019c040: 00001012 mflo r2
+
  0019c0c4: 2403ffff addiu r3,r0,-0x0001              |
  0019c044: a2020eda sb r2,0x0eda(r16)
+
  0019c0c8: 1043ffd5 beq r2,r3,0x0019c020              {{f/Cond|If returned value is -0x01 :}} {{f/loc|<nowiki>Set AI 0xed9 = 0x01 then Exit</nowiki>}} {{f/Returns|Return -0x01}}
  0019c048: 92020eda lbu r2,0x0eda(r16)
+
  0019c0cc: 34020001 ori r2,r0,0x0001                  |
  0019c04c: 00000000 nop
+
  0019c0d0: 08067023 j 0x0019c08c                  {{f/eloop|Loop while there is still tiles in AI 0xbdc or 0xb94}}
  0019c050: 2c42000b sltiu r2,r2,0x000b
+
0019c0d4: 00000000 nop                              |
  0019c054: 14400003 bne r2,r0,0x0019c064
+
0019c058: 34020001 ori r2,r0,0x0001
+
                  {{f/sec|--- TEST ALL POSSIBILITIES (TARGETING only from a given location) ---}}
  0019c05c: a2020e4d sb r2,0x0e4d(r16)
+
  0019c0d8: a2000edc sb r0,0x0edc(r16)             |{{f/store|Initialize Current Map Level}}
  0019c060: 34020001 ori r2,r0,0x0001
+
                                                {{f/bloop|LOOP - Elevation}}
  0019c064: a2020e4d sb r2,0x0e4d(r16)
+
  0019c0dc: 92020e3b lbu r2,0x0e3b(r16)                |{{f/load|Load Max Map Y}}
  0019c068: 8e020cb4 lw r2,0x0cb4(r16)
+
0019c0e0: 00000000 nop                               |
  0019c06c: 3c030200 lui r3,0x0200
+
  0019c0e4: 10400037 beq r2,r0,0x0019c1c4              {{f/Cond|If Max Y is invalid : branch to }} {{f/loc|Next elevation}}
  0019c070: 00431024 and r2,r2,r3
+
  0019c0e8: a2000edb sb r0,0x0edb(r16)                |{{f/store|Initialize Y Counter}}
  0019c074: 14400005 bne r2,r0,0x0019c08c
+
                                                    {{f/bloop|LOOP - Y rows}}
  0019c078: 00000000 nop
+
  0019c0ec: 92020edc lbu r2,0x0edc(r16)                   |{{f/load|Load Current Map Level}}
0019c07c: 92020e4d lbu r2,0x0e4d(r16)
+
  0019c0f0: 00000000 nop                                  |
  0019c080: 00000000 nop
+
  0019c0f4: 000218c0 sll r3,r2,0x03                        |
  0019c084: 10400014 beq r2,r0,0x0019c0d8
+
  0019c0f8: 00621821 addu r3,r3,r2                         |
  0019c088: 00000000 nop
+
  0019c0fc: 00031880 sll r3,r3,0x02                        |{{f/std|Elevation offset (0x24)}}
  0019c08c: 92020cbb lbu r2,0x0cbb(r16)
+
  0019c100: 92020edb lbu r2,0x0edb(r16)                    |{{f/load|Load Current Y}}
  0019c090: 00000000 nop
+
  0019c104: 00701821 addu r3,r3,r16                        |
  0019c094: 10400054 beq r2,r0,0x0019c1e8
+
  0019c108: 00021040 sll r2,r2,0x01                        |{{f/std|Y offset (halfword)}}
  0019c098: 00000000 nop
+
  0019c10c: 00621821 addu r3,r3,r2                        |{{f/adr|0x8019f3c4 + Elevation and Y row offset}}
  0019c09c: 92020cbc lbu r2,0x0cbc(r16)
+
  0019c110: 94710b94 lhu r17,0x0b94(r3)                    |{{f/load|This Y row of flags (AI 0x0b94)}}
0019c0a0: 00000000 nop
+
  0019c114: 00000000 nop                                   |
  0019c0a4: 10400050 beq r2,r0,0x0019c1e8
+
  0019c118: 12200021 beq r17,r0,0x0019c1a0                {{f/Cond|If There is no flags in this row : branch to }} {{f/loc|Next Y row}}
  0019c0a8: 00000000 nop
+
  0019c11c: 00000000 nop                                   |
  0019c0ac: 0c0670a0 jal 0x0019c280
+
  0019c120: 92020e3a lbu r2,0x0e3a(r16)                    |{{f/load|Load Max Map X}}
  0019c0b0: 00000000 nop
+
  0019c124: 00000000 nop                                   |
  0019c0b4: 0c067083 jal 0x0019c20c
+
  0019c128: 1040001d beq r2,r0,0x0019c1a0                  {{f/Cond|If Map Max X is invalid : branch to }} {{f/loc|Next Y row}}
  0019c0b8: 00000000 nop
+
0019c12c: a2000eda sb r0,0x0eda(r16)                     |{{f/store|Initialize X Counter}}
  0019c0bc: 0c067367 jal 0x0019cd9c
+
                                                        {{f/bloop|LOOP - Each tile in Y row}}
  0019c0c0: 00000000 nop
+
  0019c130: 92020eda lbu r2,0x0eda(r16)                        |{{f/load|Load X counter}}
0019c0c4: 2403ffff addiu r3,r0,0xffff
+
  0019c134: 00000000 nop                                       |
  0019c0c8: 1043ffd5 beq r2,r3,0x0019c020
+
  0019c138: 00511004 sllv r2,r17,r2                            |{{f/std|Shift Row flag so this tile is in 0x8000 position}}
  0019c0cc: 34020001 ori r2,r0,0x0001
+
  0019c13c: 30428000 andi r2,r2,0x8000                        |
  0019c0d0: 08067023 j 0x0019c08c
+
  0019c140: 1040000d beq r2,r0,0x0019c178                      {{f/Cond|If This tile flag is off : branch to }} {{f/loc|Next X}}
0019c0d4: 00000000 nop
+
  0019c144: 00000000 nop                                       |
0019c0d8: a2000edc sb r0,0x0edc(r16)
+
  0019c148: 92020eda lbu r2,0x0eda(r16)                        |{{f/load|Load Current X}}
  0019c0dc: 92020e3b lbu r2,0x0e3b(r16)
+
  0019c14c: 92030edb lbu r3,0x0edb(r16)                        |{{f/load|Load Current Y}}
  0019c0e0: 00000000 nop
+
  0019c150: 92040edc lbu r4,0x0edc(r16)                        |{{f/load|Load Current Map Level}}
  0019c0e4: 10400037 beq r2,r0,0x0019c1c4
+
  0019c154: a2020018 sb r2,0x0018(r16)                        |{{f/store|Save as Acting Unit X}}
  0019c0e8: a2000edb sb r0,0x0edb(r16)
+
  0019c158: a203001a sb r3,0x001a(r16)                         |{{f/store|Save as Acting Unit Y}}
  0019c0ec: 92020edc lbu r2,0x0edc(r16)
+
  0019c15c: 0c067083 jal 0x0019c20c                            |{{f/jal|0019c20c_-_0019c27c|0019c20c_-_0019c27c}} {{f/std|Set AI 0x14 - Set AI 0x18 to considered caster position}}
0019c0f0: 00000000 nop
+
0019c160: a2040019 sb r4,0x0019(r16)                         |{{f/store|Save as Acting Unit Map Level}}
  0019c0f4: 000218c0 sll r3,r2,0x03
+
  0019c164: 0c067367 jal 0x0019cd9c                            |{{f/jal|AI_Target_Unit_for_Direct_vs_Arc_Attack_(0019cd9c)|AI_Target_Unit_for_Direct_vs_Arc_Attack_(0019cd9c)}} {{f/std| Try all targetable tiles (simulation) keep the better outcome in AI 0x34}}
  0019c0f8: 00621821 addu r3,r3,r2
+
  0019c168: 00000000 nop                                      |
  0019c0fc: 00031880 sll r3,r3,0x02
+
  0019c16c: 2403ffff addiu r3,r0,-0x0001                      |
  0019c100: 92020edb lbu r2,0x0edb(r16)
+
  0019c170: 1043ffab beq r2,r3,0x0019c020                      {{f/Cond|If returned value is - 0x01 : }} {{f/loc|<nowiki>Set AI 0xed9 = 0x02 then Exit</nowiki>}} {{f/Returns|Return -0x01}}
  0019c104: 00701821 addu r3,r3,r16
+
  0019c174: 34020002 ori r2,r0,0x0002                          |
  0019c108: 00021040 sll r2,r2,0x01
+
  0019c178: 92020eda lbu r2,0x0eda(r16)                        |{{f/load|X counter}}
  0019c10c: 00621821 addu r3,r3,r2
+
  0019c17c: 00000000 nop                                      |
  0019c110: 94710b94 lhu r17,0x0b94(r3)
+
0019c180: 24420001 addiu r2,r2,0x0001                        |{{f/std|Current X++}}
  0019c114: 00000000 nop
+
  0019c184: a2020eda sb r2,0x0eda(r16)                         |{{f/store|Increase X counter}}
  0019c118: 12200021 beq r17,r0,0x0019c1a0
+
  0019c188: 92030eda lbu r3,0x0eda(r16)                        |
  0019c11c: 00000000 nop
+
  0019c18c: 92020e3a lbu r2,0x0e3a(r16)                        |{{f/load|Map Max X}}
0019c120: 92020e3a lbu r2,0x0e3a(r16)
+
0019c190: 00000000 nop                                      |
  0019c124: 00000000 nop
+
  0019c194: 0062182b sltu r3,r3,r2                             |
0019c128: 1040001d beq r2,r0,0x0019c1a0
+
  0019c198: 1460ffe5 bne r3,r0,0x0019c130                  {{f/Cond|Loop while X < Max X}}
  0019c12c: a2000eda sb r0,0x0eda(r16)
+
  0019c19c: 00000000 nop                                   |
  0019c130: 92020eda lbu r2,0x0eda(r16)
+
  0019c1a0: 92020edb lbu r2,0x0edb(r16)                    |{{f/load|Y counter}}
  0019c134: 00000000 nop
+
  0019c1a4: 92030e3b lbu r3,0x0e3b(r16)                   |{{f/load|Max Y}}
  0019c138: 00511004 sllv r2,r17,r2
+
  0019c1a8: 24420001 addiu r2,r2,0x0001                    |{{f/std|Current Y++}}
0019c13c: 30428000 andi r2,r2,0x8000
+
  0019c1ac: a2020edb sb r2,0x0edb(r16)                     |{{f/store|Increase Y counter}}
  0019c140: 1040000d beq r2,r0,0x0019c178
+
  0019c1b0: 92020edb lbu r2,0x0edb(r16)                   |
  0019c144: 00000000 nop
+
  0019c1b4: 00000000 nop                                   |
  0019c148: 92020eda lbu r2,0x0eda(r16)
+
  0019c1b8: 0043102b sltu r2,r2,r3                        |
  0019c14c: 92030edb lbu r3,0x0edb(r16)
+
  0019c1bc: 1440ffcb bne r2,r0,0x0019c0ec              {{f/Cond|Loop while Y < Max Y}}
  0019c150: 92040edc lbu r4,0x0edc(r16)
+
  0019c1c0: 00000000 nop                               |
  0019c154: a2020018 sb r2,0x0018(r16)
+
  0019c1c4: 92020edc lbu r2,0x0edc(r16)               |{{f/load|Elevation counter}}
  0019c158: a203001a sb r3,0x001a(r16)
+
  0019c1c8: 00000000 nop                              |
  0019c15c: 0c067083 jal 0x0019c20c
+
  0019c1cc: 24420001 addiu r2,r2,0x0001                |{{f/std|Current Map Level++}}
  0019c160: a2040019 sb r4,0x0019(r16)
+
  0019c1d0: a2020edc sb r2,0x0edc(r16)                 |{{f/store|Increase Elevation}}
  0019c164: 0c067367 jal 0x0019cd9c
+
  0019c1d4: 92020edc lbu r2,0x0edc(r16)               |{{f/load|Load Current Map Level}}
  0019c168: 00000000 nop
+
  0019c1d8: 00000000 nop                              |
  0019c16c: 2403ffff addiu r3,r0,0xffff
+
0019c1dc: 2c420002 sltiu r2,r2,0x0002                |
0019c170: 1043ffab beq r2,r3,0x0019c020
+
  0019c1e0: 1440ffbe bne r2,r0,0x0019c0dc          {{f/Cond|Loop 2 times (both elevation)}}
0019c174: 34020002 ori r2,r0,0x0002
+
  0019c1e4: 00000000 nop                          |
0019c178: 92020eda lbu r2,0x0eda(r16)
+
  0019c1e8: 0c067c96 jal 0x0019f258                |{{f/jal|Store units coordinates|Store units coordinates}} {{f/std|Copy coordinates from AI 0xe30 to Battle 0x47 (restore caster location)}}
0019c17c: 00000000 nop
+
  0019c1ec: 26040e30 addiu r4,r16,0x0e30          |{{f/std|<nowiki>r4 = AI Coordinate Data</nowiki>}}
0019c180: 24420001 addiu r2,r2,0x0001
+
  0019c1f0: 00001021 addu r2,r0,r0                 |{{f/Returns|Returns 0x00}}
0019c184: a2020eda sb r2,0x0eda(r16)
 
0019c188: 92030eda lbu r3,0x0eda(r16)
 
0019c18c: 92020e3a lbu r2,0x0e3a(r16)
 
0019c190: 00000000 nop
 
0019c194: 0062182b sltu r3,r3,r2
 
0019c198: 1460ffe5 bne r3,r0,0x0019c130
 
0019c19c: 00000000 nop
 
0019c1a0: 92020edb lbu r2,0x0edb(r16)
 
0019c1a4: 92030e3b lbu r3,0x0e3b(r16)
 
0019c1a8: 24420001 addiu r2,r2,0x0001
 
0019c1ac: a2020edb sb r2,0x0edb(r16)
 
0019c1b0: 92020edb lbu r2,0x0edb(r16)
 
0019c1b4: 00000000 nop
 
0019c1b8: 0043102b sltu r2,r2,r3
 
0019c1bc: 1440ffcb bne r2,r0,0x0019c0ec
 
0019c1c0: 00000000 nop
 
0019c1c4: 92020edc lbu r2,0x0edc(r16)
 
0019c1c8: 00000000 nop
 
0019c1cc: 24420001 addiu r2,r2,0x0001
 
0019c1d0: a2020edc sb r2,0x0edc(r16)
 
0019c1d4: 92020edc lbu r2,0x0edc(r16)
 
0019c1d8: 00000000 nop
 
0019c1dc: 2c420002 sltiu r2,r2,0x0002
 
0019c1e0: 1440ffbe bne r2,r0,0x0019c0dc
 
0019c1e4: 00000000 nop
 
0019c1e8: 0c067c96 jal 0x0019f258
 
0019c1ec: 26040e30 addiu r4,r16,0x0e30
 
  0019c1f0: 00001021 addu r2,r0,r0
 
 
  0019c1f4: 8fbf0018 lw r31,0x0018(r29)
 
  0019c1f4: 8fbf0018 lw r31,0x0018(r29)
 
  0019c1f8: 8fb10014 lw r17,0x0014(r29)
 
  0019c1f8: 8fb10014 lw r17,0x0014(r29)
Line 185: Line 206:
 
  0019c204: 03e00008 jr r31
 
  0019c204: 03e00008 jr r31
 
  0019c208: 00000000 nop
 
  0019c208: 00000000 nop
</font>
+
===Return locations===
 +
'''BATTLE.BIN'''
 +
  0019b168: [[AI_ability_use_control_routine]]
 +
  0019b1d4: [[AI_ability_use_control_routine]]
 +
  0019b248: [[AI_ability_use_control_routine]]
 +
  0019b2c8: [[AI_ability_use_control_routine]]

Latest revision as of 14:01, 9 June 2024

BATTLE.BIN :  - Find_Highest_Target_Priority_in_Ability_Range_(0019bf2c)
Test All Tiles to target from all tiles to move - best outcome is stored in AI 0x0034
------------------------------------------------------------------------------------------
Parameter : r4 = Pointer to unit battle data (801908cc)
Return : r2 = 0x00 by default
         r2 = -0x01 (from VSync_call or  AI_Target_Unit_for_Direct_vs_Arc_Attack_(0019cd9c)  )
------------------------------------------------------------------------------------------
0019bf2c: 3c02801a lui r2,0x801a             |
0019bf30: 90420d7b lbu r2,0x0d7b(r2)         |AI 0x19b7
0019bf34: 27bdffe0 addiu r29,r29,-0x0020     |
0019bf38: afb00010 sw r16,0x0010(r29)        |
0019bf3c: 3c10801a lui r16,0x801a            |
0019bf40: 2610f3c4 addiu r16,r16,0xf3c4      |0x8019f3c4 (AI pointer)
0019bf44: afbf0018 sw r31,0x0018(r29)        |
0019bf48: 10400016 beq r2,r0,0x0019bfa4      #If AI 0x19b7 <> 0x00
0019bf4c: afb10014 sw r17,0x0014(r29)            |
0019bf50: 3c03801a lui r3,0x801a                 |
0019bf54: 9063029d lbu r3,0x029d(r3)             |Load AI 0xed9 This routine control variable ?
0019bf58: 00000000 nop                           |
0019bf5c: 1060001d beq r3,r0,0x0019bfd4          #if AI 0xed9 = 0x00 : branch to  Main priority loop without setting tiles to move and tile to target matrixes
0019bf60: 34020001 ori r2,r0,0x0001              |
0019bf64: 10620055 beq r3,r2,0x0019c0bc          #if AI 0xed9 = 0x01 : branch to  Priority calculation (only 1 combination ? - first loop) Destination and Tile to target are already decided ?
0019bf68: 00000000 nop                           |
0019bf6c: 3c02801a lui r2,0x801a                 |
0019bf70: 904202a0 lbu r2,0x02a0(r2)             |? Elevation
0019bf74: 00000000 nop                           |
0019bf78: 000218c0 sll r3,r2,0x03                |
0019bf7c: 00621821 addu r3,r3,r2                 |
0019bf80: 00031880 sll r3,r3,0x02                |Elevation offset
0019bf84: 3c02801a lui r2,0x801a                 |
0019bf88: 9042029f lbu r2,0x029f(r2)             |? Y coordinates
0019bf8c: 00701821 addu r3,r3,r16                |
0019bf90: 00021040 sll r2,r2,0x01                |Y offset (halfword)
0019bf94: 00621821 addu r3,r3,r2                 |0x8019f3c4 + Elevation and Y offset (1 bit per tile model)
0019bf98: 94710b94 lhu r17,0x0b94(r3)            |Y row of flags in AI 0xb94 Tiles from where you can hit a unit (it is not shifted at all - wtf ?)
0019bf9c: 08067059 j 0x0019c164                  >>jump to  Priority calculation (only 1 combination ? - second loop) Destination and Tile to target are already decided ?
0019bfa0: 00000000 nop                           |
                                             Else : AI 0x19b7 = 0x00
0019bfa4: 3c02801a lui r2,0x801a                 |
0019bfa8: 904201f2 lbu r2,0x01f2(r2)             |Load Acting Unit's ID aka AI  0xe2e
0019bfac: 00000000 nop                           |
0019bfb0: 00501021 addu r2,r2,r16                |
0019bfb4: 90510c8d lbu r17,0x0c8d(r2)            |Acting Unit flag in Potentiel Targets list (AI 0xc8d)
0019bfb8: 0c0670f5 jal 0x0019c3d4                |-->Evaluate_Linear_Ability_Behaviors Set all desirable Tile to move and tiles to target
0019bfbc: a0400c8d sb r0,0x0c8d(r2)              |Remove Unit in Targetable List
0019bfc0: 3c02801a lui r2,0x801a                 |
0019bfc4: 904201f2 lbu r2,0x01f2(r2)             |Load Acting Unit's ID
0019bfc8: 00000000 nop                           |
0019bfcc: 00501021 addu r2,r2,r16                |
0019bfd0: a0510c8d sb r17,0x0c8d(r2)             |Restore Unit Targetable Flag 0x8019f3c4 + c8d + Unit Offset

=== TEST ALL COMBINATIONS (MOVE + TARGET) ===
0019bfd4: 0c0076ea jal 0x0001dba8            |-->VSync_call
0019bfd8: 34040001 ori r4,r0,0x0001          |
0019bfdc: 284201b9 slti r2,r2,0x01b9         |
0019bfe0: 14400004 bne r2,r0,0x0019bff4      #If Vsync returned r2 > 0x1b8
0019bfe4: 3c030400 lui r3,0x0400                 |
0019bfe8: a2000ed9 sb r0,0x0ed9(r16)             |Reset AI 0xed9
0019bfec: 0806707d j 0x0019c1f4                  |Exit routine returns -0x01
0019bff0: 2402ffff addiu r2,r0,-0x0001           |
                                             Else Vsync Call is fine
0019bff4: 8e02000c lw r2,0x000c(r16)             |Load AI Flags 1 to 4 
0019bff8: a20019b7 sb r0,0x19b7(r16)             |Set AI 0x19b7 = 0x00
0019bffc: 00431024 and r2,r2,r3                  |
0019c000: 1040000a beq r2,r0,0x0019c02c          #If AI Byte 0x04 flag 0x04 is ON (?) Not monster skill - byte 0x04 is updated after loading data from SCUS (weapon range related ?)
0019c004: a2000e4d sb r0,0x0e4d(r16)             |Set AI 0xe4d = 0x00
0019c008: 3c03fdff lui r3,0xfdff                     |
0019c00c: 8e020cb4 lw r2,0x0cb4(r16)                 |AI 0xcb4 (AI processing order ?)
0019c010: 3463ffff ori r3,r3,0xffff                  |
0019c014: 00431024 and r2,r2,r3                      |
0019c018: 0806701a j 0x0019c068                      >>Jump to  Test all move/target combinations keep AI 0xe4d = 0x00
0019c01c: ae020cb4 sw r2,0x0cb4(r16)                 |Remove 0x04000000 Flag from AI 0xcb4

                                                        BACK JUMP (fail ?)
0019c020: a2020ed9 sb r2,0x0ed9(r16)                     |Update AI 0xed9 depending from where the code is coming control variable ?
0019c024: 0806707d j 0x0019c1f4                          |EXIT Return -0x01
0019c028: 2402ffff addiu r2,r0,-0x0001                   |

                                                 Else : Ability AI 0x000f flag 0x04 is OFF
0019c02c: 92030cbb lbu r3,0x0cbb(r16)                |Number of Tiles enabled in AI 0x0bdc Tiles to hit
0019c030: 92020cbc lbu r2,0x0cbc(r16)                |Nb of Tiles enabled in AI 0x0b94 Tiles to move
0019c034: 00000000 nop                               |
0019c038: 00620018 mult r3,r2                        |
0019c03c: a2030eda sb r3,0x0eda(r16)                 |Set AI 0x0eda to AI 0x0cbb
0019c040: 00001012 mflo r2                           |
0019c044: a2020eda sb r2,0x0eda(r16)                 |Set AI 0xeda to AI 0xcbb * AI 0xcbc ????
0019c048: 92020eda lbu r2,0x0eda(r16)                |AI 0x0eda Maximum possibilities ?
0019c04c: 00000000 nop                               |
0019c050: 2c42000b sltiu r2,r2,0x000b                |0x1 If AI 0xcbb * AI 0xcbc < 0x0b
0019c054: 14400003 bne r2,r0,0x0019c064              #If AI 0xcbb * AI 0xcbc > 0x0a
0019c058: 34020001 ori r2,r0,0x0001                      |
0019c05c: a2020e4d sb r2,0x0e4d(r16)                     |Set AI 0xe4d to 0x01
0019c060: 34020001 ori r2,r0,0x0001                      |
0019c064: a2020e4d sb r2,0x0e4d(r16)                 |This saves the exact same information to the exact same place.
0019c068: 8e020cb4 lw r2,0x0cb4(r16)             |AI 0xcb4 (AI processing order ?)
0019c06c: 3c030200 lui r3,0x0200                 |
0019c070: 00431024 and r2,r2,r3                  |
0019c074: 14400005 bne r2,r0,0x0019c08c          #If AI 0xcb4 flag 0x0200000 is OFF  Weapon range related ? Targeting type ?
0019c078: 00000000 nop                               |
0019c07c: 92020e4d lbu r2,0x0e4d(r16)                |Load 0xe4d   Set to 0x01 if AI 0x0f flag 0x04 is OFF
0019c080: 00000000 nop                               |
0019c084: 10400014 beq r2,r0,0x0019c0d8              #If AI 0xe4d = 0x00 : branch to  Second loop (not moving ?)
0019c088: 00000000 nop                               |

                  --- TEST ALL POSSIBILITIES (DESTINATION - TARGETING) ---
                                                @LOOP - Test all destination tiles
0019c08c: 92020cbb lbu r2,0x0cbb(r16)                |Load Nb Of Tiles enabled in AI 0x0bdc Nb of Targetable tiles to hit a unit
0019c090: 00000000 nop                               |
0019c094: 10400054 beq r2,r0,0x0019c1e8              #If there is no targetable tiles with this ability :  Exit loop restore data then exit  Might be Disabled during priority calculation
0019c098: 00000000 nop                               |
0019c09c: 92020cbc lbu r2,0x0cbc(r16)                |Load Nb Of Tiles enabled in AI 0x0b94 Nb of Tiles from where you can hit a unit
0019c0a0: 00000000 nop                               |
0019c0a4: 10400050 beq r2,r0,0x0019c1e8              #If there is no destination tiles with this ability : branch to  Exit loop restore data then exit All Tiles done in 19c280
0019c0a8: 00000000 nop                               |
0019c0ac: 0c0670a0 jal 0x0019c280                    |-->Start_searching_for_Highest_Target_Priority_(0019c280) Find Best Tile in AI 0xb94 and store its coordinates at AI 0x18 (then disable it)
0019c0b0: 00000000 nop                               |
0019c0b4: 0c067083 jal 0x0019c20c                    |-->0019c20c_-_0019c27c Set AI 0x14 - Set AI 0x18 to considered caster position
0019c0b8: 00000000 nop                               |
0019c0bc: 0c067367 jal 0x0019cd9c                    |-->AI_Target_Unit_for_Direct_vs_Arc_Attack_(0019cd9c) Test all Targetable tile from considered position (store best result at AI 0x34)
0019c0c0: 00000000 nop                               |
0019c0c4: 2403ffff addiu r3,r0,-0x0001               |
0019c0c8: 1043ffd5 beq r2,r3,0x0019c020              #If returned value is -0x01 : Set AI 0xed9 = 0x01 then Exit Return -0x01
0019c0cc: 34020001 ori r2,r0,0x0001                  |
0019c0d0: 08067023 j 0x0019c08c                  Λ Loop while there is still tiles in AI 0xbdc or 0xb94
0019c0d4: 00000000 nop                               |

                  --- TEST ALL POSSIBILITIES (TARGETING only from a given location) ---
0019c0d8: a2000edc sb r0,0x0edc(r16)             |Initialize Current Map Level
                                                @LOOP - Elevation
0019c0dc: 92020e3b lbu r2,0x0e3b(r16)                |Load Max Map Y
0019c0e0: 00000000 nop                               |
0019c0e4: 10400037 beq r2,r0,0x0019c1c4              #If Max Y is invalid : branch to  Next elevation
0019c0e8: a2000edb sb r0,0x0edb(r16)                 |Initialize Y Counter
                                                    @LOOP - Y rows
0019c0ec: 92020edc lbu r2,0x0edc(r16)                    |Load Current Map Level
0019c0f0: 00000000 nop                                   |
0019c0f4: 000218c0 sll r3,r2,0x03                        |
0019c0f8: 00621821 addu r3,r3,r2                         |
0019c0fc: 00031880 sll r3,r3,0x02                        |Elevation offset (0x24)
0019c100: 92020edb lbu r2,0x0edb(r16)                    |Load Current Y
0019c104: 00701821 addu r3,r3,r16                        |
0019c108: 00021040 sll r2,r2,0x01                        |Y offset (halfword)
0019c10c: 00621821 addu r3,r3,r2                         |0x8019f3c4 + Elevation and Y row offset
0019c110: 94710b94 lhu r17,0x0b94(r3)                    |This Y row of flags (AI 0x0b94)
0019c114: 00000000 nop                                   |
0019c118: 12200021 beq r17,r0,0x0019c1a0                 #If There is no flags in this row : branch to  Next Y row
0019c11c: 00000000 nop                                   |
0019c120: 92020e3a lbu r2,0x0e3a(r16)                    |Load Max Map X
0019c124: 00000000 nop                                   |
0019c128: 1040001d beq r2,r0,0x0019c1a0                  #If Map Max X is invalid : branch to  Next Y row
0019c12c: a2000eda sb r0,0x0eda(r16)                     |Initialize X Counter
                                                        @LOOP - Each tile in Y row
0019c130: 92020eda lbu r2,0x0eda(r16)                        |Load X counter
0019c134: 00000000 nop                                       |
0019c138: 00511004 sllv r2,r17,r2                            |Shift Row flag so this tile is in 0x8000 position
0019c13c: 30428000 andi r2,r2,0x8000                         |
0019c140: 1040000d beq r2,r0,0x0019c178                      #If This tile flag is off : branch to  Next X
0019c144: 00000000 nop                                       |
0019c148: 92020eda lbu r2,0x0eda(r16)                        |Load Current X
0019c14c: 92030edb lbu r3,0x0edb(r16)                        |Load Current Y
0019c150: 92040edc lbu r4,0x0edc(r16)                        |Load Current Map Level
0019c154: a2020018 sb r2,0x0018(r16)                         |Save as Acting Unit X
0019c158: a203001a sb r3,0x001a(r16)                         |Save as Acting Unit Y
0019c15c: 0c067083 jal 0x0019c20c                            |-->0019c20c_-_0019c27c Set AI 0x14 - Set AI 0x18 to considered caster position
0019c160: a2040019 sb r4,0x0019(r16)                         |Save as Acting Unit Map Level
0019c164: 0c067367 jal 0x0019cd9c                            |-->AI_Target_Unit_for_Direct_vs_Arc_Attack_(0019cd9c)  Try all targetable tiles (simulation) keep the better outcome in AI 0x34
0019c168: 00000000 nop                                       |
0019c16c: 2403ffff addiu r3,r0,-0x0001                       |
0019c170: 1043ffab beq r2,r3,0x0019c020                      #If returned value is - 0x01 :  Set AI 0xed9 = 0x02 then Exit Return -0x01
0019c174: 34020002 ori r2,r0,0x0002                          |
0019c178: 92020eda lbu r2,0x0eda(r16)                        |X counter
0019c17c: 00000000 nop                                       |
0019c180: 24420001 addiu r2,r2,0x0001                        |Current X++
0019c184: a2020eda sb r2,0x0eda(r16)                         |Increase X counter
0019c188: 92030eda lbu r3,0x0eda(r16)                        |
0019c18c: 92020e3a lbu r2,0x0e3a(r16)                        |Map Max X
0019c190: 00000000 nop                                       |
0019c194: 0062182b sltu r3,r3,r2                             |
0019c198: 1460ffe5 bne r3,r0,0x0019c130                  #Loop while X < Max X
0019c19c: 00000000 nop                                   |
0019c1a0: 92020edb lbu r2,0x0edb(r16)                    |Y counter
0019c1a4: 92030e3b lbu r3,0x0e3b(r16)                    |Max Y
0019c1a8: 24420001 addiu r2,r2,0x0001                    |Current Y++
0019c1ac: a2020edb sb r2,0x0edb(r16)                     |Increase Y counter
0019c1b0: 92020edb lbu r2,0x0edb(r16)                    |
0019c1b4: 00000000 nop                                   |
0019c1b8: 0043102b sltu r2,r2,r3                         |
0019c1bc: 1440ffcb bne r2,r0,0x0019c0ec              #Loop while Y < Max Y
0019c1c0: 00000000 nop                               |
0019c1c4: 92020edc lbu r2,0x0edc(r16)                |Elevation counter
0019c1c8: 00000000 nop                               |
0019c1cc: 24420001 addiu r2,r2,0x0001                |Current Map Level++
0019c1d0: a2020edc sb r2,0x0edc(r16)                 |Increase Elevation
0019c1d4: 92020edc lbu r2,0x0edc(r16)                |Load Current Map Level
0019c1d8: 00000000 nop                               |
0019c1dc: 2c420002 sltiu r2,r2,0x0002                |
0019c1e0: 1440ffbe bne r2,r0,0x0019c0dc          #Loop 2 times (both elevation)
0019c1e4: 00000000 nop                           |
0019c1e8: 0c067c96 jal 0x0019f258                |-->Store units coordinates Copy coordinates from AI 0xe30 to Battle 0x47 (restore caster location)
0019c1ec: 26040e30 addiu r4,r16,0x0e30           |r4 = AI Coordinate Data
0019c1f0: 00001021 addu r2,r0,r0                 |Returns 0x00
0019c1f4: 8fbf0018 lw r31,0x0018(r29)
0019c1f8: 8fb10014 lw r17,0x0014(r29)
0019c1fc: 8fb00010 lw r16,0x0010(r29)
0019c200: 27bd0020 addiu r29,r29,0x0020
0019c204: 03e00008 jr r31
0019c208: 00000000 nop

Return locations

BATTLE.BIN
 0019b168: AI_ability_use_control_routine
 0019b1d4: AI_ability_use_control_routine
 0019b248: AI_ability_use_control_routine
 0019b2c8: AI_ability_use_control_routine