Difference between revisions of "Map movement decision/data setting"

From Final Fantasy Hacktics Wiki
Jump to navigation Jump to search
m
 
(3 intermediate revisions by 2 users not shown)
Line 1: Line 1:
<font face='Courier New'>
+
'''BATTLE.BIN''' :  - Map_movement_decision/data_setting
Map movement decision/data setting
+
Fill AI 0x3b4 Table - 1 Byte per Tile. If reachable (ON in AI 0xa74) Default data is distance to focused Target. Forced to 0x1 if there is a crystal (if needed)
  0019638c: 34020001 ori r2,r0,0x0001
+
  Set potential destination, store best destination tile coordonates in AI 0xcc4
  00196390: 3c01801a lui r1,0x801a
+
  ------------------------------------------------------------------------------------------
00196394: a02201f1 sb r2,0x01f1(r1)
+
  Parameter : Nothing
00196398: 3c02801a lui r2,0x801a
+
  Return : r2 = 0x00 (Default)
0019639c: 90420d7b lbu r2,0x0d7b(r2)
+
          r2 = -0x01 if routine Abort (Vsync call ?)
001963a0: 27bdffe0 addiu r29,r29,0xffe0
+
  ------------------------------------------------------------------------------------------
001963a4: afb10014 sw r17,0x0014(r29)
+
  0019638c: 34020001 ori r2,r0,0x0001          |
  001963a8: 3c11801a lui r17,0x801a
+
00196390: 3c01801a lui r1,0x801a             |
  001963ac: 8e3101f8 lw r17,0x01f8(r17) load decision data
+
  00196394: a02201f1 sb r2,0x01f1(r1)          |{{f/store|<nowiki>Set AI 0xe2d = 0x01</nowiki>}} {{f/std|801a01f1 (aka 8019f3c4 + 0xe2d)}}
001963b0: afb00010 sw r16,0x0010(r29)
+
  00196398: 3c02801a lui r2,0x801a            |
  001963b4: 3c10801a lui r16,0x801a
+
  0019639c: 90420d7b lbu r2,0x0d7b(r2)        |{{f/load|AI 0x19b7}} {{f/std| 801a0d7b aka 8019f3c4 + 0x19b7}}
001963b8: 2610f3c4 addiu r16,r16,0xf3c4
+
  001963a0: 27bdffe0 addiu r29,r29,-0x0020    |
001963bc: afbf001c sw r31,0x001c(r29)
+
  001963a4: afb10014 sw r17,0x0014(r29)        |
001963c0: 10400008 beq r2,r0,0x001963e4
+
  001963a8: 3c11801a lui r17,0x801a            |
