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

From Final Fantasy Hacktics Wiki
Jump to navigation Jump to search
 
(3 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