001963c4: afb20018 sw r18,0x0018(r29)
+
  001963ac: 8e3101f8 lw r17,0x01f8(r17)       |{{f/adr|Pointer to Acting Unit's AI Decision Data  (Caster AI 0x182c)}} {{f/std| 801a01f8 aka 8019f3c4 + 0xe34}}
  001963c8: 3c02801a lui r2,0x801a
+
  001963b0: afb00010 sw r16,0x0010(r29)        |
  001963cc: 90420035 lbu r2,0x0035(r2)
+
  001963b4: 3c10801a lui r16,0x801a            |
  001963d0: 00000000 nop
+
  001963b8: 2610f3c4 addiu r16,r16,-0x0c3c    |{{f/adr|0x8019f3c4}}
  001963d4: 1040001a beq r2,r0,0x00196440
+
  001963bc: afbf001c sw r31,0x001c(r29)       |
  001963d8: 00000000 nop
+
  001963c0: 10400008 beq r2,r0,0x001963e4      {{f/Cond|If AI 0x19b7 <> 0x00 }}
  001963dc: 080659a0 j 0x00196680
+
  001963c4: afb20018 sw r18,0x0018(r29)            |
  001963e0: 00000000 nop
+
001963c8: 3c02801a lui r2,0x801a                |
  001963e4: 92220004 lbu r2,0x0004(r17)
+
001963cc: 90420035 lbu r2,0x0035(r2)             |{{f/load|AI 0xc71 (This routine control variable)}}
  001963e8: 00000000 nop
+
  001963d0: 00000000 nop                           |
  001963ec: 30420040 andi r2,r2,0x0040
+
  001963d4: 1040001a beq r2,r0,0x00196440          {{f/Cond|<nowiki>If Ai 0xc71 = 0x01</nowiki>}} {{f/loc| jump/return to AI 0x3b4 filling section}}
  001963f0: 10400013 beq r2,r0,0x00196440 branch if not focus on target
+
  001963d8: 00000000 nop                          |
  001963f4: 00000000 nop
+
  001963dc: 080659a0 j 0x00196680                  {{f/jump|Else, branch to :}} {{f/loc|AI Target Priority Super Routine (evaluate best destination)}}
001963f8: 92230005 lbu r3,0x0005(r17) load main target ID
+
  001963e0: 00000000 nop                           |
  001963fc: 3c02801a lui r2,0x801a
+
   
  00196400: 904201f2 lbu r2,0x01f2(r2) load acting units ID
+
  {{f/sec|<nowiki>=== Set potential destination ===</nowiki>}}
  00196404: 00000000 nop
+
                                              '''<nowiki>Else : AI 0x19b7 = 0x00</nowiki>'''
  00196408: 10620009 beq r3,r2,0x00196430 branch if self
+
  001963e4: 92220004 lbu r2,0x0004(r17)            |{{f/load|Acting Unit decision data 0x04}} {{f/std|Ai 0x182c + 0x04}}
  0019640c: 260403b4 addiu r4,r16,0x03b4
+
  001963e8: 00000000 nop                           |
  00196410: 00031100 sll r2,r3,0x04
+
  001963ec: 30420040 andi r2,r2,0x0040            |
00196414: 00501021 addu r2,r2,r16
+
  001963f0: 10400013 beq r2,r0,0x00196440          {{f/Cond|If Acting Unit has no Unit to Focus : branch to }} {{f/loc| AI 0x3b4 setting}}
00196418: 90421833 lbu r2,0x1833(r2) load target type
+
  001963f4: 00000000 nop                           |
  0019641c: 00000000 nop
+
  001963f8: 92230005 lbu r3,0x0005(r17)            |{{f/load|Focused Unit ID}}
  00196420: 00021102 srl r2,r2,0x04
+
  001963fc: 3c02801a lui r2,0x801a                |
  00196424: 30420001 andi r2,r2,0x0001
+
  00196400: 904201f2 lbu r2,0x01f2(r2)            |{{f/load|Acting units ID}} {{f/std|801a01f2 aka 8019f3c4 + e2e}}
  00196428: 10400005 beq r2,r0,0x00196440 branch if able to be targeted
+
  00196404: 00000000 nop                          |
  0019642c: 00000000 nop
+
  00196408: 10620009 beq r3,r2,0x00196430          {{f/Cond|If Acting Unit is NOT self focusing }}
  00196430: 0c066ade jal 0x0019ab78 word nulling
+
  0019640c: 260403b4 addiu r4,r16,0x03b4          |{{f/adr|8019f3c4 + 0x3b4}}
  00196434: 34050240 ori r5,r0,0x0240
+
  00196410: 00031100 sll r2,r3,0x04                    |{{f/std|Focused Unit  offset (0x10)}}
00196438: 0806594e j 0x00196538
+
  00196414: 00501021 addu r2,r2,r16                    |{{f/std|Part of pointer}}
  0019643c: 00000000 nop
+
  00196418: 90421833 lbu r2,0x1833(r2)                |{{f/load|load target type (Decision byte 0x07)}} {{f/std| 8019f3c4 + 0x182c + 0x07 + Focused Unit offset}}
  00196440: 0c06653e jal 0x001994f8 see if able to move to target
+
  0019641c: 00000000 nop                               |
00196444: 02202021 addu r4,r17,r0
+
  00196420: 00021102 srl r2,r2,0x04                    |{{f/std|0x10 becomes 0x01}}
  00196448: 2403ffff addiu r3,r0,0xffff
+
  00196424: 30420001 andi r2,r2,0x0001                 |
  0019644c: 14430003 bne r2,r3,0x0019645c
+
  00196428: 10400005 beq r2,r0,0x00196440              {{f/Cond|If Focused unit is not Targetable : branch to }} {{f/loc| AI 0x3b4 setting}}
  00196450: 2402ffff addiu r2,r0,0xffff
+
  0019642c: 00000000 nop                               |
  00196454: 08065a20 j 0x00196880
+
   
  00196458: a2000c71 sb r0,0x0c71(r16)
+
                  {{f/sec|--- Clear AI 0x3b4 section (distance to target is not needed) ---}}
  0019645c: 92220007 lbu r2,0x0007(r17) load type of target flags
+
                                                  '''Else : self targeting or untargetable target - Clear AI 0x3b4'''
  00196460: 00000000 nop
+
  00196430: 0c066ade jal 0x0019ab78                    |{{f/jal|Word_Nulling|Word_Nulling}} {{f/std|Nullify data from AI 0x3b4 to 0x5f4 (Distance from caster Table)}}
00196464: 30420003 andi r2,r2,0x0003
+
  00196434: 34050240 ori r5,r0,0x0240                  |
  00196468: 10400033 beq r2,r0,0x00196538 branch if not low hp/mp unit
+
  00196438: 0806594e j 0x00196538                      |{{f/loc|Keep AI 0x3b4 Empty and Avoid Crystal loop}}
  0019646c: 00000000 nop
+
  0019643c: 00000000 nop                              |
  00196470: 8e0217f8 lw r2,0x17f8(r16) load acting units data
+
   
  00196474: 00000000 nop
+
                  {{f/sec|--- Fill AI 0x3b4 Section (distance to Target for each tile) ---}}
00196478: 9042005c lbu r2,0x005c(r2) load status
+
  00196440: 0c06653e jal 0x001994f8                |{{f/jal|See_if_able_to_move_to_target%3F|See_if_able_to_move_to_target%3F}} {{f/std|Fill Table at 8019f3c4 + 0x3b4 (Each tile Distance to Target)}}
0019647c: 00000000 nop
+
  00196444: 02202021 addu r4,r17,r0               |{{f/std|Send Acting Unit AI decision data pointer}}
00196480: 30420001 andi r2,r2,0x0001
+
  00196448: 2403ffff addiu r3,r0,-0x0001          |
  00196484: 1440002c bne r2,r0,0x00196538 branch if death sentence
+
  0019644c: 14430003 bne r2,r3,0x0019645c          {{f/Cond|if returned value is -0x01 (Vsync call issue ?)}}
  00196488: 00000000 nop
+
  00196450: 2402ffff addiu r2,r0,-0x0001              |
  0019648c: 3c01801a lui r1,0x801a
+
  00196454: 08065a20 j 0x00196880                      |{{f/loc|Exit routine}} {{f/Returns|Returns -0x01}}
00196490: ac20f370 sw r0,-0x0c90(r1)
+
  00196458: a2000c71 sb r0,0x0c71(r16)                |{{f/store|<nowiki>AI 0xc71 = 0x00</nowiki>}}
00196494: 3c04801a lui r4,0x801a
+
                                                  '''Else : r2 <> -0x01'''
  00196498: 8c84f370 lw r4,-0x0c90(r4)
+
  0019645c: 92220007 lbu r2,0x0007(r17)                |{{f/load|Acting Unit AI decision byte 0x07}}
  0019649c: 3c038019 lui r3,0x8019
+
  00196460: 00000000 nop                              |
  001964a0: 246308cc addiu r3,r3,0x08cc
+
  00196464: 30420003 andi r2,r2,0x0003                |
  001964a4: 000410c0 sll r2,r4,0x03
+
  00196468: 10400033 beq r2,r0,0x00196538              {{f/Cond|If Acting unit is not lacking of HP nor MP : }} {{f/loc|Avoid Crystal loop}}
  001964a8: 00441023 subu r2,r2,r4
+
  0019646c: 00000000 nop                              |
  001964ac: 00021180 sll r2,r2,0x06
+
  00196470: 8e0217f8 lw r2,0x17f8(r16)                |{{f/adr|Acting Unit battle data pointer}} {{f/std|0x801908cc}}
001964b0: 00432821 addu r5,r2,r3
+
00196474: 00000000 nop                              |
  001964b4: 90a30001 lbu r3,0x0001(r5) load unit iD
+
  00196478: 9042005c lbu r2,0x005c(r2)                 |{{f/load|Acting Unit current status 5}}
  001964b8: 340200ff ori r2,r0,0x00ff
+
0019647c: 00000000 nop                              |
  001964bc: 10620015 beq r3,r2,0x00196514 branch if = 0xff
+
  00196480: 30420001 andi r2,r2,0x0001                |
  001964c0: 00000000 nop
+
  00196484: 1440002c bne r2,r0,0x00196538              {{f/Cond|If Acting Unit has [Death Sentence] branch to }} {{f/loc|Avoid Crystal loop}}
001964c4: 90a20058 lbu r2,0x0058(r5)
+
  00196488: 00000000 nop                              |
  001964c8: 00000000 nop
+
  0019648c: 3c01801a lui r1,0x801a                     |
001964cc: 30420040 andi r2,r2,0x0040
+
  00196490: ac20f370 sw r0,-0x0c90(r1)                 |{{f/store|Initialize Unit Counter}} {{f/std|Reset 8019f370}}
  001964d0: 10400010 beq r2,r0,0x00196514 branch if not crystal
+
                                                    {{f/bloop|LOOP - Search for Crystal }}
  001964d4: 00000000 nop
+
  00196494: 3c04801a lui r4,0x801a                         |
001964d8: 0c067ca9 jal 0x0019f2a4 transfer unit coordinates to AI
+
  00196498: 8c84f370 lw r4,-0x0c90(r4)                     |{{f/load|Load Dynamic Unit ID}}
001964dc: 26050c74 addiu r5,r16,0x0c74
+
0019649c: 3c038019 lui r3,0x8019                        |
  001964e0: 92030c75 lbu r3,0x0c75(r16)                Load map level
+
  001964a0: 246308cc addiu r3,r3,0x08cc                    |
  001964e4: 92040c74 lbu r4,0x0c74(r16)                Load X coordinate
+
  001964a4: 000410c0 sll r2,r4,0x03                        |
  001964e8: 000310c0 sll r2,r3,0x03                    *8
+
  001964a8: 00441023 subu r2,r2,r4                        |
  001964ec: 00431021 addu r2,r2,r3                    *9
+
  001964ac: 00021180 sll r2,r2,0x06                        |{{f/std|ID*0x1c0}}
  001964f0: 00021140 sll r2,r2,0x05                    *120
+
  001964b0: 00432821 addu r5,r2,r3                        |{{f/adr|Dynamic Pointer to Unit battle data}}
  001964f4: 00501021 addu r2,r2,r16                  
+
  001964b4: 90a30001 lbu r3,0x0001(r5)                     |{{f/load|load unit ID}}
  001964f8: 92030c76 lbu r3,0x0c76(r16)               Load Y coordinate
+
  001964b8: 340200ff ori r2,r0,0x00ff                      |
  001964fc: 244203b4 addiu r2,r2,0x03b4
+
  001964bc: 10620015 beq r3,r2,0x00196514                  {{f/Cond|<nowiki>If This Unit ID = 0xff : branch to </nowiki>}} {{f/loc|Next unit}}
  00196500: 00031900 sll r3,r3,0x04                    Y coordinate*16
+
  001964c0: 00000000 nop                                  |
  00196504: 00621821 addu r3,r3,r2                   
+
  001964c4: 90a20058 lbu r2,0x0058(r5)                    |{{f/load|This Unit Current Status 1}}
  00196508: 00641821 addu r3,r3,r4                     +X coordinate
+
  001964c8: 00000000 nop                                  |
  0019650c: 34020001 ori r2,r0,0x0001
+
  001964cc: 30420040 andi r2,r2,0x0040                    |
00196510: a0620000 sb r2,0x0000(r3)                 Store 0x01 in panel data
+
  001964d0: 10400010 beq r2,r0,0x00196514                  {{f/Cond|If This Unit is a [Crystal] - Update AI 0x3b4}}
  00196514: 3c02801a lui r2,0x801a
+
  001964d4: 00000000 nop                                      |
  00196518: 8c42f370 lw r2,-0x0c90(r2)
+
  001964d8: 0c067ca9 jal 0x0019f2a4                            |{{f/jal|Transfer_Unit_Coordinates_to_AI|Transfer_Unit_Coordinates_to_AI}} {{f/std|Transfer This Unit coordinate at 8019f3c4 + 0xc74}}
0019651c: 00000000 nop
+
  001964dc: 26050c74 addiu r5,r16,0x0c74                      |{{f/std|Send Pointer to AI 0xc74}}
  00196520: 24420001 addiu r2,r2,0x0001
+
  001964e0: 92030c75 lbu r3,0x0c75(r16)                       |{{f/load|This Unit elevation}}
  00196524: 3c01801a lui r1,0x801a
+
  001964e4: 92040c74 lbu r4,0x0c74(r16)                        |{{f/load|This Unit X coordinate}}
  00196528: ac22f370 sw r2,-0x0c90(r1)
+
001964e8: 000310c0 sll r2,r3,0x03                            |
  0019652c: 28420015 slti r2,r2,0x0015
+
  001964ec: 00431021 addu r2,r2,r3                            |
  00196530: 1440ffd8 bne r2,r0,0x00196494        Do for each unit
+
  001964f0: 00021140 sll r2,r2,0x05                            |{{f/std|Elevation offset (0x120)}}
  00196534: 00000000 nop
+
  001964f4: 00501021 addu r2,r2,r16                            |{{f/std|AI pointer + elevation offset}}
if death sentence
+
  001964f8: 92030c76 lbu r3,0x0c76(r16)                       |{{f/load|Load Y coordinate}}
00196538: 92020e31 lbu r2,0x0e31(r16)           load map level
+
  001964fc: 244203b4 addiu r2,r2,0x03b4                        |{{f/std|Part of pointer to 8019f3c4 + 0x3b4}}
  0019653c: 92040e30 lbu r4,0x0e30(r16)          load x coordinate
+
  00196500: 00031900 sll r3,r3,0x04                            |{{f/std|Y offset (0x10)}}
  00196540: 000218c0 sll r3,r2,0x03
+
  00196504: 00621821 addu r3,r3,r2                            |{{f/std|Part of pointer to 8019f3c4 + 0x3b4}}
  00196544: 00621821 addu r3,r3,r2
+
  00196508: 00641821 addu r3,r3,r4                             |{{f/adr|Pointer to this Unit 8019f3c4 + 0x3b4 Tile's data}}
  00196548: 00031940 sll r3,r3,0x05
+
  0019650c: 34020001 ori r2,r0,0x0001                         |
  0019654c: 00701821 addu r3,r3,r16
+
  00196510: a0620000 sb r2,0x0000(r3)                         |{{f/store|Store 0x01 in panel data (AI 0x3b4)}} {{f/std|instead of distance between unit ? Forces the crystal to feel closer ?}}
  00196550: 92020e32 lbu r2,0x0e32(r16)          load Y coordinate
+
00196514: 3c02801a lui r2,0x801a                        |
  00196554: 246303b4 addiu r3,r3,0x03b4
+
  00196518: 8c42f370 lw r2,-0x0c90(r2)                    |{{f/load|Load Unit Counter}}
  00196558: 00021100 sll r2,r2,0x04
+
  0019651c: 00000000 nop                                   |
  0019655c: 00431021 addu r2,r2,r3
+
  00196520: 24420001 addiu r2,r2,0x0001                    |
  00196560: 00441021 addu r2,r2,r4
+
00196524: 3c01801a lui r1,0x801a                         |
  00196564: 90420000 lbu r2,0x0000(r2)           load panel value
+
  00196528: ac22f370 sw r2,-0x0c90(r1)                     |{{f/store|Store increased Unit Counter}}
  00196568: 3c01801a lui r1,0x801a
+
  0019652c: 28420015 slti r2,r2,0x0015                    |
0019656c: ac22f374 sw r2,-0x0c8c(r1)            store panel value
+
  00196530: 1440ffd8 bne r2,r0,0x00196494              {{f/eloop|Do for each unit}}
  00196570: 0c0658a8 jal 0x001962a0
+
  00196534: 00000000 nop                               |
  00196574: 00000000 nop
+
   
  00196578: 3c04801a lui r4,0x801a
+
                  {{f/sec|--- POST CRYSTAL ---}}
  0019657c: 8c84f374 lw r4,-0x0c8c(r4)           load panel value
+
  00196538: 92020e31 lbu r2,0x0e31(r16)       |{{f/load|Acting Unit elevation}}
  00196580: 3c01801a lui r1,0x801a
+
  0019653c: 92040e30 lbu r4,0x0e30(r16)        |{{f/load|Acting Unit X coordinates}}
  00196584: ac22f36c sw r2,-0x0c94(r1)           19f36c
+
00196540: 000218c0 sll r3,r2,0x03            |
  00196588: 3c01801a lui r1,0x801a
+
  00196544: 00621821 addu r3,r3,r2            |
0019658c: ac20f378 sw r0,-0x0c88(r1)         
+
  00196548: 00031940 sll r3,r3,0x05           |
  00196590: 0044102a slt r2,r2,r4
+
  0019654c: 00701821 addu r3,r3,r16            |{{f/std|8019f3c4 + Elevation offset (+0x120 if high elevation)}}
  00196594: 10400006 beq r2,r0,0x001965b0        branch if ??
+
  00196550: 92020e32 lbu r2,0x0e32(r16)        |{{f/load|Acting Unit Y coordinates}}
00196598: 34120001 ori r18,r0,0x0001
+
  00196554: 246303b4 addiu r3,r3,0x03b4        |{{f/std|Elevation offset + 0x3b4}}
  0019659c: 92220006 lbu r2,0x0006(r17)
+
  00196558: 00021100 sll r2,r2,0x04            |{{f/std|Y*16 (Y offset)}}
001965a0: 00000000 nop
+
  0019655c: 00431021 addu r2,r2,r3             |{{f/std|0x3b4 + Y offset + Elevation offset}}
001965a4: 30420008 andi r2,r2,0x0008
+
  00196560: 00441021 addu r2,r2,r4            |{{f/adr|8019f3c4 + 0x3b4 + Caster Tile offset}}
  001965a8: 10400030 beq r2,r0,0x0019666c        branch if not charging ability
+
  00196564: 90420000 lbu r2,0x0000(r2)        |{{f/load|Acting Unit Distance from Target}}
  001965ac: 00000000 nop
+
  00196568: 3c01801a lui r1,0x801a            |
  001965b0: 3c01801a lui r1,0x801a
+
  0019656c: ac22f374 sw r2,-0x0c8c(r1)        |{{f/store|Store distance from Target at 0x8019f374}}
  001965b4: ac32f368 sw r18,-0x0c98(r1)
+
  00196570: 0c0658a8 jal 0x001962a0            |{{f/jal|Get_Longest_Range_Ability_or_Move|Get_Longest_Range_Ability_or_Move}} {{f/std|Returns Closest Ability range if focusing, Acting unit move if not}}
  001965b8: 92220004 lbu r2,0x0004(r17)
+
  00196574: 00000000 nop                      |
  001965bc: 00000000 nop
+
  00196578: 3c04801a lui r4,0x801a            |
001965c0: 30420020 andi r2,r2,0x0020
+
  0019657c: 8c84f374 lw r4,-0x0c8c(r4)         |{{f/load|Caster Distance from Target}}
001965c4: 10400024 beq r2,r0,0x00196658        branch if stay near X/Y location AI
+
  00196580: 3c01801a lui r1,0x801a            |
  001965c8: 00000000 nop
+
  00196584: ac22f36c sw r2,-0x0c94(r1)        |{{f/store|Store Closest Ability Range (or Unit move) at 0x8019f36c}}
  001965cc: 0c0674a5 jal 0x0019d294
+
  00196588: 3c01801a lui r1,0x801a            |
001965d0: 02202021 addu r4,r17,r0
+
  0019658c: ac20f378 sw r0,-0x0c88(r1)         |{{f/store|Reset 0x8019f378}}
  001965d4: 92030e2e lbu r3,0x0e2e(r16)           load acting unit id
+
  00196590: 0044102a slt r2,r2,r4              |{{f/std|0x1 if Closest range + Move < Distance From Target}}
  001965d8: 00402021 addu r4,r2,r0
+
00196594: 10400006 beq r2,r0,0x001965b0      {{f/Cond|If Closest Ability > Distance From Target : branch to }} {{f/loc|Hit and run (?) section }}
  001965dc: 3c01801a lui r1,0x801a
+
  00196598: 34120001 ori r18,r0,0x0001        |
  001965e0: ac24f370 sw r4,-0x0c90(r1)           store unit ID
+
  0019659c: 92220006 lbu r2,0x0006(r17)       |{{f/load|Acting Unit decision Byte 0x06}}
  001965e4: 10830003 beq r4,r3,0x001965f4        branch if calculated ID is acting unit
+
  001965a0: 00000000 nop                      |
  001965e8: 34020015 ori r2,r0,0x0015
+
  001965a4: 30420008 andi r2,r2,0x0008        |{{f/std|Check Ability CT flag}}
  001965ec: 1482001a bne r4,r2,0x00196658        branch if not end of unit counter?
+
  001965a8: 10400030 beq r2,r0,0x0019666c      {{f/Cond|If caster is not charging: branch to }} {{f/loc| Move then Hit section}}
  001965f0: 00000000 nop
+
  001965ac: 00000000 nop                       |
001965f4: 92230001 lbu r3,0x0001(r17)           load map level flag
+
   
  001965f8: 92240000 lbu r4,0x0000(r17)          load X coordinate
+
                  {{f/sec|--- SECTION : TARGET is IN RANGE - Hit and run ?  / Run while charging ---  }}
001965fc: 000310c0 sll r2,r3,0x03
+
                                              '''Else : Target is in range / Or Unit is Charging (Target already acquired?)'''
  00196600: 00431021 addu r2,r2,r3
+
001965b0: 3c01801a lui r1,0x801a                 |
  00196604: 00021080 sll r2,r2,0x02
+
  001965b4: ac32f368 sw r18,-0x0c98(r1)           |{{f/store|<nowiki>Target is in range = True // Hit and Run flag ?</nowiki>}} {{f/std|Target could be a tile or a unit}}
  00196608: 92230002 lbu r3,0x0002(r17)          load Y coordinate
+
  001965b8: 92220004 lbu r2,0x0004(r17)            |{{f/load|Load Acting Unit AI 0x182c byte 0x04}}
  0019660c: 00501021 addu r2,r2,r16
+
  001965bc: 00000000 nop                          |
  00196610: 00031840 sll r3,r3,0x01
+
  001965c0: 30420020 andi r2,r2,0x0020            |
  00196614: 00431021 addu r2,r2,r3
+
  001965c4: 10400024 beq r2,r0,0x00196658          {{f/Cond|If Acting Unit do not have [Stay Near] flag :}} {{f/loc|Avoid Stay near section}}
  00196618: 34038000 ori r3,r0,0x8000
+
  001965c8: 00000000 nop                           |
  0019661c: 94420a74 lhu r2,0x0a74(r2)
+
   
  00196620: 00831807 srav r3,r3,r4
+
                                            {{f/sec|--- STAY NEAR - CAN REACH TILE of INTEREST ? ---}}
  00196624: 00431024 and r2,r2,r3
+
  001965cc: 0c0674a5 jal 0x0019d294                    |{{f/jal|Get_unit_that_matches_coordinates|Get_unit_that_matches_coordinates}} {{f/std| returns ID of Unit of Tile to protect ? (0x15 if none)}}
  00196628: 1040000b beq r2,r0,0x00196658
+
  001965d0: 02202021 addu r4,r17,r0                    |{{f/std|Send AI decision data pointer}}
  0019662c: 00000000 nop
+
  001965d4: 92030e2e lbu r3,0x0e2e(r16)               |{{f/load|Load acting unit ID}}
00196630: 92020e2d lbu r2,0x0e2d(r16)
+
  001965d8: 00402021 addu r4,r2,r0                     |
  00196634: 8e230000 lw r3,0x0000(r17)
+
  001965dc: 3c01801a lui r1,0x801a                     |
00196638: 00021080 sll r2,r2,0x02
+
  001965e0: ac24f370 sw r4,-0x0c90(r1)                 |{{f/store|Store unit ID }}
  0019663c: 00501021 addu r2,r2,r16
+
  001965e4: 10830003 beq r4,r3,0x001965f4              {{f/Cond|If Acting Unit is on [stay near]Coordinates}} {{f/loc|Focused Tile is reachable section}}
  00196640: 0c0664e8 jal 0x001993a0
+
  001965e8: 34020015 ori r2,r0,0x0015                  |
  00196644: ac430cc4 sw r3,0x0cc4(r2)
+
  001965ec: 1482001a bne r4,r2,0x00196658              {{f/Cond|If There is a Unit on This Tile : branch to}} {{f/loc|Focused Tile is not reachable section}}
  00196648: 3c01801a lui r1,0x801a
+
  001965f0: 00000000 nop                               |
  0019664c: ac32f378 sw r18,-0x0c88(r1)
+
   
  00196650: 080659a0 j 0x00196680
+
                                                {{f/sec|--- Focused Tile is reachable (already on tile /Tile in range and empty) ---}}
  00196654: 00000000 nop
+
  001965f4: 92230001 lbu r3,0x0001(r17)                |{{f/load|Focused Tile Elevation}} {{f/std|8019f3c4 + 0x182c + 0x01}}
  00196658: 92020e38 lbu r2,0x0e38(r16)
+
  001965f8: 92240000 lbu r4,0x0000(r17)                |{{f/load|Focused Tile X coordinates}}
0019665c: 3c04801a lui r4,0x801a
+
  001965fc: 000310c0 sll r2,r3,0x03                    |
  00196660: 8c84f374 lw r4,-0x0c8c(r4)
+
  00196600: 00431021 addu r2,r2,r3                    |
  00196664: 0806599e j 0x00196678
+
  00196604: 00021080 sll r2,r2,0x02                    |{{f/std|Elevation offset (0x24)}}
00196668: 00442021 addu r4,r2,r4
+
  00196608: 92230002 lbu r3,0x0002(r17)               |{{f/load|Focused Tile Y coordinates}}
0019666c: 3c01801a lui r1,0x801a
+
  0019660c: 00501021 addu r2,r2,r16                    |
  00196670: ac20f368 sw r0,-0x0c98(r1)
+
  00196610: 00031840 sll r3,r3,0x01                    |{{f/std|Y offset (Halfword)}}
  00196674: 2484ffff addiu r4,r4,0xffff
+
  00196614: 00431021 addu r2,r2,r3                     |{{f/std|Pointer to 0x8019f3c4 + 0xa74 + Acting Unit Y Row offset}}
  00196678: 0c065ab7 jal 0x00196adc
+
  00196618: 34038000 ori r3,r0,0x8000                  |{{f/std|Base bitmask}}
  0019667c: 00000000 nop
+
  0019661c: 94420a74 lhu r2,0x0a74(r2)                |{{f/load|Load Acting Unit Row's flags}}
  00196680: 0c066672 jal 0x001999c8
+
  00196620: 00831807 srav r3,r3,r4                    |{{f/std|Acting Unit's Tile's bitmask}}
00196684: 00000000 nop
+
  00196624: 00431024 and r2,r2,r3                     |{{f/std|Acting Unit's Tile's Flag in AI 0xa74 Table}}
  00196688: 2403ffff addiu r3,r0,0xffff
+
  00196628: 1040000b beq r2,r0,0x00196658              {{f/Cond|If Acting Unit Tile is Unreachable (Flag OFF)}} {{f/loc|Branch to get closer section}}
  0019668c: 14430004 bne r2,r3,0x001966a0
+
  0019662c: 00000000 nop                              |
  00196690: 34020001 ori r2,r0,0x0001
+
  00196630: 92020e2d lbu r2,0x0e2d(r16)                |{{f/load|Load 0x8019f3c4 + 0xe2d}} {{f/std|This routine control variable ? }}
00196694: a2020c71 sb r2,0x0c71(r16)
+
  00196634: 8e230000 lw r3,0x0000(r17)                |{{f/load|Load Focused Tile Full coordinates}}
  00196698: 08065a20 j 0x00196880
+
  00196638: 00021080 sll r2,r2,0x02                    |{{f/std|0x0e2d * 4}}
0019669c: 2402ffff addiu r2,r0,0xffff
+
  0019663c: 00501021 addu r2,r2,r16                    |{{f/std|0x8019f3c4 + Offset based on 0xe2d}}
  001966a0: 3c02801a lui r2,0x801a
+
00196640: 0c0664e8 jal 0x001993a0                    |{{f/jal|001993a0_-_00199494|Update Reachable Tile's Flags}} {{f/std|Turn off any reachable Tile but the acting unit ones and the focused Tile one}}
  001966a4: 8c42f378 lw r2,-0x0c88(r2)
+
  00196644: ac430cc4 sw r3,0x0cc4(r2)                  |{{f/store|Store Full Coordinates at 0x8019f3c4 + 0xcc4 (based on 0xe2d)}} {{f/std|AI 0xcc8}}
  001966a8: 00000000 nop
+
  00196648: 3c01801a lui r1,0x801a                     |
  001966ac: 14400029 bne r2,r0,0x00196754
+
  0019664c: ac32f378 sw r18,-0x0c88(r1)               |{{f/store|Set 0x8019f378 to 0x01}}
  001966b0: 00000000 nop
+
  00196650: 080659a0 j 0x00196680                      {{f/jump|Jump to Movement Priority Routine}}
001966b4: 3c02801a lui r2,0x801a
+
  00196654: 00000000 nop                              |
001966b8: 8c42f368 lw r2,-0x0c98(r2)
+
  001966bc: 00000000 nop
+
                                                {{f/sec|--- Get closer of Target (Unit or occupied tile)}}
  001966c0: 10400006 beq r2,r0,0x001966dc
+
  00196658: 92020e38 lbu r2,0x0e38(r16)                |{{f/load|Acting Unit's Move}}
001966c4: 3c047fff lui r4,0x7fff
+
  0019665c: 3c04801a lui r4,0x801a                    |
  001966c8: 3484ffff ori r4,r4,0xffff
+
  00196660: 8c84f374 lw r4,-0x0c8c(r4)                |{{f/load|Acting Unit's distance from Target}}
  001966cc: 0c065a4f jal 0x0019693c some map checks
+
  00196664: 0806599e j 0x00196678                      {{f/jump|Jump directly to }} {{f/loc|Next routine (Fill AI 0xabc)}} {{f/std|Will Enable all tiles closest to Focused Tile in AI 0x74}}
  001966d0: 00002821 addu r5,r0,r0
+
  00196668: 00442021 addu r4,r2,r4                    |{{f/std|Move + Distance}}
  001966d4: 080659d5 j 0x00196754
+
   
  001966d8: 00000000 nop
+
                  {{f/sec|--- GET CLOSER THEN HIT Section  (Target is not reachable with all abilities)---}}
  001966dc: 92020e39 lbu r2,0x0e39(r16) load acting units team
+
  0019666c: 3c01801a lui r1,0x801a             |
  001966e0: 00000000 nop
+
  00196670: ac20f368 sw r0,-0x0c98(r1)         |{{f/store|Reset 0x8019f3c8}} {{f/std|Target in range flag ? }}
  001966e4: 10400017 beq r2,r0,0x00196744 branch if ? player team?
+
  00196674: 2484ffff addiu r4,r4,-0x0001      |{{f/std|Send  Distance from Target - 1 (From  001965a8)}}
  001966e8: 00000000 nop
+
  00196678: 0c065ab7 jal 0x00196adc            |{{f/jal|Check_AI_Target_Type_(00196adc)|Check_AI_Target_Type_(00196adc)}} {{f/std|Set data to 0xabc Table (reachable and closer to Target)}}
001966ec: 0c0088c3 jal 0x0002230c Random
+
  0019667c: 00000000 nop                      |
001966f0: 00000000 nop
+
001966f4: 3c039249 lui r3,0x9249
+
  {{f/sec|<nowiki>=== CHOOSE THE BEST DESTINATION  CLOSER TO TARGET    store it in AI 0xcc8        (movement only without ability simulation) ===</nowiki>}}
  001966f8: 34632493 ori r3,r3,0x2493
+
  00196680: 0c066672 jal 0x001999c8            |{{f/jal|AI_Target_Priority_Super_Routine_(001999c8)|AI_Target_Priority_Super_Routine_(001999c8)}} {{f/std|Set Priority Mod for each Tiles in Table at AI 0x5f4 }}
  001966fc: 00430018 mult r2,r3
+
  00196684: 00000000 nop                      |
  00196700: 000227c3 sra r4,r2,0x1f
+
  00196688: 2403ffff addiu r3,r0,-0x0001      |
  00196704: 00001810 mfhi r3
+
0019668c: 14430004 bne r2,r3,0x001966a0      {{f/Cond|If Routine returns -0x0001 (Table 0x5f4 not Updated) }} {{f/std|- Vsync related}}
00196708: 00621821 addu r3,r3,r2
+
  00196690: 34020001 ori r2,r0,0x0001              |
0019670c: 00031883 sra r3,r3,0x02
+
  00196694: a2020c71 sb r2,0x0c71(r16)             |{{f/store|Set AI 0xc71 to 0x01}}
  00196710: 00641823 subu r3,r3,r4
+
  00196698: 08065a20 j 0x00196880                  |{{f/loc|Exit}} {{f/Returns|Returns -0x0001}}
  00196714: 000320c0 sll r4,r3,0x03
+
0019669c: 2402ffff addiu r2,r0,-0x0001           |
  00196718: 00832023 subu r4,r4,r3
+
                                              '''Else : Table AI 0x5f4 has been Updated'''
  0019671c: 14440009 bne r2,r4,0x00196744
+
  001966a0: 3c02801a lui r2,0x801a                 |
  00196720: 00000000 nop
+
  001966a4: 8c42f378 lw r2,-0x0c88(r2)             |{{f/load|Load 0x8019f378}} {{f/std| 0x1 if Caster has [Stay Near] and Can move on This tile}}
  00196724: 3c02801a lui r2,0x801a
+
  001966a8: 00000000 nop                          |
  00196728: 8c42f36c lw r2,-0x0c94(r2)
+
  001966ac: 14400029 bne r2,r0,0x00196754          {{f/Cond|If Destination is already chosen }} {{f/loc|Avoid looking for best tile }}
0019672c: 00000000 nop
+
  001966b0: 00000000 nop                           |
  00196730: 00021fc2 srl r3,r2,0x1f
+
  001966b4: 3c02801a lui r2,0x801a                |
  00196734: 00431021 addu r2,r2,r3
+
  001966b8: 8c42f368 lw r2,-0x0c98(r2)            |{{f/load|Load 8019f368 - Target in Range Flag ? }} {{f/std|0x1 if Targeted Unit distance < Closest Ability (Hit and Run is an option ?)}}
00196738: 00021043 sra r2,r2,0x01
+
  001966bc: 00000000 nop                          |
0019673c: 3c01801a lui r1,0x801a
+
  001966c0: 10400006 beq r2,r0,0x001966dc          {{f/Cond|If Target is Targetable without moving}}
  00196740: ac22f36c sw r2,-0x0c94(r1)
+
  001966c4: 3c047fff lui r4,0x7fff                    |
  00196744: 3c04801a lui r4,0x801a
+
  001966c8: 3484ffff ori r4,r4,0xffff                  |{{f/std|Send Max possible distance}}
  00196748: 8c84f36c lw r4,-0x0c94(r4)
+
  001966cc: 0c065a4f jal 0x0019693c                    |{{f/jal|AI_Post_Action_Movement_Decision_Routine_(0019693c)|AI_Post_Action_Movement_Decision_Routine_(0019693c)}} {{f/std|Find best Tile and store coordinates at AI 0xcc8}}
  0019674c: 0c065a42 jal 0x00196908
+
  001966d0: 00002821 addu r5,r0,r0                    |{{f/std|Priority prevails mod}}
00196750: 00000000 nop
+
001966d4: 080659d5 j 0x00196754                      |{{f/loc|Keep result and Avoid opposite section}}
  00196754: 92030e3b lbu r3,0x0e3b(r16) map max y
+
  001966d8: 00000000 nop                               |
  00196758: 34020002 ori r2,r0,0x0002
+
                                                  '''Else : Not Targetable with all abilities'''
  0019675c: a2020e2d sb r2,0x0e2d(r16) ??
+
  001966dc: 92020e39 lbu r2,0x0e39(r16)                |{{f/load|load acting units team}}
  00196760: 3c01801a lui r1,0x801a
+
001966e0: 00000000 nop                              |
  00196764: ac20f370 sw r0,-0x0c90(r1)
+
  001966e4: 10400017 beq r2,r0,0x00196744              {{f/Cond|if Acting Unit is in Player Team :}} {{f/loc|Avoid random stuff  (!?)}}
  00196768: 10600015 beq r3,r0,0x001967c0
+
  001966e8: 00000000 nop                               |
0019676c: 00000000 nop
+
  001966ec: 0c0088c3 jal 0x0002230c                    |{{f/jal|Random_Number_Generator|Random_Number_Generator}} {{f/std|returns 0 to 0x7fff}}
00196770: 3c05801a lui r5,0x801a
+
  001966f0: 00000000 nop                               |
  00196774: 8ca5f370 lw r5,-0x0c90(r5)
+
  001966f4: 3c039249 lui r3,0x9249                    |
  00196778: 00000000 nop
+
  001966f8: 34632493 ori r3,r3,0x2493                  |{{f/std|0x92492493}} {{f/std| 4/7  2^32}}
0019677c: 00051040 sll r2,r5,0x01
+
  001966fc: 00430018 mult r2,r3                        |
  00196780: 00501021 addu r2,r2,r16
+
  00196700: 000227c3 sra r4,r2,0x1f                    |{{f/std|0}}
00196784: 94430a74 lhu r3,0x0a74(r2)
+
  00196704: 00001810 mfhi r3                          |{{f/std|<nowiki>r3 = Rdm *-3/7 * 2^32</nowiki>}}
00196788: 94460abc lhu r6,0x0abc(r2)
+
  00196708: 00621821 addu r3,r3,r2                    |{{f/std|Rdm * 4/7}}
  0019678c: 94440a98 lhu r4,0x0a98(r2)
+
0019670c: 00031883 sra r3,r3,0x02                    |{{f/std|Rdm / 7}}
  00196790: 94470ae0 lhu r7,0x0ae0(r2)
+
  00196710: 00641823 subu r3,r3,r4                     |{{f/std|- 0x00}}
  00196794: 00661826 xor r3,r3,r6
+
  00196714: 000320c0 sll r4,r3,0x03                    |{{f/std|Rdm * 8 / 7}}
  00196798: 00872026 xor r4,r4,r7
+
  00196718: 00832023 subu r4,r4,r3                    |{{f/std|Rdm * 7 / 7 (but you lost the 1st byte during the right shift)}}
  0019679c: a4430b04 sh r3,0x0b04(r2)
+
  0019671c: 14440009 bne r2,r4,0x00196744              {{f/Cond|If Random Number if a multiple of 7 and 16 (?)}}
  001967a0: a4440b28 sh r4,0x0b28(r2)
+
  00196720: 00000000 nop                                   |
  001967a4: 92020e3b lbu r2,0x0e3b(r16)
+
  00196724: 3c02801a lui r2,0x801a                        |
  001967a8: 24a50001 addiu r5,r5,0x0001
+
  00196728: 8c42f36c lw r2,-0x0c94(r2)                    |{{f/load|Shortest Range}}
  001967ac: 3c01801a lui r1,0x801a
+
  0019672c: 00000000 nop                                  |
  001967b0: ac25f370 sw r5,-0x0c90(r1)
+
  00196730: 00021fc2 srl r3,r2,0x1f                        |
  001967b4: 00a2282a slt r5,r5,r2
+
  00196734: 00431021 addu r2,r2,r3                        |{{f/std|Range}}
  001967b8: 14a0ffed bne r5,r0,0x00196770
+
  00196738: 00021043 sra r2,r2,0x01                        |{{f/std|Range / 2}}
  001967bc: 00000000 nop
+
  0019673c: 3c01801a lui r1,0x801a                        |
  001967c0: 8e020cc8 lw r2,0x0cc8(r16)
+
  00196740: ac22f36c sw r2,-0x0c94(r1)                    |{{f/store|Randomly Halve Ability range ? }}
  001967c4: 8e0317f8 lw r3,0x17f8(r16)
+
  00196744: 3c04801a lui r4,0x801a                    |
  001967c8: a2000e2d sb r0,0x0e2d(r16)
+
  00196748: 8c84f36c lw r4,-0x0c94(r4)                |{{f/load|Shortest Range}}
  001967cc: ae020ccc sw r2,0x0ccc(r16)
+
  0019674c: 0c065a42 jal 0x00196908                    |{{f/jal|Get_Positive_Priority_(00196908)|Get_Positive_Priority_(00196908)}} {{f/std|Find best Tile and store coordinates at AI 0xcc8}}
  001967d0: 90620188 lbu r2,0x0188(r3) act flag?
+
  00196750: 00000000 nop                              |
  001967d4: 00000000 nop
+
001967d8: 14400016 bne r2,r0,0x00196834 branch if able to act
+
{{f/sec|<nowiki>=== Set potential destination away from target (all cases)===</nowiki>}}
  001967dc: 00000000 nop
+
00196754: 92030e3b lbu r3,0x0e3b(r16)            |{{f/load|Map Max Y}}
  001967e0: 92220004 lbu r2,0x0004(r17)
+
00196758: 34020002 ori r2,r0,0x0002              |
  001967e4: 00000000 nop
+
0019675c: a2020e2d sb r2,0x0e2d(r16)            |{{f/store|Set 0xe2d to 0x02 (Away from Target offset)}}
  001967e8: 30420040 andi r2,r2,0x0040
+
00196760: 3c01801a lui r1,0x801a                |
  001967ec: 10400011 beq r2,r0,0x00196834                    branch if not focus on unit
+
00196764: ac20f370 sw r0,-0x0c90(r1)            |{{f/store|Reset 0x8019f370}}
  001967f0: 00000000 nop
+
00196768: 10600015 beq r3,r0,0x001967c0          {{f/Cond|If Map max Y is invalid}} {{f/loc|Avoid loop}}
  001967f4: 3c02801a lui r2,0x801a
+
0019676c: 00000000 nop                          |
  001967f8: 8c42f368 lw r2,-0x0c98(r2)
+
                                                {{f/bloop|LOOP - Set Table of reachable tiles farther from Target (AI 0xb04)}}
001967fc: 00000000 nop
+
00196770: 3c05801a lui r5,0x801a                    |
  00196800: 1040000c beq r2,r0,0x00196834       
+
00196774: 8ca5f370 lw r5,-0x0c90(r5)                |{{f/load|This Loop counter}}
  00196804: 00000000 nop
+
00196778: 00000000 nop                              |
  00196808: 92220006 lbu r2,0x0006(r17)
+
0019677c: 00051040 sll r2,r5,0x01                    |{{f/std|Y counter * 2 (halford offset)}}
  0019680c: 00000000 nop
+
00196780: 00501021 addu r2,r2,r16                    |{{f/adr|Dynamic pointer to AI data (halfword offset)}}
00196810: 30420008 andi r2,r2,0x0008
+
00196784: 94430a74 lhu r3,0x0a74(r2)                |{{f/load|This Y row Flags in Reachable Tiles Table}} {{f/std|8019f3c4 + 0xa74}}
  00196814: 14400007 bne r2,r0,0x00196834                  branch if charging ability
+
00196788: 94460abc lhu r6,0x0abc(r2)                |{{f/load|This Y row Flags in Reachable and closer to Target Tiles Table}} {{f/std|8019f3c4 + 0xa74 + 0x48 }}
  00196818: 00000000 nop
+
0019678c: 94440a98 lhu r4,0x0a98(r2)                |{{f/load|Same Y row but high elevation (AI 0xa74)}}
0019681c: 3c04801a lui r4,0x801a
+
00196790: 94470ae0 lhu r7,0x0ae0(r2)                |{{f/load|Same Y row but high elevation (AI 0xa74 + 0x48)}}
  00196820: 8c84f374 lw r4,-0x0c8c(r4)
+
00196794: 00661826 xor r3,r3,r6                      |{{f/std|Toggle Low elevation flags : reachable and farther from target}}
  00196824: 0c065a27 jal 0x0019689c
+
00196798: 00872026 xor r4,r4,r7                      |{{f/std|Toggle High elevation flags : reachable and farther from target}}
  00196828: 2484ffff addiu r4,r4,0xffff
+
0019679c: a4430b04 sh r3,0x0b04(r2)                  |{{f/store|Store Reachable and Farther flags at 0x8019f3c4 + 0xa74 + 0x90}} {{f/std|<nowiki>2 times 0x48 offset (and 0xe2d is = 2)</nowiki>}}
  0019682c: 08065a11 j 0x00196844
+
001967a0: a4440b28 sh r4,0x0b28(r2)                  |{{f/store|Store High elevation Reachable and Farther flags }} {{f/std|<nowiki>2 times 0x48 offset (and 0xe2d is = 2)</nowiki>}}
00196830: 00001021 addu r2,r0,r0
+
001967a4: 92020e3b lbu r2,0x0e3b(r16)                |{{f/load|Map Max Y}}
00196834: 8e020cc8 lw r2,0x0cc8(r16)
+
001967a8: 24a50001 addiu r5,r5,0x0001                |{{f/std|Y counter +1}}
  00196838: 00000000 nop
+
001967ac: 3c01801a lui r1,0x801a                    |
  0019683c: ae020cc4 sw r2,0x0cc4(r16)
+
001967b0: ac25f370 sw r5,-0x0c90(r1)                |{{f/store|Store counter}}
  00196840: 00001021 addu r2,r0,r0
+
001967b4: 00a2282a slt r5,r5,r2                      |{{f/std|Loop }}
  00196844: 92040e31 lbu r4,0x0e31(r16)
+
001967b8: 14a0ffed bne r5,r0,0x00196770          {{f/eloop|Loop while Y < Max Y}}
  00196848: 92050e32 lbu r5,0x0e32(r16)
+
001967bc: 00000000 nop                          |
  0019684c: 92060e30 lbu r6,0x0e30(r16)
+
  00196850: 000418c0 sll r3,r4,0x03
+
{{f/sec|<nowiki>=== CHOOSE THE BEST DESTINATION  and store it in AI 0xcc4  (movement only without ability simulation) ===</nowiki>}}
  00196854: 00641821 addu r3,r3,r4
+
001967c0: 8e020cc8 lw r2,0x0cc8(r16)            |{{f/load|<nowiki>Load Coordinates of result 0xe2d = 0x1 </nowiki>}} {{f/std|Caster best destination closer to target}}
  00196858: 00031880 sll r3,r3,0x02
+
001967c4: 8e0317f8 lw r3,0x17f8(r16)            |{{f/adr|Acting Unit battle data pointer}}
  0019685c: 00701821 addu r3,r3,r16
+
001967c8: a2000e2d sb r0,0x0e2d(r16)            |{{f/store|Reset 0x2ed}}
  00196860: 24630abc addiu r3,r3,0x0abc
+
001967cc: ae020ccc sw r2,0x0ccc(r16)            |{{f/store|<nowiki>Store coordinates in 0xAI 0xccc (coordinates for 0xe2d = 2)</nowiki>}}
  00196864: 00052840 sll r5,r5,0x01
+
001967d0: 90620188 lbu r2,0x0188(r3)            |{{f/load|Acting Unit Action Taken flag}}
  00196868: 00a32821 addu r5,r5,r3
+
001967d4: 00000000 nop                          |
0019686c: 34048000 ori r4,r0,0x8000
+
001967d8: 14400016 bne r2,r0,0x00196834          {{f/Cond|If Acting Unit has already Taken his Action branch to}} {{f/loc|Keep Tile from AI 0xcc8}}
00196870: 94a30000 lhu r3,0x0000(r5)
+
001967dc: 00000000 nop                          |
00196874: 00c42007 srav r4,r4,r6
+
001967e0: 92220004 lbu r2,0x0004(r17)            |{{f/load|Acting Unit Decision Byte 0x04}} {{f/std|8019f3c4 + 0x182c + 0x04}}
00196878: 00641825 or r3,r3,r4
+
001967e4: 00000000 nop                          |
0019687c: a4a30000 sh r3,0x0000(r5)
+
001967e8: 30420040 andi r2,r2,0x0040            |
 +
001967ec: 10400011 beq r2,r0,0x00196834          {{f/Cond|If Acting Unit has no Targeted Unit}} {{f/loc|Keep Tile from AI 0xcc8}}
 +
001967f0: 00000000 nop                          |
 +
001967f4: 3c02801a lui r2,0x801a                |
 +
001967f8: 8c42f368 lw r2,-0x0c98(r2)            |{{f/load|0x8019f368}}
 +
001967fc: 00000000 nop                          |
 +
00196800: 1040000c beq r2,r0,0x00196834          {{f/Cond|<nowiki>If 8019f368 = 0x00 (Cannot hit without moving)</nowiki>}} {{f/loc|Keep Tile from AI 0xcc8}}
 +
00196804: 00000000 nop                          |
 +
00196808: 92220006 lbu r2,0x0006(r17)            |{{f/load|Acting Unit Decision 0x06}} {{f/std|8019f3c4 + 0x182c + 0x6}}
 +
0019680c: 00000000 nop                          |
 +
00196810: 30420008 andi r2,r2,0x0008            |
 +
00196814: 14400007 bne r2,r0,0x00196834          {{f/Cond|If Acting Unit is Charging}} {{f/loc|Keep Tile from AI 0xcc8}}
 +
00196818: 00000000 nop                          |
 +
 +
                  {{f/sec|--- Find the best Tile in all reachable tiles (Action not Taken / Not Charging / Can Attack without moving / is focusing a Unit) ---}}
 +
0019681c: 3c04801a lui r4,0x801a                |
 +
00196820: 8c84f374 lw r4,-0x0c8c(r4)            |{{f/load|Distance from Target}}
 +
00196824: 0c065a27 jal 0x0019689c                |{{f/jal|Find_Positive_Priority_Target_within_3_Range_(0019689c)|Find_Positive_Priority_Target_within_3_Range_(0019689c)}} {{f/std|0xe2d set to 0x00 here (will consider all reachable tiles)}}
 +
00196828: 2484ffff addiu r4,r4,-0x0001          |{{f/std|Distance from Target - 1 (melee range ?)}}
 +
0019682c: 08065a11 j 0x00196844                  {{f/jump|Go to Last section}} {{f/Returns|Return 0x00}}
 +
00196830: 00001021 addu r2,r0,r0                |
 +
 +
                  {{f/sec|--- Store Tile from AI 0xcc8 in AI 0xcc4 (Get closer of main target) ---}}
 +
00196834: 8e020cc8 lw r2,0x0cc8(r16)            |{{f/load|Load Better coordinates so Far}}
 +
00196838: 00000000 nop                          |
 +
0019683c: ae020cc4 sw r2,0x0cc4(r16)            |{{f/store|Save as new coordinates of interest ?}}
 +
00196840: 00001021 addu r2,r0,r0                |{{f/Returns|Return 0x00}}
 +
 +
                  {{f/sec|--- Last section ---}}
 +
00196844: 92040e31 lbu r4,0x0e31(r16)            |{{f/load|Acting Unit elevation}}
 +
00196848: 92050e32 lbu r5,0x0e32(r16)            |{{f/load|Acting Unit Y}}
 +
0019684c: 92060e30 lbu r6,0x0e30(r16)            |{{f/load|Acting Unit X}}
 +
00196850: 000418c0 sll r3,r4,0x03                |
 +
00196854: 00641821 addu r3,r3,r4                |
 +
00196858: 00031880 sll r3,r3,0x02                |{{f/std|Elevation offset (+0x24)}}
 +
0019685c: 00701821 addu r3,r3,r16                |
 +
00196860: 24630abc addiu r3,r3,0x0abc            |{{f/adr|Pointer to 0x8019f3c4 + 0xabc + elevation offset}} {{f/std|<nowiki> AI 0xa74 + 0x48 = Reachable and closer to Target</nowiki>}}
 +
00196864: 00052840 sll r5,r5,0x01                |{{f/std|Y offset (Halfword)}}
 +
00196868: 00a32821 addu r5,r5,r3                |{{f/std|add to pointer}}
 +
0019686c: 34048000 ori r4,r0,0x8000              |{{f/std|prepare bitmask}}
 +
00196870: 94a30000 lhu r3,0x0000(r5)            |{{f/load|Acting Unit Y row flags }} {{f/std|<nowiki> AI 0xa74 + 0x48 = Reachable and closer to Target</nowiki>}}
 +
00196874: 00c42007 srav r4,r4,r6                |{{f/std|Bitmask for acting unit Tile}}
 +
00196878: 00641825 or r3,r3,r4                  |
 +
0019687c: a4a30000 sh r3,0x0000(r5)             |{{f/store|Enable Acting Unit Tile in Table of reachable and closer Tiles}} {{f/std|<nowiki> AI 0xa74 + 0x48 = Reachable and closer to Target</nowiki>}}
 
  00196880: 8fbf001c lw r31,0x001c(r29)
 
  00196880: 8fbf001c lw r31,0x001c(r29)
 
  00196884: 8fb20018 lw r18,0x0018(r29)
 
  00196884: 8fb20018 lw r18,0x0018(r29)
Line 325: Line 368:
 
  00196890: 27bd0020 addiu r29,r29,0x0020
 
  00196890: 27bd0020 addiu r29,r29,0x0020
 
  00196894: 03e00008 jr r31
 
  00196894: 03e00008 jr r31
  00196898: 00000000 nop</font>
+
  00196898: 00000000 nop
 +
===Return locations===
 +
'''BATTLE.BIN'''
 +
  001961f4: [[ Non-Specific AI AutoBattle (Enemies)]]

Latest revision as of 20:06, 20 June 2024

BATTLE.BIN :  - Map_movement_decision/data_setting
Fill AI 0x3b4 Table - 1 Byte per Tile. If reachable (ON in AI 0xa74) Default data is distance to focused Target. Forced to 0x1 if there is a crystal (if needed)
Set potential destination, store best destination tile coordonates in AI 0xcc4
------------------------------------------------------------------------------------------
Parameter : Nothing
Return : r2 = 0x00 (Default)
         r2 = -0x01 if routine Abort (Vsync call ?)
------------------------------------------------------------------------------------------
0019638c: 34020001 ori r2,r0,0x0001          |
00196390: 3c01801a lui r1,0x801a             |
00196394: a02201f1 sb r2,0x01f1(r1)          |Set AI 0xe2d = 0x01 801a01f1 (aka 8019f3c4 + 0xe2d)
00196398: 3c02801a lui r2,0x801a             |
0019639c: 90420d7b lbu r2,0x0d7b(r2)         |AI 0x19b7  801a0d7b aka 8019f3c4 + 0x19b7
001963a0: 27bdffe0 addiu r29,r29,-0x0020     |
001963a4: afb10014 sw r17,0x0014(r29)        |
001963a8: 3c11801a lui r17,0x801a            |
001963ac: 8e3101f8 lw r17,0x01f8(r17)        |Pointer to Acting Unit's AI Decision Data  (Caster AI 0x182c)  801a01f8 aka 8019f3c4 + 0xe34
001963b0: afb00010 sw r16,0x0010(r29)        |
001963b4: 3c10801a lui r16,0x801a            |
001963b8: 2610f3c4 addiu r16,r16,-0x0c3c     |0x8019f3c4
001963bc: afbf001c sw r31,0x001c(r29)        |
001963c0: 10400008 beq r2,r0,0x001963e4      #If AI 0x19b7 <> 0x00 
001963c4: afb20018 sw r18,0x0018(r29)            |
001963c8: 3c02801a lui r2,0x801a                 |
001963cc: 90420035 lbu r2,0x0035(r2)             |AI 0xc71 (This routine control variable)
001963d0: 00000000 nop                           |
001963d4: 1040001a beq r2,r0,0x00196440          #If Ai 0xc71 = 0x01  jump/return to AI 0x3b4 filling section
001963d8: 00000000 nop                           |
001963dc: 080659a0 j 0x00196680                  >>Else, branch to : AI Target Priority Super Routine (evaluate best destination)
001963e0: 00000000 nop                           |

=== Set potential destination ===
                                             Else : AI 0x19b7 = 0x00
001963e4: 92220004 lbu r2,0x0004(r17)            |Acting Unit decision data 0x04 Ai 0x182c + 0x04
001963e8: 00000000 nop                           |
001963ec: 30420040 andi r2,r2,0x0040             |
001963f0: 10400013 beq r2,r0,0x00196440          #If Acting Unit has no Unit to Focus : branch to   AI 0x3b4 setting
001963f4: 00000000 nop                           |
001963f8: 92230005 lbu r3,0x0005(r17)            |Focused Unit ID
001963fc: 3c02801a lui r2,0x801a                 |
00196400: 904201f2 lbu r2,0x01f2(r2)             |Acting units ID 801a01f2 aka 8019f3c4 + e2e
00196404: 00000000 nop                           |
00196408: 10620009 beq r3,r2,0x00196430          #If Acting Unit is NOT self focusing 
0019640c: 260403b4 addiu r4,r16,0x03b4           |8019f3c4 + 0x3b4
00196410: 00031100 sll r2,r3,0x04                    |Focused Unit  offset (0x10)
00196414: 00501021 addu r2,r2,r16                    |Part of pointer
00196418: 90421833 lbu r2,0x1833(r2)                 |load target type (Decision byte 0x07)  8019f3c4 + 0x182c + 0x07 + Focused Unit offset
0019641c: 00000000 nop                               |
00196420: 00021102 srl r2,r2,0x04                    |0x10 becomes 0x01
00196424: 30420001 andi r2,r2,0x0001                 |
00196428: 10400005 beq r2,r0,0x00196440              #If Focused unit is not Targetable : branch to   AI 0x3b4 setting
0019642c: 00000000 nop                               |

                  --- Clear AI 0x3b4 section (distance to target is not needed) ---
                                                 Else : self targeting or untargetable target - Clear AI 0x3b4
00196430: 0c066ade jal 0x0019ab78                    |-->Word_Nulling Nullify data from AI 0x3b4 to 0x5f4 (Distance from caster Table)
00196434: 34050240 ori r5,r0,0x0240                  |
00196438: 0806594e j 0x00196538                      |Keep AI 0x3b4 Empty  and Avoid Crystal loop
0019643c: 00000000 nop                               |

                  --- Fill AI 0x3b4 Section (distance to Target for each tile) ---
00196440: 0c06653e jal 0x001994f8                |-->See_if_able_to_move_to_target%3F Fill Table at 8019f3c4 + 0x3b4 (Each tile Distance to Target)
00196444: 02202021 addu r4,r17,r0                |Send Acting Unit AI decision data pointer
00196448: 2403ffff addiu r3,r0,-0x0001           |
0019644c: 14430003 bne r2,r3,0x0019645c          #if returned value is -0x01 (Vsync call issue ?)
00196450: 2402ffff addiu r2,r0,-0x0001               |
00196454: 08065a20 j 0x00196880                      |Exit routine Returns -0x01
00196458: a2000c71 sb r0,0x0c71(r16)                 |AI 0xc71 = 0x00
                                                 Else : r2 <> -0x01
0019645c: 92220007 lbu r2,0x0007(r17)                |Acting Unit AI decision byte 0x07
00196460: 00000000 nop                               |
00196464: 30420003 andi r2,r2,0x0003                 |
00196468: 10400033 beq r2,r0,0x00196538              #If Acting unit is not lacking of HP nor MP :  Avoid Crystal loop
0019646c: 00000000 nop                               |
00196470: 8e0217f8 lw r2,0x17f8(r16)                 |Acting Unit battle data pointer 0x801908cc
00196474: 00000000 nop                               |
00196478: 9042005c lbu r2,0x005c(r2)                 |Acting Unit current status 5
0019647c: 00000000 nop                               |
00196480: 30420001 andi r2,r2,0x0001                 |
00196484: 1440002c bne r2,r0,0x00196538              #If Acting Unit has [Death Sentence] branch to  Avoid Crystal loop
00196488: 00000000 nop                               |
0019648c: 3c01801a lui r1,0x801a                     |
00196490: ac20f370 sw r0,-0x0c90(r1)                 |Initialize Unit Counter Reset 8019f370
                                                    @LOOP - Search for Crystal 
00196494: 3c04801a lui r4,0x801a                         |
00196498: 8c84f370 lw r4,-0x0c90(r4)                     |Load Dynamic Unit ID
0019649c: 3c038019 lui r3,0x8019                         |
001964a0: 246308cc addiu r3,r3,0x08cc                    |
001964a4: 000410c0 sll r2,r4,0x03                        |
001964a8: 00441023 subu r2,r2,r4                         |
001964ac: 00021180 sll r2,r2,0x06                        |ID*0x1c0
001964b0: 00432821 addu r5,r2,r3                         |Dynamic Pointer to Unit battle data
001964b4: 90a30001 lbu r3,0x0001(r5)                     |load unit ID
001964b8: 340200ff ori r2,r0,0x00ff                      |
001964bc: 10620015 beq r3,r2,0x00196514                  #If This Unit ID = 0xff : branch to  Next unit
001964c0: 00000000 nop                                   |
001964c4: 90a20058 lbu r2,0x0058(r5)                     |This Unit Current Status 1
001964c8: 00000000 nop                                   |
001964cc: 30420040 andi r2,r2,0x0040                     |
001964d0: 10400010 beq r2,r0,0x00196514                  #If This Unit is a [Crystal] - Update AI 0x3b4
001964d4: 00000000 nop                                       |
001964d8: 0c067ca9 jal 0x0019f2a4                            |-->Transfer_Unit_Coordinates_to_AI Transfer This Unit coordinate at 8019f3c4 + 0xc74
001964dc: 26050c74 addiu r5,r16,0x0c74                       |Send Pointer to AI 0xc74
001964e0: 92030c75 lbu r3,0x0c75(r16)                        |This Unit elevation
001964e4: 92040c74 lbu r4,0x0c74(r16)                        |This Unit X coordinate
001964e8: 000310c0 sll r2,r3,0x03                            |
001964ec: 00431021 addu r2,r2,r3                             |
001964f0: 00021140 sll r2,r2,0x05                            |Elevation offset (0x120)
001964f4: 00501021 addu r2,r2,r16                            |AI pointer + elevation offset
001964f8: 92030c76 lbu r3,0x0c76(r16)                        |Load Y coordinate
001964fc: 244203b4 addiu r2,r2,0x03b4                        |Part of pointer to 8019f3c4 + 0x3b4
00196500: 00031900 sll r3,r3,0x04                            |Y offset (0x10)
00196504: 00621821 addu r3,r3,r2                             |Part of pointer to 8019f3c4 + 0x3b4
00196508: 00641821 addu r3,r3,r4                             |Pointer to this Unit 8019f3c4 + 0x3b4 Tile's data
0019650c: 34020001 ori r2,r0,0x0001                          |
00196510: a0620000 sb r2,0x0000(r3)                          |Store 0x01 in panel data (AI 0x3b4) instead of distance between unit ? Forces the crystal to feel closer ?
00196514: 3c02801a lui r2,0x801a                         |
00196518: 8c42f370 lw r2,-0x0c90(r2)                     |Load Unit Counter
0019651c: 00000000 nop                                   |
00196520: 24420001 addiu r2,r2,0x0001                    |
00196524: 3c01801a lui r1,0x801a                         |
00196528: ac22f370 sw r2,-0x0c90(r1)                     |Store increased Unit Counter
0019652c: 28420015 slti r2,r2,0x0015                     |
00196530: 1440ffd8 bne r2,r0,0x00196494              Λ Do for each unit
00196534: 00000000 nop                               |

                  --- POST CRYSTAL ---
00196538: 92020e31 lbu r2,0x0e31(r16)        |Acting Unit elevation
0019653c: 92040e30 lbu r4,0x0e30(r16)        |Acting Unit X coordinates
00196540: 000218c0 sll r3,r2,0x03            |
00196544: 00621821 addu r3,r3,r2             |
00196548: 00031940 sll r3,r3,0x05            |
0019654c: 00701821 addu r3,r3,r16            |8019f3c4 + Elevation offset (+0x120 if high elevation)
00196550: 92020e32 lbu r2,0x0e32(r16)        |Acting Unit Y coordinates
00196554: 246303b4 addiu r3,r3,0x03b4        |Elevation offset + 0x3b4
00196558: 00021100 sll r2,r2,0x04            |Y*16 (Y offset)
0019655c: 00431021 addu r2,r2,r3             |0x3b4 + Y offset + Elevation offset
00196560: 00441021 addu r2,r2,r4             |8019f3c4 + 0x3b4 + Caster Tile offset
00196564: 90420000 lbu r2,0x0000(r2)         |Acting Unit Distance from Target
00196568: 3c01801a lui r1,0x801a             |
0019656c: ac22f374 sw r2,-0x0c8c(r1)         |Store distance from Target at 0x8019f374
00196570: 0c0658a8 jal 0x001962a0            |-->Get_Longest_Range_Ability_or_Move Returns Closest Ability range if focusing, Acting unit move if not
00196574: 00000000 nop                       |
00196578: 3c04801a lui r4,0x801a             |
0019657c: 8c84f374 lw r4,-0x0c8c(r4)         |Caster Distance from Target
00196580: 3c01801a lui r1,0x801a             |
00196584: ac22f36c sw r2,-0x0c94(r1)         |Store Closest Ability Range (or Unit move) at 0x8019f36c
00196588: 3c01801a lui r1,0x801a             |
0019658c: ac20f378 sw r0,-0x0c88(r1)         |Reset 0x8019f378
00196590: 0044102a slt r2,r2,r4              |0x1 if  Closest range + Move < Distance From Target
00196594: 10400006 beq r2,r0,0x001965b0      #If Closest Ability > Distance From Target : branch to  Hit and run (?) section 
00196598: 34120001 ori r18,r0,0x0001         |
0019659c: 92220006 lbu r2,0x0006(r17)        |Acting Unit decision Byte 0x06
001965a0: 00000000 nop                       |
001965a4: 30420008 andi r2,r2,0x0008         |Check Ability CT flag
001965a8: 10400030 beq r2,r0,0x0019666c      #If caster is not charging: branch to   Move then Hit section
001965ac: 00000000 nop                       |

                  --- SECTION : TARGET is IN RANGE - Hit and run ?  / Run while charging ---   
                                             Else : Target is in range / Or Unit is Charging (Target already acquired?)
001965b0: 3c01801a lui r1,0x801a                 |
001965b4: ac32f368 sw r18,-0x0c98(r1)            |Target is in range = True // Hit and Run flag ? Target could be a tile or a unit
001965b8: 92220004 lbu r2,0x0004(r17)            |Load Acting Unit AI 0x182c byte 0x04
001965bc: 00000000 nop                           |
001965c0: 30420020 andi r2,r2,0x0020             |
001965c4: 10400024 beq r2,r0,0x00196658          #If Acting Unit do not have [Stay Near] flag : Avoid Stay near section
001965c8: 00000000 nop                           |

                                            --- STAY NEAR - CAN REACH TILE of INTEREST ? ---
001965cc: 0c0674a5 jal 0x0019d294                    |-->Get_unit_that_matches_coordinates  returns ID of Unit of Tile to protect ? (0x15 if none)
001965d0: 02202021 addu r4,r17,r0                    |Send AI decision data pointer
001965d4: 92030e2e lbu r3,0x0e2e(r16)                |Load acting unit ID
001965d8: 00402021 addu r4,r2,r0                     |
001965dc: 3c01801a lui r1,0x801a                     |
001965e0: ac24f370 sw r4,-0x0c90(r1)                 |Store unit ID 
001965e4: 10830003 beq r4,r3,0x001965f4              #If Acting Unit is on [stay near]Coordinates Focused Tile is reachable section
001965e8: 34020015 ori r2,r0,0x0015                  |
001965ec: 1482001a bne r4,r2,0x00196658              #If There is a Unit on This Tile : branch to Focused Tile is not reachable section
001965f0: 00000000 nop                               |

                                                --- Focused Tile is reachable (already on tile /Tile in range and empty) ---
001965f4: 92230001 lbu r3,0x0001(r17)                |Focused Tile Elevation 8019f3c4 + 0x182c + 0x01
001965f8: 92240000 lbu r4,0x0000(r17)                |Focused Tile X coordinates
001965fc: 000310c0 sll r2,r3,0x03                    |
00196600: 00431021 addu r2,r2,r3                     |
00196604: 00021080 sll r2,r2,0x02                    |Elevation offset (0x24)
00196608: 92230002 lbu r3,0x0002(r17)                |Focused Tile Y coordinates
0019660c: 00501021 addu r2,r2,r16                    |
00196610: 00031840 sll r3,r3,0x01                    |Y offset (Halfword)
00196614: 00431021 addu r2,r2,r3                     |Pointer to 0x8019f3c4 + 0xa74 + Acting Unit Y Row offset
00196618: 34038000 ori r3,r0,0x8000                  |Base bitmask
0019661c: 94420a74 lhu r2,0x0a74(r2)                 |Load Acting Unit Row's flags
00196620: 00831807 srav r3,r3,r4                     |Acting Unit's Tile's bitmask
00196624: 00431024 and r2,r2,r3                      |Acting Unit's Tile's Flag in AI 0xa74 Table
00196628: 1040000b beq r2,r0,0x00196658              #If Acting Unit Tile is Unreachable (Flag OFF) Branch to get closer section
0019662c: 00000000 nop                               |
00196630: 92020e2d lbu r2,0x0e2d(r16)                |Load 0x8019f3c4 + 0xe2d This routine control variable ? 
00196634: 8e230000 lw r3,0x0000(r17)                 |Load  Focused Tile Full coordinates
00196638: 00021080 sll r2,r2,0x02                    |0x0e2d * 4
0019663c: 00501021 addu r2,r2,r16                    |0x8019f3c4 + Offset based on 0xe2d
00196640: 0c0664e8 jal 0x001993a0                    |-->Update Reachable Tile's Flags Turn off any reachable Tile but the acting unit ones and the focused Tile one
00196644: ac430cc4 sw r3,0x0cc4(r2)                  |Store Full Coordinates at 0x8019f3c4 + 0xcc4 (based on 0xe2d) AI 0xcc8
00196648: 3c01801a lui r1,0x801a                     |
0019664c: ac32f378 sw r18,-0x0c88(r1)                |Set 0x8019f378 to 0x01
00196650: 080659a0 j 0x00196680                      >>Jump to Movement Priority Routine
00196654: 00000000 nop                               |

                                                --- Get closer of Target (Unit or occupied tile)
00196658: 92020e38 lbu r2,0x0e38(r16)                |Acting Unit's Move
0019665c: 3c04801a lui r4,0x801a                     |
00196660: 8c84f374 lw r4,-0x0c8c(r4)                 |Acting Unit's distance from Target
00196664: 0806599e j 0x00196678                      >>Jump directly to  Next routine (Fill AI 0xabc) Will Enable all tiles closest to Focused Tile in AI 0x74
00196668: 00442021 addu r4,r2,r4                     |Move + Distance

                  --- GET CLOSER THEN HIT Section  (Target is not reachable with all abilities)---
0019666c: 3c01801a lui r1,0x801a             |
00196670: ac20f368 sw r0,-0x0c98(r1)         |Reset 0x8019f3c8 Target in range flag ? 
00196674: 2484ffff addiu r4,r4,-0x0001       |Send  Distance from Target - 1 (From  001965a8)
00196678: 0c065ab7 jal 0x00196adc            |-->Check_AI_Target_Type_(00196adc) Set data to 0xabc Table (reachable and closer to Target)
0019667c: 00000000 nop                       |

=== CHOOSE THE BEST DESTINATION   CLOSER TO TARGET     store it in AI 0xcc8         (movement only without ability simulation) ===
00196680: 0c066672 jal 0x001999c8            |-->AI_Target_Priority_Super_Routine_(001999c8) Set Priority Mod for each Tiles in Table at AI 0x5f4 
00196684: 00000000 nop                       |
00196688: 2403ffff addiu r3,r0,-0x0001       |
0019668c: 14430004 bne r2,r3,0x001966a0      #If Routine returns -0x0001 (Table 0x5f4 not Updated)  - Vsync related
00196690: 34020001 ori r2,r0,0x0001              |
00196694: a2020c71 sb r2,0x0c71(r16)             |Set AI 0xc71 to 0x01
00196698: 08065a20 j 0x00196880                  |Exit Returns -0x0001
0019669c: 2402ffff addiu r2,r0,-0x0001           |
                                             Else : Table AI 0x5f4 has been Updated
001966a0: 3c02801a lui r2,0x801a                 |
001966a4: 8c42f378 lw r2,-0x0c88(r2)             |Load 0x8019f378  0x1 if Caster has [Stay Near] and Can move on This tile
001966a8: 00000000 nop                           |
001966ac: 14400029 bne r2,r0,0x00196754          #If Destination is already chosen  Avoid looking for best tile 
001966b0: 00000000 nop                           |
001966b4: 3c02801a lui r2,0x801a                 |
001966b8: 8c42f368 lw r2,-0x0c98(r2)             |Load 8019f368 - Target in Range Flag ?  0x1 if Targeted Unit distance < Closest Ability (Hit and Run is an option ?)
001966bc: 00000000 nop                           |
001966c0: 10400006 beq r2,r0,0x001966dc          #If Target is Targetable without moving
001966c4: 3c047fff lui r4,0x7fff                     |
001966c8: 3484ffff ori r4,r4,0xffff                  |Send Max possible distance
001966cc: 0c065a4f jal 0x0019693c                    |-->AI_Post_Action_Movement_Decision_Routine_(0019693c) Find best Tile and store coordinates at AI 0xcc8
001966d0: 00002821 addu r5,r0,r0                     |Priority prevails mod
001966d4: 080659d5 j 0x00196754                      |Keep result and Avoid opposite section
001966d8: 00000000 nop                               |
                                                 Else : Not Targetable with all abilities
001966dc: 92020e39 lbu r2,0x0e39(r16)                |load acting units team
001966e0: 00000000 nop                               |
001966e4: 10400017 beq r2,r0,0x00196744              #if Acting Unit is in Player Team : Avoid random stuff  (!?)
001966e8: 00000000 nop                               |
001966ec: 0c0088c3 jal 0x0002230c                    |-->Random_Number_Generator returns 0 to 0x7fff
001966f0: 00000000 nop                               |
001966f4: 3c039249 lui r3,0x9249                     |
001966f8: 34632493 ori r3,r3,0x2493                  |0x92492493  4/7  2^32
001966fc: 00430018 mult r2,r3                        |
00196700: 000227c3 sra r4,r2,0x1f                    |0
00196704: 00001810 mfhi r3                           |r3 = Rdm *-3/7 * 2^32
00196708: 00621821 addu r3,r3,r2                     |Rdm * 4/7
0019670c: 00031883 sra r3,r3,0x02                    |Rdm / 7
00196710: 00641823 subu r3,r3,r4                     |- 0x00
00196714: 000320c0 sll r4,r3,0x03                    |Rdm * 8 / 7
00196718: 00832023 subu r4,r4,r3                     |Rdm * 7 / 7 (but you lost the 1st byte during the right shift)
0019671c: 14440009 bne r2,r4,0x00196744              #If Random Number if a multiple of 7 and 16 (?)
00196720: 00000000 nop                                   |
00196724: 3c02801a lui r2,0x801a                         |
00196728: 8c42f36c lw r2,-0x0c94(r2)                     |Shortest Range
0019672c: 00000000 nop                                   |
00196730: 00021fc2 srl r3,r2,0x1f                        |
00196734: 00431021 addu r2,r2,r3                         |Range
00196738: 00021043 sra r2,r2,0x01                        |Range / 2
0019673c: 3c01801a lui r1,0x801a                         |
00196740: ac22f36c sw r2,-0x0c94(r1)                     |Randomly Halve Ability range ? 
00196744: 3c04801a lui r4,0x801a                     |
00196748: 8c84f36c lw r4,-0x0c94(r4)                 |Shortest Range
0019674c: 0c065a42 jal 0x00196908                    |-->Get_Positive_Priority_(00196908) Find best Tile and store coordinates at AI 0xcc8
00196750: 00000000 nop                               |

=== Set potential destination away from target (all cases)===
00196754: 92030e3b lbu r3,0x0e3b(r16)            |Map Max Y
00196758: 34020002 ori r2,r0,0x0002              |
0019675c: a2020e2d sb r2,0x0e2d(r16)             |Set 0xe2d to 0x02 (Away from Target offset)
00196760: 3c01801a lui r1,0x801a                 |
00196764: ac20f370 sw r0,-0x0c90(r1)             |Reset 0x8019f370
00196768: 10600015 beq r3,r0,0x001967c0          #If Map max Y is invalid Avoid loop
0019676c: 00000000 nop                           |
                                                @LOOP - Set Table of reachable tiles farther from Target (AI 0xb04)
00196770: 3c05801a lui r5,0x801a                     |
00196774: 8ca5f370 lw r5,-0x0c90(r5)                 |This Loop counter
00196778: 00000000 nop                               |
0019677c: 00051040 sll r2,r5,0x01                    |Y counter * 2 (halford offset)
00196780: 00501021 addu r2,r2,r16                    |Dynamic pointer to AI data (halfword offset)
00196784: 94430a74 lhu r3,0x0a74(r2)                 |This Y row Flags in Reachable Tiles Table 8019f3c4 + 0xa74
00196788: 94460abc lhu r6,0x0abc(r2)                 |This Y row Flags in Reachable and closer to Target Tiles Table 8019f3c4 + 0xa74 + 0x48 
0019678c: 94440a98 lhu r4,0x0a98(r2)                 |Same Y row but high elevation (AI 0xa74)
00196790: 94470ae0 lhu r7,0x0ae0(r2)                 |Same Y row but high elevation (AI 0xa74 + 0x48)
00196794: 00661826 xor r3,r3,r6                      |Toggle Low elevation flags : reachable and farther from target
00196798: 00872026 xor r4,r4,r7                      |Toggle High elevation flags : reachable and farther from target
0019679c: a4430b04 sh r3,0x0b04(r2)                  |Store Reachable and Farther flags at 0x8019f3c4 + 0xa74 + 0x90 2 times 0x48 offset (and 0xe2d is = 2)
001967a0: a4440b28 sh r4,0x0b28(r2)                  |Store High elevation Reachable and Farther flags  2 times 0x48 offset (and 0xe2d is = 2)
001967a4: 92020e3b lbu r2,0x0e3b(r16)                |Map Max Y
001967a8: 24a50001 addiu r5,r5,0x0001                |Y counter +1
001967ac: 3c01801a lui r1,0x801a                     |
001967b0: ac25f370 sw r5,-0x0c90(r1)                 |Store counter
001967b4: 00a2282a slt r5,r5,r2                      |Loop 
001967b8: 14a0ffed bne r5,r0,0x00196770          Λ Loop while Y < Max Y
001967bc: 00000000 nop                           |

=== CHOOSE THE BEST DESTINATION   and store it in AI 0xcc4  (movement only without ability simulation) ===
001967c0: 8e020cc8 lw r2,0x0cc8(r16)             |Load Coordinates of result 0xe2d = 0x1  Caster best destination closer to target
001967c4: 8e0317f8 lw r3,0x17f8(r16)             |Acting Unit battle data pointer
001967c8: a2000e2d sb r0,0x0e2d(r16)             |Reset 0x2ed
001967cc: ae020ccc sw r2,0x0ccc(r16)             |Store coordinates in 0xAI 0xccc (coordinates for 0xe2d = 2)
001967d0: 90620188 lbu r2,0x0188(r3)             |Acting Unit Action Taken flag
001967d4: 00000000 nop                           |
001967d8: 14400016 bne r2,r0,0x00196834          #If Acting Unit has already Taken his Action branch to Keep Tile from AI 0xcc8
001967dc: 00000000 nop                           |
001967e0: 92220004 lbu r2,0x0004(r17)            |Acting Unit Decision Byte 0x04 8019f3c4 + 0x182c + 0x04
001967e4: 00000000 nop                           |
001967e8: 30420040 andi r2,r2,0x0040             |
001967ec: 10400011 beq r2,r0,0x00196834          #If Acting Unit has no Targeted Unit Keep Tile from AI 0xcc8
001967f0: 00000000 nop                           |
001967f4: 3c02801a lui r2,0x801a                 |
001967f8: 8c42f368 lw r2,-0x0c98(r2)             |0x8019f368
001967fc: 00000000 nop                           |
00196800: 1040000c beq r2,r0,0x00196834          #If 8019f368 = 0x00 (Cannot hit without moving) Keep Tile from AI 0xcc8
00196804: 00000000 nop                           |
00196808: 92220006 lbu r2,0x0006(r17)            |Acting Unit Decision 0x06 8019f3c4 + 0x182c + 0x6
0019680c: 00000000 nop                           |
00196810: 30420008 andi r2,r2,0x0008             |
00196814: 14400007 bne r2,r0,0x00196834          #If Acting Unit is Charging Keep Tile from AI 0xcc8
00196818: 00000000 nop                           |

                  --- Find the best Tile in all reachable tiles (Action not Taken / Not Charging / Can Attack without moving / is focusing a Unit) ---
0019681c: 3c04801a lui r4,0x801a                 |
00196820: 8c84f374 lw r4,-0x0c8c(r4)             |Distance from Target
00196824: 0c065a27 jal 0x0019689c                |-->Find_Positive_Priority_Target_within_3_Range_(0019689c) 0xe2d set to 0x00 here (will consider all reachable tiles)
00196828: 2484ffff addiu r4,r4,-0x0001           |Distance from Target - 1 (melee range ?)
0019682c: 08065a11 j 0x00196844                  >>Go to Last section Return 0x00
00196830: 00001021 addu r2,r0,r0                 |

                  --- Store Tile from AI 0xcc8 in AI 0xcc4 (Get closer of main target) ---
00196834: 8e020cc8 lw r2,0x0cc8(r16)             |Load Better coordinates so Far
00196838: 00000000 nop                           |
0019683c: ae020cc4 sw r2,0x0cc4(r16)             |Save as new coordinates of interest ?
00196840: 00001021 addu r2,r0,r0                 |Return 0x00

                  --- Last section ---
00196844: 92040e31 lbu r4,0x0e31(r16)            |Acting Unit elevation
00196848: 92050e32 lbu r5,0x0e32(r16)            |Acting Unit Y
0019684c: 92060e30 lbu r6,0x0e30(r16)            |Acting Unit X
00196850: 000418c0 sll r3,r4,0x03                |
00196854: 00641821 addu r3,r3,r4                 |
00196858: 00031880 sll r3,r3,0x02                |Elevation offset (+0x24)
0019685c: 00701821 addu r3,r3,r16                |
00196860: 24630abc addiu r3,r3,0x0abc            |Pointer to 0x8019f3c4 + 0xabc + elevation offset  AI 0xa74 + 0x48 = Reachable and closer to Target
00196864: 00052840 sll r5,r5,0x01                |Y offset (Halfword)
00196868: 00a32821 addu r5,r5,r3                 |add to pointer
0019686c: 34048000 ori r4,r0,0x8000              |prepare bitmask
00196870: 94a30000 lhu r3,0x0000(r5)             |Acting Unit Y row flags   AI 0xa74 + 0x48 = Reachable and closer to Target
00196874: 00c42007 srav r4,r4,r6                 |Bitmask for acting unit Tile
00196878: 00641825 or r3,r3,r4                   |
0019687c: a4a30000 sh r3,0x0000(r5)              |Enable Acting Unit Tile in Table of reachable and closer Tiles  AI 0xa74 + 0x48 = Reachable and closer to Target
00196880: 8fbf001c lw r31,0x001c(r29)
00196884: 8fb20018 lw r18,0x0018(r29)
00196888: 8fb10014 lw r17,0x0014(r29)
0019688c: 8fb00010 lw r16,0x0010(r29)
00196890: 27bd0020 addiu r29,r29,0x0020
00196894: 03e00008 jr r31
00196898: 00000000 nop

Return locations

BATTLE.BIN
 001961f4: Non-Specific AI AutoBattle (Enemies)