Difference between revisions of "AI movement/panel data setting"

From Final Fantasy Hacktics Wiki
Jump to navigation Jump to search
m
 
(2 intermediate revisions by the same user not shown)
Line 1: Line 1:
  00194944: 3c02801a lui r2,0x801a
+
  '''BATTLE.BIN''' - AI movement/panel data setting
  00194948: 90420d7b lbu r2,0x0d7b(r2)
+
  ------------------------------------------------------------------------------------------------
0019494c: 27bdffc0 addiu r29,r29,0xffc0
+
  Parameters : r4 = Acting Unit Battle 0x187 (movement taken flag)
00194950: afb10034 sw r17,0x0034(r29)
+
   
00194954: 00808821 addu r17,r4,r0
+
  Returns : r2 = 0x00 if 0x19b7 = 0x00 and Unit has moved / can't move
00194958: afb00030 sw r16,0x0030(r29)
+
          r2 = 0x00 if Unit Can move but has berserk or confuse
  0019495c: 3c10801a lui r16,0x801a
+
          r2 = 0x00 At the end of the routine
  00194960: 2610f3c4 addiu r16,r16,0xf3c4
+
          r2 = -0x01 if 0001dba8 returns r2 > 0x1b8 (?)
  00194964: 14400080 bne r2,r0,0x00194b68 Branch if Action = Decided
+
 
00194968: afbf0038 sw r31,0x0038(r29)
+
  This routine handles some Tables of Tiles flags.
 
+
  If 0x19b7 = 0x00 : initialize pathfing and set flag in Table 0x0C24 (walkable tiles)
  <Water Movement>
+
                    Enable Flag 0x20 on Tile's Byte 0x05 (in data at 8018f8cc)
  0019496c: 3c03801a lui r3,0x801a
+
  If Unit can Move or 0x19b7 != 0x00
  00194970: 8c630bbc lw r3,0x0bbc(r3) Load Acting Unit's Data
+
    Set Flags in Table 0x0a74 (for unit not using teleport)
00194974: 00000000 nop
+
  -------------------------------------------------------------------------------------------------
00194978: 90620095 lbu r2,0x0095(r3) Load Movement 3
+
  00194944: 3c02801a lui r2,0x801a            |
  0019497c: 00000000 nop
+
  00194948: 90420d7b lbu r2,0x0d7b(r2)        |{{f/load|Load [801a0d7b]}} {{f/std|aka 8019f3c4 + 0x19b7}}
00194980: 304200c8 andi r2,r2,0x00c8
+
  0019494c: 27bdffc0 addiu r29,r29,-0x0040    |
00194984: 14400006 bne r2,r0,0x001949a0 Branch if Move on/in Water or Float
+
  00194950: afb10034 sw r17,0x0034(r29)      |
00194988: 26040c24 addiu r4,r16,0x0c24
+
  00194954: 00808821 addu r17,r4,r0           |{{f/std|<nowiki>r17 = Acting Unit movement taken flag</nowiki>}}
0019498c: 9062005a lbu r2,0x005a(r3)
+
00194958: afb00030 sw r16,0x0030(r29)       |
00194990: 00000000 nop
+
  0019495c: 3c10801a lui r16,0x801a           |
  00194994: 30420040 andi r2,r2,0x0040
+
  00194960: 2610f3c4 addiu r16,r16,-0x0c3c    |{{f/adr|AI data pointer ( 8019f3c4 )}}
  00194998: 10400005 beq r2,r0,0x001949b0 Branch if not Float
+
  00194964: 14400080 bne r2,r0,0x00194b68    {{f/Cond|<nowiki>If [0x19b7] = 0x00</nowiki>}}
  0019499c: 34020001 ori r2,r0,0x0001
+
  00194968: afbf0038 sw r31,0x0038(r29)          |
  001949a0: 3c01801a lui r1,0x801a
+
  0019496c: 3c03801a lui r3,0x801a                |
  001949a4: a0200d7d sb r0,0x0d7d(r1) Water Penalty = False
+
  00194970: 8c630bbc lw r3,0x0bbc(r3)            |{{f/adr|Load Acting Unit's Data pointer}}
  001949a8: 0806526f j 0x001949bc
+
  00194974: 00000000 nop                          |
001949ac: 00000000 nop
+
  00194978: 90620095 lbu r2,0x0095(r3)            |{{f/load|Load Movement set 3}}
001949b0: 3c01801a lui r1,0x801a
+
  0019497c: 00000000 nop                          |
  001949b4: a0220d7d sb r2,0x0d7d(r1) Water Penalty = True
+
  00194980: 304200c8 andi r2,r2,0x00c8            |{{f/std|Check [Move on Water] [Move in Water] and [Float]}}
 
+
  00194984: 14400006 bne r2,r0,0x001949a0        {{f/Cond|If Acting unit do not use [Float], [Move on water] nor [Move in water]}}
  001949b8: 26040c24 addiu r4,r16,0x0c24
+
  00194988: 26040c24 addiu r4,r16,0x0c24          |{{f/adr|AI pointer to 8019f3c4 + 0xc24}}
001949bc: 0c066ade jal 0x0019ab78                          [[Word_Nulling]]
+
  0019498c: 9062005a lbu r2,0x005a(r3)               |{{f/load|Load Acting unit Current status set 3}}
  001949c0: 34050048 ori r5,r0,0x0048
+
  00194990: 00000000 nop                             |
  001949c4: 00005021 addu r10,r0,r0
+
  00194994: 30420040 andi r2,r2,0x0040                |{{f/std|check [Float]}}
  001949c8: 3c0c8019 lui r12,0x8019
+
  00194998: 10400005 beq r2,r0,0x001949b0            {{f/Cond|If Unit has float}}
  001949cc: 258cf8cc addiu r12,r12,0xf8cc r12 = Tile Data
+
  0019499c: 34020001 ori r2,r0,0x0001                    |
  001949d0: 340b003f ori r11,r0,0x003f r11 = Cross Section Tile
+
  001949a0: 3c01801a lui r1,0x801a                {{f/Cond|E}}      |{{f/std| }}
  001949d4: 02004021 addu r8,r16,r0
+
  001949a4: a0200d7d sb r0,0x0d7d(r1)                    |{{f/store|<nowiki>Water Penalty = False (Move on water, move in water or Float)</nowiki>}}
 
+
  001949a8: 0806526f j 0x001949bc                        {{f/jump|Avoid water penalty section}}
  <Find all Walkable Tiles>
+
  001949ac: 00000000 nop                                  |
  001949d8: 92020e3b lbu r2,0x0e3b(r16) Load Max Y
+
                                                '''Else : No float status nor any Move allowing water move'''
001949dc: 00000000 nop
+
  001949b0: 3c01801a lui r1,0x801a                    |{{f/std|}}
001949e0: 18400027 blez r2,0x00194a80
+
  001949b4: a0220d7d sb r2,0x0d7d(r1)                |{{f/store|<nowiki>Water Penalty = True</nowiki>}} {{f/std| aka 8019f3c4 + 0x19b9}}
  001949e4: 00003821 addu r7,r0,r0
+
  001949b8: 26040c24 addiu r4,r16,0x0c24              |{{f/adr|AI pointer to 8019f3c4 + 0xc24}}
  001949e8: 000a4a00 sll r9,r10,0x08
+
  001949bc: 0c066ade jal 0x0019ab78              |{{f/jal|Word_Nulling|Word_Nulling}} {{f/std|Nullify Walkable Tile flags}}
001949ec: 92040e3a lbu r4,0x0e3a(r16) Load Max X
+
  001949c0: 34050048 ori r5,r0,0x0048            |{{f/std|size of data to nullify}}
  001949f0: 00000000 nop
+
  001949c4: 00005021 addu r10,r0,r0              |{{f/std|Initialize elevation counter}}
  001949f4: 1080001d beq r4,r0,0x00194a6c
+
  001949c8: 3c0c8019 lui r12,0x8019              |
  001949f8: 00003021 addu r6,r0,r0
+
  001949cc: 258cf8cc addiu r12,r12,0xf8cc        |{{f/adr|Tile Data pointer}}
  001949fc: 25030c24 addiu r3,r8,0x0c24
+
  001949d0: 340b003f ori r11,r0,0x003f            |{{f/std|<nowiki>r11 = Cross Section Tile</nowiki>}}
  00194a00: 00071040 sll r2,r7,0x01
+
  001949d4: 02004021 addu r8,r16,r0              |{{f/adr|AI data pointer ( 8019f3c4 )}}
  00194a04: 00432821 addu r5,r2,r3
+
                                                '''LOOP - Elevation (Loop through all tiles to set walkable tile's flag)'''
  00194a08: 00e40018 mult r7,r4
+
001949d8: 92020e3b lbu r2,0x0e3b(r16)              |{{f/load|Load Map Max Y}}
  00194a0c: 00001012 mflo r2
+
001949dc: 00000000 nop                              |
00194a10: 01221021 addu r2,r9,r2
+
  001949e0: 18400027 blez r2,0x00194a80              {{f/Cond|If Max Y is invalid : branch to }} {{f/loc|Next elevation iteration}}
  00194a14: 00461021 addu r2,r2,r6
+
  001949e4: 00003821 addu r7,r0,r0                    |{{f/std|Initialize Y counter}}
  00194a18: 000210c0 sll r2,r2,0x03
+
  001949e8: 000a4a00 sll r9,r10,0x08                  |{{f/std|Elevation Offset in tiles data}}
  00194a1c: 004c2021 addu r4,r2,r12
+
                                                    '''LOOP through each Y rows'''
 
+
  001949ec: 92040e3a lbu r4,0x0e3a(r16)                  |{{f/load|Load Map Max X}}
  <Unselectable?> (By Cursor)
+
  001949f0: 00000000 nop                                  |
00194a20: 90820006 lbu r2,0x0006(r4) Load isSelectTargetable
+
  001949f4: 1080001d beq r4,r0,0x00194a6c                {{f/Cond|If Max X is invalid : branch to }} {{f/loc|next Y row iteration}}
  00194a24: 00000000 nop
+
  001949f8: 00003021 addu r6,r0,r0                        |{{f/std|Initialize X counter}}
  00194a28: 30420001 andi r2,r2,0x0001
+
  001949fc: 25030c24 addiu r3,r8,0x0c24                  |{{f/adr|Pointer to AI 0xc24}} {{f/std|+0x24 if high elevation}}
  00194a2c: 1440000a bne r2,r0,0x00194a58 Branch if Current Tile is Unselectable
+
  00194a00: 00071040 sll r2,r7,0x01                      |{{f/std|Y counter * 2 (an Halfword of flags for each Y row)}}
  00194a30: 00000000 nop
+
  00194a04: 00432821 addu r5,r2,r3                        |{{f/adr|Pointer to AI 0xc24 + Row offset}} {{f/std| + 0x2 each Y iteration}}
 
+
  00194a08: 00e40018 mult r7,r4                           |
<Cross Tile?>
+
                                                        '''LOOP through each tiles of the row'''
  00194a34: 90820000 lbu r2,0x0000(r4) Load Current Tile Data
+
  00194a0c: 00001012 mflo r2                                  |{{f/std|Y counter * Max X}}
  00194a38: 00000000 nop
+
  00194a10: 01221021 addu r2,r9,r2                            |
00194a3c: 3042003f andi r2,r2,0x003f
+
  00194a14: 00461021 addu r2,r2,r6                            |{{f/std|This iteration Tile's ID (X + Y*Max X) + 0x100 if upper elevation}}
00194a40: 104b0005 beq r2,r11,0x00194a58 Branch if Cross Tile
+
  00194a18: 000210c0 sll r2,r2,0x03                          |{{f/std|Tiles offset in Tiles Table}}
 
+
  00194a1c: 004c2021 addu r4,r2,r12                          |{{f/adr|This iteration Tile's data pointer}}
  <Current Tile is Walkable>
+
00194a20: 90820006 lbu r2,0x0006(r4)                        |{{f/load|Load Tile's Byte 0x06}}
  00194a44: 34028000 ori r2,r0,0x8000
+
  00194a24: 00000000 nop                                     |
  00194a48: 94a30000 lhu r3,0x0000(r5)
+
  00194a28: 30420001 andi r2,r2,0x0001                       |{{f/std|check [Unselectable by cursor]}}
  00194a4c: 00c21007 srav r2,r2,r6
+
  00194a2c: 1440000a bne r2,r0,0x00194a58                    {{f/Cond|If Tile is selectable /}} Else branch to {{f/loc|Next Tile}}
  00194a50: 00621825 or r3,r3,r2
+
  00194a30: 00000000 nop                                          |
  00194a54: a4a30000 sh r3,0x0000(r5) Tile is Walkable
+
  00194a34: 90820000 lbu r2,0x0000(r4)                           |{{f/load|Load Current Tile Terrain type}}
 
+
  00194a38: 00000000 nop                                          |
  <X++>
+
  00194a3c: 3042003f andi r2,r2,0x003f                            |{{f/std|Check [Cross Tile]}}
  00194a58: 92040e3a lbu r4,0x0e3a(r16)
+
  00194a40: 104b0005 beq r2,r11,0x00194a58                        {{f/Cond|If Tile is not a Cross Tile (unplayable wall)}}
00194a5c: 24c60001 addiu r6,r6,0x0001
+
  00194a44: 34028000 ori r2,r0,0x8000                                |{{f/std|Prepare Tile's bitmask}}
  00194a60: 00c4102a slt r2,r6,r4
+
  00194a48: 94a30000 lhu r3,0x0000(r5)                                |{{f/load|Load Y row halfword of flags}}
  00194a64: 1440ffe9 bne r2,r0,0x00194a0c
+
  00194a4c: 00c21007 srav r2,r2,r6                                    |{{f/std|<nowiki>r2 = Bitmask of this tile in the row</nowiki>}}
  00194a68: 00e40018 mult r7,r4
+
  00194a50: 00621825 or r3,r3,r2                                     |{{f/std|Enable Tile's Flag (as playable ?)}} {{f/std|Not untargetable nor Cross section}}
 
+
  00194a54: a4a30000 sh r3,0x0000(r5)                                |{{f/store|Store updated Tile is Walkable flags (Y row)}}
  <Y++>
+
  00194a58: 92040e3a lbu r4,0x0e3a(r16)                       |{{f/load|Max X}}
  00194a6c: 92020e3b lbu r2,0x0e3b(r16)
+
  00194a5c: 24c60001 addiu r6,r6,0x0001                       |{{f/std|X counter +1}}
  00194a70: 24e70001 addiu r7,r7,0x0001
+
  00194a60: 00c4102a slt r2,r6,r4                            |{{f/std|Check limit}}
  00194a74: 00e2102a slt r2,r7,r2
+
  00194a64: 1440ffe9 bne r2,r0,0x00194a0c                {{f/eloop|Loop while not at max X}}
  00194a78: 1440ffdc bne r2,r0,0x001949ec
+
  00194a68: 00e40018 mult r7,r4                              |{{f/std|Y counter * Max X}}
  00194a7c: 00000000 nop
+
  00194a6c: 92020e3b lbu r2,0x0e3b(r16)                  |{{f/load|Max Y}}
 
+
  00194a70: 24e70001 addiu r7,r7,0x0001                  |{{f/std|Y counter + 1}}
  <Map Level++>
+
  00194a74: 00e2102a slt r2,r7,r2                        |{{f/std|Check limit}}
00194a80: 254a0001 addiu r10,r10,0x0001
+
  00194a78: 1440ffdc bne r2,r0,0x001949ec            {{f/eloop|Loop while not at max Y}}
  00194a84: 29420002 slti r2,r10,0x0002
+
  00194a7c: 00000000 nop                                  |{{f/std|}}
00194a88: 1440ffd3 bne r2,r0,0x001949d8
+
  00194a80: 254a0001 addiu r10,r10,0x0001            |{{f/std|Elevation counter +1}}
  00194a8c: 25080024 addiu r8,r8,0x0024
+
  00194a84: 29420002 slti r2,r10,0x0002              |{{f/std|Check limit}}
 
+
  00194a88: 1440ffd3 bne r2,r0,0x001949d8        {{f/eloop|Loop 2 times}}
 
+
  00194a8c: 25080024 addiu r8,r8,0x0024              |{{f/std|Elevation offset in AI walkable tiles Table}}
  00194a90: a2000e2d sb r0,0x0e2d(r16) Action = not Decided
+
  00194a90: a2000e2d sb r0,0x0e2d(r16)            |{{f/store|Nullify 0xe2d (?)}} {{f/std|Will be used as offset for the next loop Table }}
  00194a94: 00002821 addu r5,r0,r0
+
  00194a94: 00002821 addu r5,r0,r0                |{{f/std|initialize counter}}
 
+
                                                {{f/bloop|LOOP - Initialize Reachable tiles flags}}
  <Empty ?>
+
  00194a98: 92030e2d lbu r3,0x0e2d(r16)              |{{f/load|0x00}} {{f/std|1st instance of 0xa74 Table ?}}
  00194a98: 92030e2d lbu r3,0x0e2d(r16)
+
  00194a9c: 00052040 sll r4,r5,0x01                  |{{f/std|counter * 2}} {{f/std| Halfword offset}}
  00194a9c: 00052040 sll r4,r5,0x01
+
  00194aa0: 000310c0 sll r2,r3,0x03                  |{{f/std|0xe2d * 8}}
  00194aa0: 000310c0 sll r2,r3,0x03
+
  00194aa4: 00431021 addu r2,r2,r3                    |{{f/std|0xe2d * 9}}
  00194aa4: 00431021 addu r2,r2,r3
+
  00194aa8: 000210c0 sll r2,r2,0x03                   |{{f/std|0xe2d * 0x48}}
00194aa8: 000210c0 sll r2,r2,0x03
+
  00194aac: 02021021 addu r2,r16,r2                  |{{f/adr|8019f3c4 + Some 0x48 offset}} {{f/std|0x2ed is a offset of table of flags ?}}
  00194aac: 02021021 addu r2,r16,r2
+
  00194ab0: 00821021 addu r2,r4,r2                    |{{f/adr|Same + Halfword offset}}
  00194ab0: 00821021 addu r2,r4,r2
+
  00194ab4: a4400a74 sh r0,0x0a74(r2)                |{{f/store|Nullify Y row halfword}}
00194ab4: a4400a74 sh r0,0x0a74(r2)
+
  00194ab8: 92030e2d lbu r3,0x0e2d(r16)               |
  00194ab8: 92030e2d lbu r3,0x0e2d(r16)
+
  00194abc: 24a50001 addiu r5,r5,0x0001              |{{f/std|Y row counter + 1}}
  00194abc: 24a50001 addiu r5,r5,0x0001
+
  00194ac0: 000310c0 sll r2,r3,0x03                  |{{f/std|0xe2d * 8}}
  00194ac0: 000310c0 sll r2,r3,0x03
+
  00194ac4: 00431021 addu r2,r2,r3                   |{{f/std|0xe2d * 9}}
  00194ac4: 00431021 addu r2,r2,r3
+
  00194ac8: 000210c0 sll r2,r2,0x03                  |{{f/std|0xe2d * 0x48}}
  00194ac8: 000210c0 sll r2,r2,0x03
+
  00194acc: 02021021 addu r2,r16,r2                  |{{f/adr|8019f3c4 + Some 0x48 offset}}
  00194acc: 02021021 addu r2,r16,r2
+
  00194ad0: 00822021 addu r4,r4,r2                    |{{f/adr|Same + Halfword offset}}
  00194ad0: 00822021 addu r4,r4,r2
+
  00194ad4: 28a20012 slti r2,r5,0x0012                |{{f/std|Limit}}
  00194ad4: 28a20012 slti r2,r5,0x0012
+
  00194ad8: 1440ffef bne r2,r0,0x00194a98        {{f/eloop|Loop 0x12 Time (0x12 rows of tiles)}}
  00194ad8: 1440ffef bne r2,r0,0x00194a98
+
  00194adc: a4800a98 sh r0,0x0a98(r4)                |{{f/store|Nullify higher elevation row}}
  00194adc: a4800a98 sh r0,0x0a98(r4)
+
  00194ae0: 16200008 bne r17,r0,0x00194b04        {{f/Cond|If Target didn't take his move yet}}
 
+
  00194ae4: 00001021 addu r2,r0,r0                    |
 
+
00194ae8: 8e0317f8 lw r3,0x17f8(r16)                |{{f/adr|Acting Unit Data pointer}}
  00194ae0: 16200008 bne r17,r0,0x00194b04 Branch if Decided to Move/Already Moved?
+
  00194aec: 00000000 nop                              |
  00194ae4: 00001021 addu r2,r0,r0
+
  00194af0: 9062005c lbu r2,0x005c(r3)               |{{f/load|Acting unit Current Status 5}}
  00194ae8: 8e0317f8 lw r3,0x17f8(r16) Acting Unit Data
+
  00194af4: 00000000 nop                              |
  00194aec: 00000000 nop
+
  00194af8: 30420008 andi r2,r2,0x0008                |{{f/std|Check [Don't Move]}}
  00194af0: 9062005c lbu r2,0x005c(r3) Current Status 5
+
  00194afc: 1040000f beq r2,r0,0x00194b3c            {{f/Cond|Avoid section if Unit can move}}
  00194af4: 00000000 nop
+
                                                {{f/sec|Unit has moved or can't move}}
00194af8: 30420008 andi r2,r2,0x0008
+
  00194b00: 00001021 addu r2,r0,r0                       |{{f/std|<nowiki>r2 = 0x00 (returned value)</nowiki>}}
  00194afc: 1040000f beq r2,r0,0x00194b3c Branch if not Don't Move
+
  00194b04: 92040e31 lbu r4,0x0e31(r16)                  |{{f/load|Acting Unit Elevation}}
 
+
  00194b08: 92050e30 lbu r5,0x0e30(r16)                  |{{f/load|Acting Unit X coord}}
  <Don't Move>
+
  00194b0c: 000418c0 sll r3,r4,0x03                      |{{f/std|Elevation * 8}}
00194b00: 00001021 addu r2,r0,r0
+
  00194b10: 00641821 addu r3,r3,r4                        |{{f/std|Elevation * 9}}
  00194b04: 92040e31 lbu r4,0x0e31(r16)
+
  00194b14: 00031880 sll r3,r3,0x02                      |{{f/std|Elevation * 0x24}}
  00194b08: 92050e30 lbu r5,0x0e30(r16)
+
  00194b18: 00701821 addu r3,r3,r16                      |{{f/std|AI pointer + Elevation offset (0 or 0x24)}}
  00194b0c: 000418c0 sll r3,r4,0x03
+
  00194b1c: 92040e32 lbu r4,0x0e32(r16)                   |{{f/load|Acting Unit Y coord}}
  00194b10: 00641821 addu r3,r3,r4
+
  00194b20: 24630a74 addiu r3,r3,0x0a74                  |{{f/adr|Pointer to AI 0xa74 (+ elevation offset)}}
  00194b14: 00031880 sll r3,r3,0x02
+
  00194b24: 00042040 sll r4,r4,0x01                      |{{f/std|Y offset (halfword)}}
  00194b18: 00701821 addu r3,r3,r16
+
  00194b28: 00832021 addu r4,r4,r3                        |{{f/adr|Pointer to AI 0xa74 + Row Offset + elevation }}
  00194b1c: 92040e32 lbu r4,0x0e32(r16)
+
  00194b2c: 34038000 ori r3,r0,0x8000                    |{{f/std|Prepare bitmask}}
  00194b20: 24630a74 addiu r3,r3,0x0a74
+
  00194b30: 00a31807 srav r3,r3,r5                        |{{f/std|Bitmask for Acting Unit Tile (based on X) in Y row}}
  00194b24: 00042040 sll r4,r4,0x01
+
  00194b34: 08065390 j 0x00194e40                        {{f/jump|Exit and }} {{f/loc| Returns 0x00 }}
  00194b28: 00832021 addu r4,r4,r3
+
  00194b38: a4830000 sh r3,0x0000(r4)                    |{{f/store|Set acting Unit Tile's flag to 0x01 in 0x0a74 Table (reachable tiles)}}
  00194b2c: 34038000 ori r3,r0,0x8000
+
                                                {{f/sec|Unit Can move}}
  00194b30: 00a31807 srav r3,r3,r5
+
                                                    '''Else : Unit can move'''
  00194b34: 08065390 j 0x00194e40 Exit and Return 0
+
  00194b3c: 90640182 lbu r4,0x0182(r3)                    |{{f/load|Acting Unit Mount Data}}
  00194b38: a4830000 sh r3,0x0000(r4) Clear Designation?
+
  00194b40: 00000000 nop                                  |
 
+
  00194b44: 30820080 andi r2,r4,0x0080                    |{{f/std|Check [Is riding]}}
  00194b3c: 90640182 lbu r4,0x0182(r3) Load Mount Data
+
  00194b48: 14400002 bne r2,r0,0x00194b54                {{f/Cond|Branch if Riding a Unit}}
  00194b40: 00000000 nop
+
  00194b4c: 3088001f andi r8,r4,0x001f                    |{{f/std|Get Mount ID}}
  00194b44: 30820080 andi r2,r4,0x0080
+
  00194b50: 92080e2e lbu r8,0x0e2e(r16)                      |{{f/load|Acting Unit ID}}
  00194b48: 14400002 bne r2,r0,0x00194b54 Branch if Riding a Unit
+
  00194b54: 92050e30 lbu r5,0x0e30(r16)                   |{{f/load|Acting Unit X}}
  00194b4c: 3088001f andi r8,r4,0x001f Get Mount ID
+
  00194b58: 92060e32 lbu r6,0x0e32(r16)                  |{{f/load|Acting Unit Y}}
  00194b50: 92080e2e lbu r8,0x0e2e(r16)
+
  00194b5c: 92070e31 lbu r7,0x0e31(r16)                   |{{f/load|Acting Unit Elevation}}
  00194b54: 92050e30 lbu r5,0x0e30(r16)
+
  00194b60: 0c05d2e3 jal 0x00174b8c                      |{{f/jal|Set_Reachable_Tiles|Set_Reachable_Tiles}}
  00194b58: 92060e32 lbu r6,0x0e32(r16)
+
  00194b64: 01002021 addu r4,r8,r0                        |{{f/std|<nowiki>r4 = Moving Unit ID (Self or Mount)</nowiki>}}
  00194b5c: 92070e31 lbu r7,0x0e31(r16)
+
                                        {{f/sec|0x19b7 <> 0x00 - Or 0x00 and Unit can move}}
00194b60: 0c05d2e3 jal 0x00174b8c
+
  00194b68: 0c0076ea jal 0x0001dba8          |{{f/jal|0001dba8_-_0001dcec|0001dba8_-_0001dcec}}
  00194b64: 01002021 addu r4,r8,r0 r4 = Moving Unit ID (Self or Mount)
+
  00194b6c: 34040001 ori r4,r0,0x0001        |{{f/std|<nowiki>Preset value = 0x1</nowiki>}}
 
+
  00194b70: 284201b9 slti r2,r2,0x01b9        |{{f/std|Check returned value Vs 0x1b9}}
  00194b68: 0c0076ea jal 0x0001dba8 Get Frame RNG
+
  00194b74: 14400003 bne r2,r0,0x00194b84    {{f/Cond|If returned Value > 0x1b8}}
00194b6c: 34040001 ori r4,r0,0x0001
+
  00194b78: 00005021 addu r10,r0,r0          |{{f/std|Initialize Elevation counter}}
  00194b70: 284201b9 slti r2,r2,0x01b9
+
  00194b7c: 08065390 j 0x00194e40                {{f/jump|Exit and}} {{f/loc| Return -0x01}}
  00194b74: 14400003 bne r2,r0,0x00194b84
+
  00194b80: 2402ffff addiu r2,r0,0xffff          |{{f/std|}}
  00194b78: 00005021 addu r10,r0,r0
+
  00194b84: a20019b7 sb r0,0x19b7(r16)        |{{f/store|Reset 0x19b7}}
  00194b7c: 08065390 j 0x00194e40 Exit and Return -1
+
  00194b88: 02005821 addu r11,r16,r0          |{{f/adr|AI data pointer}}
  00194b80: 2402ffff addiu r2,r0,0xffff
+
                                            {{f/bloop|LOOP - through all tiles to set tile flag in 0x0a74 }}
 
+
  00194b8c: 92020e3b lbu r2,0x0e3b(r16)           |{{f/load|Map Max Y}}
  00194b84: a20019b7 sb r0,0x19b7(r16)
+
  00194b90: 00000000 nop                         |
  00194b88: 02005821 addu r11,r16,r0
+
  00194b94: 18400040 blez r2,0x00194c98          {{f/Cond|If Max Y is invalid : Branch to }} {{f/loc| Next elevation iteration}}
  00194b8c: 92020e3b lbu r2,0x0e3b(r16)
+
  00194b98: 00003821 addu r7,r0,r0                |{{f/std|Initialize Y counter}}
  00194b90: 00000000 nop
+
  00194b9c: 000a6200 sll r12,r10,0x08            |{{f/std|Elevation Offset in Tiles Data (0 or 0x100)}}
  00194b94: 18400040 blez r2,0x00194c98
+
  00194ba0: 01606821 addu r13,r11,r0              |{{f/adr|AI data pointer}}
00194b98: 00003821 addu r7,r0,r0
+
                                                {{f/bloop|LOOP through Y rows}}
  00194b9c: 000a6200 sll r12,r10,0x08
+
  00194ba4: 92040e3a lbu r4,0x0e3a(r16)              |{{f/load|Map Max X}}
  00194ba0: 01606821 addu r13,r11,r0
+
  00194ba8: 00000000 nop                             |
  00194ba4: 92040e3a lbu r4,0x0e3a(r16)
+
  00194bac: 10800035 beq r4,r0,0x00194c84            {{f/Cond|If Max X is invalid : Branch to }} {{f/loc| Next Y iteration}}
00194ba8: 00000000 nop
+
  00194bb0: 00003021 addu r6,r0,r0                    |{{f/std|Initialize X counter}}
  00194bac: 10800035 beq r4,r0,0x00194c84
+
  00194bb4: 25a30a74 addiu r3,r13,0x0a74              |{{f/adr|AI Pointer to Table of reachable tiles flag}}
 
+
  00194bb8: 00071040 sll r2,r7,0x01                  |{{f/std|Y counter * 2 (Halfword for each Y row)}}
  00194bb0: 00003021 addu r6,r0,r0
+
  00194bbc: 00434821 addu r9,r2,r3                    |{{f/adr|Pointer to this Y row data (0x0a74 table)}}
  00194bb4: 25a30a74 addiu r3,r13,0x0a74
+
  00194bc0: 00e40018 mult r7,r4                      |
  00194bb8: 00071040 sll r2,r7,0x01
+
                                                    {{f/bloop|LOOP through each tiles of the row}}
  00194bbc: 00434821 addu r9,r2,r3
+
00194bc4: 8e0517f8 lw r5,0x17f8(r16)                   |{{f/adr|Acting Unit's Data data pointer}}
  00194bc0: 00e40018 mult r7,r4
+
  00194bc8: 00000000 nop                                 |
  00194bc4: 8e0517f8 lw r5,0x17f8(r16) Load Acting Unit's Data
+
  00194bcc: 90a30094 lbu r3,0x0094(r5)                    |{{f/load|Acting Unit Movement 2}}
  00194bc8: 00000000 nop
+
  00194bd0: 3c048019 lui r4,0x8019                        |
  00194bcc: 90a30094 lbu r3,0x0094(r5) Load Movement 2
+
  00194bd4: 2484f8cc addiu r4,r4,0xf8cc                  |{{f/adr|Tiles data pointer}}
  00194bd0: 3c048019 lui r4,0x8019
+
  00194bd8: 30630008 andi r3,r3,0x0008                    |{{f/std|Check [Teleport]}}
  00194bd4: 2484f8cc addiu r4,r4,0xf8cc r4 = Tile Data
+
  00194bdc: 00001012 mflo r2                             |{{f/std|Y*Max X}}
00194bd8: 30630008 andi r3,r3,0x0008
+
  00194be0: 01821021 addu r2,r12,r2                       |{{f/std|Y*Max X + Elevation offset}}
  00194bdc: 00001012 mflo r2
+
  00194be4: 00461021 addu r2,r2,r6                        |{{f/std|This iteration Tile ID}} {{f/std|Y*MaxX + X + Elevation offset}}
  00194be0: 01821021 addu r2,r12,r2
+
  00194be8: 000210c0 sll r2,r2,0x03                      |{{f/std|Tile's ID * 8}} {{f/std|Tile Offset in Tile's data}}
  00194be4: 00461021 addu r2,r2,r6
+
  00194bec: 10600017 beq r3,r0,0x00194c4c                {{f/Cond|If Acting Unit can teleport}}
  00194be8: 000210c0 sll r2,r2,0x03
+
  00194bf0: 00442021 addu r4,r2,r4                       |{{f/adr|This iteration Tile data pointer}}
  00194bec: 10600017 beq r3,r0,0x00194c4c Branch if no Teleport
+
  00194bf4: 90a20182 lbu r2,0x0182(r5)                        |{{f/load|Load Mount Data}}
  00194bf0: 00442021 addu r4,r2,r4
+
  00194bf8: 00000000 nop                                      |
  00194bf4: 90a20182 lbu r2,0x0182(r5) Load Mount Data
+
  00194bfc: 30420080 andi r2,r2,0x0080                        |{{f/std|Check [Is Riding]}}
  00194bf8: 00000000 nop
+
  00194c00: 14400012 bne r2,r0,0x00194c4c                    {{f/Cond|If Unit is not Riding}}
  00194bfc: 30420080 andi r2,r2,0x0080
+
  00194c04: 00000000 nop                                         |{{f/std|}}
00194c00: 14400012 bne r2,r0,0x00194c4c Branch if Unit is Riding a Mount
+
                                                        {{f/sec|Teleport is active}}
  00194c04: 00000000 nop
+
  00194c08: 92020e30 lbu r2,0x0e30(r16)                          |{{f/load|Acting Unit X coord}}
00194c08: 92020e30 lbu r2,0x0e30(r16)
+
  00194c0c: 00000000 nop                                          |
  00194c0c: 00000000 nop
+
  00194c10: 00464023 subu r8,r2,r6                                |{{f/std|Delta X (Acting Unit - This iteration tile)}}
  00194c10: 00464023 subu r8,r2,r6 r8 = X Distance
+
  00194c14: 05010002 bgez r8,0x00194c20                          {{f/Cond|If delta X is negative}}
00194c14: 05010002 bgez r8,0x00194c20
+
  00194c18: 00000000 nop                                              |{{f/std|}}
  00194c18: 00000000 nop
+
  00194c1c: 00084023 subu r8,r0,r8                                    |{{f/std|Make delta X positive}}
00194c1c: 00084023 subu r8,r0,r8 Distance must always be positive
+
  00194c20: 92020e32 lbu r2,0x0e32(r16)                          |{{f/load|Acting Unit Y}}
  00194c20: 92020e32 lbu r2,0x0e32(r16)
+
  00194c24: 00000000 nop                                          |
  00194c24: 00000000 nop
+
  00194c28: 00472823 subu r5,r2,r7                                |{{f/std|Delta Y (Acting unit - This iteration tile)}}
00194c28: 00472823 subu r5,r2,r7 r5 = Y Distance
+
  00194c2c: 04a10002 bgez r5,0x00194c38                          {{f/Cond|If delta Y is negative}}
  00194c2c: 04a10002 bgez r5,0x00194c38
+
  00194c30: 00000000 nop                                             |{{f/std|}}
  00194c30: 00000000 nop
+
  00194c34: 00052823 subu r5,r0,r5                                    |{{f/std|Make delta Y positive}}
  00194c34: 00052823 subu r5,r0,r5 Distance must always be positive
+
  00194c38: 92030e38 lbu r3,0x0e38(r16)                           |{{f/load|Acting Unit Move}}
  00194c38: 92030e38 lbu r3,0x0e38(r16) Load Current Highest Distance
+
  00194c3c: 01051021 addu r2,r8,r5                                |{{f/std|This Tile's distance to Acting unit}}
00194c3c: 01051021 addu r2,r8,r5 X + Y Distance
+
  00194c40: 0062182a slt r3,r3,r2                                |{{f/std|Check if reachable}}
  00194c40: 0062182a slt r3,r3,r2
+
  00194c44: 1460000a bne r3,r0,0x00194c70                        {{f/Cond|if Unit teleport and tile is in move range, branch to }} {{f/loc|Next Tile iteration }}
  00194c44: 1460000a bne r3,r0,0x00194c70 Branch if Current Distance < Highest Distance
+
  00194c48: 00000000 nop                                         |{{f/std|}}
  00194c48: 00000000 nop
+
                                                        {{f/sec|No Teleport - Teleport but beyond reach}}
 
+
  00194c4c: 90820005 lbu r2,0x0005(r4)                        |{{f/load|Tile's Targeting data}}
  <Move Range>?
+
  00194c50: 00000000 nop                                     |
00194c4c: 90820005 lbu r2,0x0005(r4)
+
  00194c54: 30420020 andi r2,r2,0x0020                        |{{f/std|check [0x20] - Reachable tile flag}}
  00194c50: 00000000 nop
+
  00194c58: 10400005 beq r2,r0,0x00194c70                    {{f/Cond|If Tile is set as reachable (pathfinding result)}}
  00194c54: 30420020 andi r2,r2,0x0020
+
  00194c5c: 34028000 ori r2,r0,0x8000                            |{{f/std|Prepare bitmask}}
  00194c58: 10400005 beq r2,r0,0x00194c70 <X++> if out of move range?
+
  00194c60: 95230000 lhu r3,0x0000(r9)                            |{{f/load|This Row hallword (AI 0x0a74)}}
 
+
  00194c64: 00c21007 srav r2,r2,r6                                |{{f/std|Bitmask for this Tile}}
  <Save New Highest>
+
  00194c68: 00621825 or r3,r3,r2                                  |{{f/std|Enable this tile flag}}
00194c5c: 34028000 ori r2,r0,0x8000
+
  00194c6c: a5230000 sh r3,0x0000(r9)                            |{{f/store|Store New flags (this tile enabled)}}
  00194c60: 95230000 lhu r3,0x0000(r9)
+
  00194c70: 92040e3a lbu r4,0x0e3a(r16)                  |{{f/load|Map max X}}
  00194c64: 00c21007 srav r2,r2,r6
+
  00194c74: 24c60001 addiu r6,r6,0x0001                  |{{f/std|X counter +1}}
  00194c68: 00621825 or r3,r3,r2
+
  00194c78: 00c4102a slt r2,r6,r4                        |{{f/std|Check if next X is in map}}
  00194c6c: a5230000 sh r3,0x0000(r9)
+
  00194c7c: 1440ffd1 bne r2,r0,0x00194bc4            {{f/eloop|Loop While X counter is valid}}
 
+
00194c80: 00e40018 mult r7,r4                           |{{f/std|Y*MapX}}
<X++>
+
  00194c84: 92020e3b lbu r2,0x0e3b(r16)               |{{f/load|Map Max Y}}
  00194c70: 92040e3a lbu r4,0x0e3a(r16)
+
  00194c88: 24e70001 addiu r7,r7,0x0001              |{{f/std|Y counter +1}}
  00194c74: 24c60001 addiu r6,r6,0x0001
+
  00194c8c: 00e2102a slt r2,r7,r2                     |{{f/std|Check if next Y is valid}}
  00194c78: 00c4102a slt r2,r6,r4
+
  00194c90: 1440ffc4 bne r2,r0,0x00194ba4        {{f/eloop|Loop While Y counter is valid}}
  00194c7c: 1440ffd1 bne r2,r0,0x00194bc4
+
00194c94: 00000000 nop                              |
  00194c80: 00e40018 mult r7,r4
+
  00194c98: 254a0001 addiu r10,r10,0x0001         |{{f/std|Elevation counter +1}}
 
+
  00194c9c: 29420002 slti r2,r10,0x0002          |{{f/std|Check limit}}
  <Y++
+
  00194ca0: 1440ffba bne r2,r0,0x00194b8c    {{f/eloop|Loop 2 times (each elevation)}}
00194c84: 92020e3b lbu r2,0x0e3b(r16)
+
  00194ca4: 256b0024 addiu r11,r11,0x0024        |{{f/adr|AI data pointer + elevation offset}} {{f/std|For 0x0a74 table}}
00194c88: 24e70001 addiu r7,r7,0x0001
+
  00194ca8: 00004021 addu r8,r0,r0            |{{f/std|Initialize unit counter}}
00194c8c: 00e2102a slt r2,r7,r2
+
  00194cac: 340900ff ori r9,r0,0x00ff        |
  00194c90: 1440ffc4 bne r2,r0,0x00194ba4
+
  00194cb0: 34078000 ori r7,r0,0x8000        |{{f/std|Prep bitmask}}
  00194c94: 00000000 nop
+
  00194cb4: 3c068019 lui r6,0x8019            |
 
+
  00194cb8: 24c608cc addiu r6,r6,0x08cc      |{{f/adr|Pointer to start of unit data}}
  <Map Level++>
+
                                            {{f/bloop|LOOP - Through all units}}
  00194c98: 254a0001 addiu r10,r10,0x0001
+
  00194cbc: 90c20001 lbu r2,0x0001(r6)            |{{f/load|Unit ID}}
  00194c9c: 29420002 slti r2,r10,0x0002
+
  00194cc0: 00000000 nop                          |
  00194ca0: 1440ffba bne r2,r0,0x00194b8c
+
  00194cc4: 1049001a beq r2,r9,0x00194d30        {{f/Cond|If Unit don't exist : branch}} {{f/loc| to next unit iteration}}
  00194ca4: 256b0024 addiu r11,r11,0x0024
+
  00194cc8: 00000000 nop                              |
 
+
  00194ccc: 92020e2e lbu r2,0x0e2e(r16)          |{{f/load|Acting unit ID}}
  00194ca8: 00004021 addu r8,r0,r0
+
00194cd0: 00000000 nop                          |
  00194cac: 340900ff ori r9,r0,0x00ff
+
  00194cd4: 11020016 beq r8,r2,0x00194d30        {{f/Cond|If Unit is acting unit : branch}} {{f/loc| to next unit iteration}}
  00194cb0: 34078000 ori r7,r0,0x8000
+
  00194cd8: 00000000 nop                              |
  00194cb4: 3c068019 lui r6,0x8019
+
  00194cdc: 94c20058 lhu r2,0x0058(r6)            |{{f/load|Load this iteration unit Current Status 1 and 2}}
00194cb8: 24c608cc addiu r6,r6,0x08cc
+
  00194ce0: 00000000 nop                          |
  00194cbc: 90c20001 lbu r2,0x0001(r6)
+
  00194ce4: 30420140 andi r2,r2,0x0140            |{{f/std|Check [Crystal] and [Treasure]}}
  00194cc0: 00000000 nop
+
  00194ce8: 14400011 bne r2,r0,0x00194d30        {{f/Cond|If unit is not a crystal nor a treasure}}
  00194cc4: 1049001a beq r2,r9,0x00194d30 Branch if Unit does not exist
+
  00194cec: 00000000 nop                              |
  00194cc8: 00000000 nop
+
00194cf0: 94c20048 lhu r2,0x0048(r6)               |{{f/load|Unit Y and elevatio}}
00194ccc: 92020e2e lbu r2,0x0e2e(r16)
+
  00194cf4: 90c50048 lbu r5,0x0048(r6)                |{{f/load|Unit Y Coord}}
  00194cd0: 00000000 nop
+
  00194cf8: 90c40047 lbu r4,0x0047(r6)                |{{f/load|Unit X Coord}}
00194cd4: 11020016 beq r8,r2,0x00194d30 Branch if Acting Unit = Current Unit
+
  00194cfc: 000213c2 srl r2,r2,0x0f                  |{{f/std|Shift elevation flag to 0x01}}
  00194cd8: 00000000 nop
+
  00194d00: 000218c0 sll r3,r2,0x03                  |{{f/std|Elevation * 8}}
  00194cdc: 94c20058 lhu r2,0x0058(r6) Load Current Status 1 and 2
+
  00194d04: 00621821 addu r3,r3,r2                    |{{f/std|Elevation * 9}}
  00194ce0: 00000000 nop
+
  00194d08: 00031880 sll r3,r3,0x02                  |{{f/std|Elevation * 0x24}}
  00194ce4: 30420140 andi r2,r2,0x0140
+
  00194d0c: 00701821 addu r3,r3,r16                  |{{f/std|8019f3c4 + elevation offset}}
00194ce8: 14400011 bne r2,r0,0x00194d30 Branch if Crystal/Treasure
+
  00194d10: 24630a74 addiu r3,r3,0x0a74              |{{f/adr|Pointer to Reachable tile flag Table + elevation offset}}
  00194cec: 00000000 nop
+
  00194d14: 00052840 sll r5,r5,0x01                  |{{f/std|Y*2}}
  00194cf0: 94c20048 lhu r2,0x0048(r6)
+
  00194d18: 00a32821 addu r5,r5,r3                    |{{f/adr|Pointer to Reachable tile flag Table + elevation and Y row offset}}
  00194cf4: 90c50048 lbu r5,0x0048(r6)
+
  00194d1c: 00872007 srav r4,r7,r4                    |{{f/std|Shift 0x8000 by X coordinate}}
00194cf8: 90c40047 lbu r4,0x0047(r6)
+
  00194d20: 94a20000 lhu r2,0x0000(r5)                |{{f/load|Load This iteration Unit's, Y row halfword of flags}}
  00194cfc: 000213c2 srl r2,r2,0x0f
+
  00194d24: 00042027 nor r4,r0,r4                    |{{f/std|All flags but the unit one}}
  00194d00: 000218c0 sll r3,r2,0x03
+
  00194d28: 00441024 and r2,r2,r4                     |
  00194d04: 00621821 addu r3,r3,r2
+
  00194d2c: a4a20000 sh r2,0x0000(r5)                 |{{f/store|Disable unit's tile reachable flag}}
  00194d08: 00031880 sll r3,r3,0x02
+
  00194d30: 25080001 addiu r8,r8,0x0001          |{{f/std|Unit counter + 1}}
  00194d0c: 00701821 addu r3,r3,r16
+
  00194d34: 29020015 slti r2,r8,0x0015            |{{f/std|check unit limit}}
  00194d10: 24630a74 addiu r3,r3,0x0a74
+
  00194d38: 1440ffe0 bne r2,r0,0x00194cbc    {{f/eloop|Loop through all units}}
  00194d14: 00052840 sll r5,r5,0x01
+
  00194d3c: 24c601c0 addiu r6,r6,0x01c0          |{{f/std|Unit Battle stat offset}}
  00194d18: 00a32821 addu r5,r5,r3
+
  00194d40: 92030e31 lbu r3,0x0e31(r16)      |{{f/load|Acting Unit elevation}}
  00194d1c: 00872007 srav r4,r7,r4
+
  00194d44: 92040e32 lbu r4,0x0e32(r16)      |{{f/load|Active unit Y}}
  00194d20: 94a20000 lhu r2,0x0000(r5)
+
  00194d48: 92050e30 lbu r5,0x0e30(r16)      |{{f/load|Active unit X}}
  00194d24: 00042027 nor r4,r0,r4
+
  00194d4c: 000310c0 sll r2,r3,0x03          |
  00194d28: 00441024 and r2,r2,r4
+
  00194d50: 00431021 addu r2,r2,r3           |
  00194d2c: a4a20000 sh r2,0x0000(r5)
+
  00194d54: 00021080 sll r2,r2,0x02          |{{f/std|Elevation * 0x24}}
  00194d30: 25080001 addiu r8,r8,0x0001
+
  00194d58: 00501021 addu r2,r2,r16          |
  00194d34: 29020015 slti r2,r8,0x0015
+
  00194d5c: 24420a74 addiu r2,r2,0x0a74      |{{f/adr|Pointer to Reachable tile flag Table + elevation offset}}
  00194d38: 1440ffe0 bne r2,r0,0x00194cbc Do for all units
+
  00194d60: 00042040 sll r4,r4,0x01          |
  00194d3c: 24c601c0 addiu r6,r6,0x01c0
+
  00194d64: 00822021 addu r4,r4,r2            |{{f/adr|Pointer to Reachable tile flag Table + elevation and Y row offset}}
 
+
  00194d68: 34038000 ori r3,r0,0x8000        |{{f/std|Prep bitmask}}
 
+
00194d6c: 94820000 lhu r2,0x0000(r4)        |{{f/load|Load Acting Unit's, Y row halfword of flags}}
  00194d40: 92030e31 lbu r3,0x0e31(r16)
+
00194d70: 00a31807 srav r3,r3,r5            |
  00194d44: 92040e32 lbu r4,0x0e32(r16)
+
00194d74: 00431025 or r2,r2,r3              |
  00194d48: 92050e30 lbu r5,0x0e30(r16)
+
00194d78: a4820000 sh r2,0x0000(r4)        |{{f/store|Enable acting unit's tile reachable flag}}
  00194d4c: 000310c0 sll r2,r3,0x03
+
00194d7c: 8e0217f8 lw r2,0x17f8(r16)        |{{f/adr|Load Acting Unit Data}}
  00194d50: 00431021 addu r2,r2,r3
+
00194d80: 3c030008 lui r3,0x0008            |
  00194d54: 00021080 sll r2,r2,0x02
+
00194d84: 8c420058 lw r2,0x0058(r2)        |{{f/adr|Load Current Statuses 1-4}}
  00194d58: 00501021 addu r2,r2,r16
+
00194d88: 34631000 ori r3,r3,0x1000        |{{f/std|0x00081000}}
  00194d5c: 24420a74 addiu r2,r2,0x0a74
+
00194d8c: 00431024 and r2,r2,r3            |{{f/std|Check [Confusion] and [Berserk]}}
  00194d60: 00042040 sll r4,r4,0x01
+
00194d90: 1440002b bne r2,r0,0x00194e40    {{f/Cond|If Acting unit is Confuse/Berserk :}} {{f/loc|  Exit routine and returns 0x00 }}
  00194d64: 00822021 addu r4,r4,r2
+
00194d94: 00001021 addu r2,r0,r0                |{{f/std|<nowiki>r2 = 0x00</nowiki>}}
00194d68: 34038000 ori r3,r0,0x8000
+
  00194d6c: 94820000 lhu r2,0x0000(r4)
+
                                            '''Else - not confuse nor berserk'''
  00194d70: 00a31807 srav r3,r3,r5
+
00194d98: 00004021 addu r8,r0,r0                |{{f/std|Initialize counter}}
  00194d74: 00431025 or r2,r2,r3
+
00194d9c: 340900ff ori r9,r0,0x00ff            |
  00194d78: a4820000 sh r2,0x0000(r4)
+
00194da0: 34078000 ori r7,r0,0x8000            |
  00194d7c: 8e0217f8 lw r2,0x17f8(r16) Load Acting Unit Data
+
00194da4: 3406181c ori r6,r0,0x181c            |
  00194d80: 3c030008 lui r3,0x0008
+
                                                {{f/bloop|LOOP}}
  00194d84: 8c420058 lw r2,0x0058(r2) Load Current Statuses 1-4
+
00194da8: 02062021 addu r4,r16,r6                  |{{f/adr|Pointer to AI ? (some coordinates data)}} {{f/std|8019f3c4 + 0x181c + 0x04 Each iteration}}
  00194d88: 34631000 ori r3,r3,0x1000
+
00194dac: 90850000 lbu r5,0x0000(r4)                |{{f/load|Load ? X coordinates}}
  00194d8c: 00431024 and r2,r2,r3
+
00194db0: 00000000 nop                              |
  00194d90: 1440002b bne r2,r0,0x00194e40 Exit and Return 0 if Confuse/Berserk
+
00194db4: 10a90012 beq r5,r9,0x00194e00            {{f/Cond|If Entry is invalid (0xff) : branch}} {{f/loc| Exit Loop}}
  00194d94: 00001021 addu r2,r0,r0
+
00194db8: 24c60004 addiu r6,r6,0x0004                  |{{f/std|0x181c offset counter + 4}}
 
+
00194dbc: 25080001 addiu r8,r8,0x0001                  |{{f/std|Existing unit counter + 1}}
 
+
00194dc0: 90830001 lbu r3,0x0001(r4)                    |{{f/load|Load Unit Elevation}}
  00194d98: 00004021 addu r8,r0,r0
+
00194dc4: 90840002 lbu r4,0x0002(r4)                    |{{f/load|Load Unit Y}}
  00194d9c: 340900ff ori r9,r0,0x00ff
+
00194dc8: 000310c0 sll r2,r3,0x03                      |
  00194da0: 34078000 ori r7,r0,0x8000
+
00194dcc: 00431021 addu r2,r2,r3                        |
  00194da4: 3406181c ori r6,r0,0x181c
+
00194dd0: 00021080 sll r2,r2,0x02                      |{{f/std|Elevation * 0x24}}
 
+
00194dd4: 00501021 addu r2,r2,r16                      |
  00194da8: 02062021 addu r4,r16,r6
+
00194dd8: 24420a74 addiu r2,r2,0x0a74                  |{{f/adr|Pointer to Reachable tile flag Table + elevation offset}}
  00194dac: 90850000 lbu r5,0x0000(r4)
+
00194ddc: 00042040 sll r4,r4,0x01                      |
  00194db0: 00000000 nop
+
00194de0: 00822021 addu r4,r4,r2                        |{{f/adr|Pointer to Reachable tile flag Table + elevation and Y row offset}}
00194db4: 10a90012 beq r5,r9,0x00194e00
+
00194de4: 00a71007 srav r2,r7,r5                        |{{f/std|Bitmask Tile flag}}
 
+
00194de8: 94830000 lhu r3,0x0000(r4)                    |{{f/load|Load this Tile Row flags}}
 
+
00194dec: 00021027 nor r2,r0,r2                        |{{f/std|Everything but tile flag}}
  00194db8: 24c60004 addiu r6,r6,0x0004
+
00194df0: 00621824 and r3,r3,r2                        |
  00194dbc: 25080001 addiu r8,r8,0x0001
+
00194df4: 29020004 slti r2,r8,0x0004                |{{f/std|Check limit}}
  00194dc0: 90830001 lbu r3,0x0001(r4)
+
00194df8: 1440ffeb bne r2,r0,0x00194da8        {{f/eloop|Loop 4 Times (4 coordinates ?)}}
  00194dc4: 90840002 lbu r4,0x0002(r4)
+
00194dfc: a4830000 sh r3,0x0000(r4)                |{{f/store|Disable this tile reachable flag}}
  00194dc8: 000310c0 sll r2,r3,0x03
+
00194e00: 00001021 addu r2,r0,r0                |{{f/std| }}
  00194dcc: 00431021 addu r2,r2,r3
+
00194e04: 92040e31 lbu r4,0x0e31(r16)          |{{f/load|Acting Unit Elevation}}
  00194dd0: 00021080 sll r2,r2,0x02
+
00194e08: 92050e32 lbu r5,0x0e32(r16)          |{{f/load|Acting Unit Y Coord}}
  00194dd4: 00501021 addu r2,r2,r16
+
00194e0c: 92060e30 lbu r6,0x0e30(r16)          |{{f/load|Acting Unit X Coord}}
  00194dd8: 24420a74 addiu r2,r2,0x0a74
+
00194e10: 000418c0 sll r3,r4,0x03               |
  00194ddc: 00042040 sll r4,r4,0x01
+
  00194e14: 00641821 addu r3,r3,r4               |
  00194de0: 00822021 addu r4,r4,r2
+
  00194e18: 00031880 sll r3,r3,0x02               |{{f/std|Elevation * 0x24}}
  00194de4: 00a71007 srav r2,r7,r5
+
  00194e1c: 00701821 addu r3,r3,r16               |
  00194de8: 94830000 lhu r3,0x0000(r4)
+
  00194e20: 24630a74 addiu r3,r3,0x0a74           |{{f/adr|Pointer to Reachable tile flag Table + elevation offset}}
  00194dec: 00021027 nor r2,r0,r2
+
  00194e24: 00052840 sll r5,r5,0x01               |
  00194df0: 00621824 and r3,r3,r2
+
  00194e28: 00a32821 addu r5,r5,r3               |{{f/adr|Pointer to Reachable tile flag Table + elevation and Y row offset}}
  00194df4: 29020004 slti r2,r8,0x0004
+
  00194e2c: 34048000 ori r4,r0,0x8000             |
  00194df8: 1440ffeb bne r2,r0,0x00194da8 Go through all 3 potential spots to move to?
+
  00194e30: 94a30000 lhu r3,0x0000(r5)           |{{f/load|Load Row of tiles flag}}
  00194dfc: a4830000 sh r3,0x0000(r4)
+
  00194e34: 00c42007 srav r4,r4,r6               |
 
+
  00194e38: 00641825 or r3,r3,r4                 |
  <Designate Tile to Move to>?
+
  00194e3c: a4a30000 sh r3,0x0000(r5)             |{{f/store|Enable acting unit's tile reachable flag}} {{f/std|Again ? }}
00194e00: 00001021 addu r2,r0,r0
+
  00194e40: 8fbf0038 lw r31,0x0038(r29)       END
00194e04: 92040e31 lbu r4,0x0e31(r16)
 
00194e08: 92050e32 lbu r5,0x0e32(r16)
 
00194e0c: 92060e30 lbu r6,0x0e30(r16)
 
00194e10: 000418c0 sll r3,r4,0x03
 
  00194e14: 00641821 addu r3,r3,r4
 
  00194e18: 00031880 sll r3,r3,0x02
 
  00194e1c: 00701821 addu r3,r3,r16
 
  00194e20: 24630a74 addiu r3,r3,0x0a74
 
  00194e24: 00052840 sll r5,r5,0x01
 
  00194e28: 00a32821 addu r5,r5,r3
 
  00194e2c: 34048000 ori r4,r0,0x8000
 
  00194e30: 94a30000 lhu r3,0x0000(r5)
 
  00194e34: 00c42007 srav r4,r4,r6
 
  00194e38: 00641825 or r3,r3,r4
 
  00194e3c: a4a30000 sh r3,0x0000(r5)
 
 
 
  00194e40: 8fbf0038 lw r31,0x0038(r29)
 
 
  00194e44: 8fb10034 lw r17,0x0034(r29)
 
  00194e44: 8fb10034 lw r17,0x0034(r29)
 
  00194e48: 8fb00030 lw r16,0x0030(r29)
 
  00194e48: 8fb00030 lw r16,0x0030(r29)
Line 374: Line 357:
 
  00194e50: 03e00008 jr r31
 
  00194e50: 03e00008 jr r31
 
  00194e54: 00000000 nop
 
  00194e54: 00000000 nop
 +
 +
===Notes===
 +
If AI 0x19b7  = 0x00 : initialize some movement data              ( 0x801a0d7b )
 +
  - Set 0x19b9 (water movement penality)                          ( 0x801a0d7d )
 +
  - Reset AI 0x0C24 Table (Walkable tile flag)
 +
  - Set AI 0x0C24 Table flags (0x1 if not unselectable nor a cross section)
 +
  - Nullify 0x0e2d (seems to be some offset for Table 0x0a74 (size is 0x48 bytes)
 +
  - Reset AI 0x0A74 Table (reachable Tiles)
 +
  - If Unit can't move/has moved : set Acting unit Tile flag to 1 in 0x0a74 Table and returns 0x00
 +
  - If Unit can move : Set reachable tile flag - Byte 0x05 flag 0x20 (via heavy pathfinding routines) 
 +
                      Go in 0x19b7 != 0x00 Section
 +
 +
If AI 0x19b7 != 0x00 
 +
  - Exit if 0001dba8 returns r2 > 0x1b8
 +
  - Else :
 +
      - Reset 0x19b7 (this is just preventing some infinite loop due to 0001dba8 ?)
 +
      - Enable Tile flag in AI Table 0xa74 if Tile is reachable (byte 0x05 flag 0x20)
 +
      Note : Unit using teleport seems to not use this table and skip the section
 +
      - Disable Tile flag (Table 0x0a74) if there is another living unit on tile
 +
      - Enable acting Unit Tile's flag (0xa74)
 +
      - Exit if acting unit has berserk or confuse
 +
      - Else :
 +
        - Disable Tile's flag is the tile is present in 0x181c List (4 words for 4 coordinates. Don't know which one yet)
 +
        - Enable acting Unit Tile's flag (0xa74) (? force flag even if tile is in above list)
 +
===Return location===
 +
'''Battle.bin'''
 +
00194070: [[Main_AI_action_setup]]

Latest revision as of 20:00, 5 April 2024

BATTLE.BIN - AI movement/panel data setting
------------------------------------------------------------------------------------------------
Parameters : r4 = Acting Unit Battle 0x187 (movement taken flag)

Returns : r2 = 0x00 if 0x19b7 = 0x00 and Unit has moved / can't move
          r2 = 0x00 if Unit Can move but has berserk or confuse
          r2 = 0x00 At the end of the routine
          r2 = -0x01 if 0001dba8 returns r2 > 0x1b8 (?)
 
This routine handles some Tables of Tiles flags.
If 0x19b7 = 0x00 : initialize pathfing and set flag in Table 0x0C24 (walkable tiles)
                   Enable Flag 0x20 on Tile's Byte 0x05 (in data at 8018f8cc)
If Unit can Move or 0x19b7 != 0x00 
   Set Flags in Table 0x0a74 (for unit not using teleport)
-------------------------------------------------------------------------------------------------
00194944: 3c02801a lui r2,0x801a            |
00194948: 90420d7b lbu r2,0x0d7b(r2)        |Load [801a0d7b] aka 8019f3c4 + 0x19b7
0019494c: 27bdffc0 addiu r29,r29,-0x0040    |
00194950: afb10034 sw r17,0x0034(r29)       |
00194954: 00808821 addu r17,r4,r0           |r17 = Acting Unit movement taken flag
00194958: afb00030 sw r16,0x0030(r29)       |
0019495c: 3c10801a lui r16,0x801a           |
00194960: 2610f3c4 addiu r16,r16,-0x0c3c    |AI data pointer ( 8019f3c4 )
00194964: 14400080 bne r2,r0,0x00194b68     #If [0x19b7] = 0x00
00194968: afbf0038 sw r31,0x0038(r29)           |
0019496c: 3c03801a lui r3,0x801a                |
00194970: 8c630bbc lw r3,0x0bbc(r3)             |Load Acting Unit's Data pointer
00194974: 00000000 nop                          |
00194978: 90620095 lbu r2,0x0095(r3)            |Load Movement set 3
0019497c: 00000000 nop                          |
00194980: 304200c8 andi r2,r2,0x00c8            |Check [Move on Water] [Move in Water] and [Float]
00194984: 14400006 bne r2,r0,0x001949a0         #If Acting unit do not use [Float], [Move on water] nor [Move in water]
00194988: 26040c24 addiu r4,r16,0x0c24          |AI pointer to 8019f3c4 + 0xc24
0019498c: 9062005a lbu r2,0x005a(r3)                |Load Acting unit Current status set 3
00194990: 00000000 nop                              |
00194994: 30420040 andi r2,r2,0x0040                |check [Float]
00194998: 10400005 beq r2,r0,0x001949b0             #If Unit has float
0019499c: 34020001 ori r2,r0,0x0001                     |
001949a0: 3c01801a lui r1,0x801a                #E      | 
001949a4: a0200d7d sb r0,0x0d7d(r1)                     |Water Penalty = False (Move on water, move in water or Float)
001949a8: 0806526f j 0x001949bc                         >>Avoid water penalty section
001949ac: 00000000 nop                                  |
                                                Else : No float status nor any Move allowing water move
001949b0: 3c01801a lui r1,0x801a                    |
001949b4: a0220d7d sb r2,0x0d7d(r1)                 |Water Penalty = True  aka 8019f3c4 + 0x19b9
001949b8: 26040c24 addiu r4,r16,0x0c24              |AI pointer to 8019f3c4 + 0xc24
001949bc: 0c066ade jal 0x0019ab78               |-->Word_Nulling Nullify Walkable Tile flags
001949c0: 34050048 ori r5,r0,0x0048             |size of data to nullify
001949c4: 00005021 addu r10,r0,r0               |Initialize elevation counter
001949c8: 3c0c8019 lui r12,0x8019               |
001949cc: 258cf8cc addiu r12,r12,0xf8cc         |Tile Data pointer
001949d0: 340b003f ori r11,r0,0x003f            |r11 = Cross Section Tile
001949d4: 02004021 addu r8,r16,r0               |AI data pointer ( 8019f3c4 )
                                                LOOP - Elevation (Loop through all tiles to set walkable tile's flag)
001949d8: 92020e3b lbu r2,0x0e3b(r16)               |Load Map Max Y
001949dc: 00000000 nop                              |
001949e0: 18400027 blez r2,0x00194a80               #If Max Y is invalid : branch to  Next elevation iteration
001949e4: 00003821 addu r7,r0,r0                    |Initialize Y counter
001949e8: 000a4a00 sll r9,r10,0x08                  |Elevation Offset in tiles data
                                                    LOOP through each Y rows
001949ec: 92040e3a lbu r4,0x0e3a(r16)                   |Load Map Max X
001949f0: 00000000 nop                                  |
001949f4: 1080001d beq r4,r0,0x00194a6c                 #If Max X is invalid : branch to  next Y row iteration
001949f8: 00003021 addu r6,r0,r0                        |Initialize X counter
001949fc: 25030c24 addiu r3,r8,0x0c24                   |Pointer to AI 0xc24 +0x24 if high elevation
00194a00: 00071040 sll r2,r7,0x01                       |Y counter * 2 (an Halfword of flags for each Y row)
00194a04: 00432821 addu r5,r2,r3                        |Pointer to AI 0xc24 + Row offset  + 0x2 each Y iteration
00194a08: 00e40018 mult r7,r4                           |
                                                        LOOP through each tiles of the row
00194a0c: 00001012 mflo r2                                  |Y counter * Max X
00194a10: 01221021 addu r2,r9,r2                            |
00194a14: 00461021 addu r2,r2,r6                            |This iteration Tile's ID (X + Y*Max X) + 0x100 if upper elevation
00194a18: 000210c0 sll r2,r2,0x03                           |Tiles offset in Tiles Table
00194a1c: 004c2021 addu r4,r2,r12                           |This iteration Tile's data pointer
00194a20: 90820006 lbu r2,0x0006(r4)                        |Load Tile's Byte 0x06
00194a24: 00000000 nop                                      |
00194a28: 30420001 andi r2,r2,0x0001                        |check [Unselectable by cursor]
00194a2c: 1440000a bne r2,r0,0x00194a58                     #If Tile is selectable / Else branch to Next Tile
00194a30: 00000000 nop                                          |
00194a34: 90820000 lbu r2,0x0000(r4)                            |Load Current Tile Terrain type
00194a38: 00000000 nop                                          |
00194a3c: 3042003f andi r2,r2,0x003f                            |Check [Cross Tile]
00194a40: 104b0005 beq r2,r11,0x00194a58                        #If Tile is not a Cross Tile (unplayable wall)
00194a44: 34028000 ori r2,r0,0x8000                                 |Prepare Tile's bitmask
00194a48: 94a30000 lhu r3,0x0000(r5)                                |Load Y row halfword of flags
00194a4c: 00c21007 srav r2,r2,r6                                    |r2 = Bitmask of this tile in the row
00194a50: 00621825 or r3,r3,r2                                      |Enable Tile's Flag (as playable ?) Not untargetable nor Cross section
00194a54: a4a30000 sh r3,0x0000(r5)                                 |Store updated Tile is Walkable flags (Y row)
00194a58: 92040e3a lbu r4,0x0e3a(r16)                       |Max X
00194a5c: 24c60001 addiu r6,r6,0x0001                       |X counter +1
00194a60: 00c4102a slt r2,r6,r4                             |Check limit
00194a64: 1440ffe9 bne r2,r0,0x00194a0c                 Λ Loop while not at max X
00194a68: 00e40018 mult r7,r4                               |Y counter * Max X
00194a6c: 92020e3b lbu r2,0x0e3b(r16)                   |Max Y
00194a70: 24e70001 addiu r7,r7,0x0001                   |Y counter + 1
00194a74: 00e2102a slt r2,r7,r2                         |Check limit
00194a78: 1440ffdc bne r2,r0,0x001949ec             Λ Loop while not at max Y
00194a7c: 00000000 nop                                  |
00194a80: 254a0001 addiu r10,r10,0x0001             |Elevation counter +1
00194a84: 29420002 slti r2,r10,0x0002               |Check limit
00194a88: 1440ffd3 bne r2,r0,0x001949d8         Λ Loop 2 times
00194a8c: 25080024 addiu r8,r8,0x0024               |Elevation offset in AI walkable tiles Table
00194a90: a2000e2d sb r0,0x0e2d(r16)            |Nullify 0xe2d (?) Will be used as offset for the next loop Table 
00194a94: 00002821 addu r5,r0,r0                |initialize counter
                                                @LOOP - Initialize Reachable tiles flags
00194a98: 92030e2d lbu r3,0x0e2d(r16)               |0x00 1st instance of 0xa74 Table ?
00194a9c: 00052040 sll r4,r5,0x01                   |counter * 2  Halfword offset
00194aa0: 000310c0 sll r2,r3,0x03                   |0xe2d * 8
00194aa4: 00431021 addu r2,r2,r3                    |0xe2d * 9
00194aa8: 000210c0 sll r2,r2,0x03                   |0xe2d * 0x48
00194aac: 02021021 addu r2,r16,r2                   |8019f3c4 + Some 0x48 offset 0x2ed is a offset of table of flags ?
00194ab0: 00821021 addu r2,r4,r2                    |Same + Halfword offset
00194ab4: a4400a74 sh r0,0x0a74(r2)                 |Nullify Y row halfword
00194ab8: 92030e2d lbu r3,0x0e2d(r16)               |
00194abc: 24a50001 addiu r5,r5,0x0001               |Y row counter + 1
00194ac0: 000310c0 sll r2,r3,0x03                   |0xe2d * 8
00194ac4: 00431021 addu r2,r2,r3                    |0xe2d * 9
00194ac8: 000210c0 sll r2,r2,0x03                   |0xe2d * 0x48
00194acc: 02021021 addu r2,r16,r2                   |8019f3c4 + Some 0x48 offset
00194ad0: 00822021 addu r4,r4,r2                    |Same + Halfword offset
00194ad4: 28a20012 slti r2,r5,0x0012                |Limit
00194ad8: 1440ffef bne r2,r0,0x00194a98         Λ Loop 0x12 Time (0x12 rows of tiles)
00194adc: a4800a98 sh r0,0x0a98(r4)                 |Nullify higher elevation row
00194ae0: 16200008 bne r17,r0,0x00194b04        #If Target didn't take his move yet
00194ae4: 00001021 addu r2,r0,r0                    |
00194ae8: 8e0317f8 lw r3,0x17f8(r16)                |Acting Unit Data pointer
00194aec: 00000000 nop                              |
00194af0: 9062005c lbu r2,0x005c(r3)                |Acting unit Current Status 5
00194af4: 00000000 nop                              |
00194af8: 30420008 andi r2,r2,0x0008                |Check [Don't Move]
00194afc: 1040000f beq r2,r0,0x00194b3c             #Avoid section if Unit can move
                                                Unit has moved or can't move
00194b00: 00001021 addu r2,r0,r0                        |r2 = 0x00 (returned value)
00194b04: 92040e31 lbu r4,0x0e31(r16)                   |Acting Unit Elevation
00194b08: 92050e30 lbu r5,0x0e30(r16)                   |Acting Unit X coord
00194b0c: 000418c0 sll r3,r4,0x03                       |Elevation * 8
00194b10: 00641821 addu r3,r3,r4                        |Elevation * 9
00194b14: 00031880 sll r3,r3,0x02                       |Elevation * 0x24
00194b18: 00701821 addu r3,r3,r16                       |AI pointer + Elevation offset (0 or 0x24)
00194b1c: 92040e32 lbu r4,0x0e32(r16)                   |Acting Unit Y coord
00194b20: 24630a74 addiu r3,r3,0x0a74                   |Pointer to AI 0xa74 (+ elevation offset)
00194b24: 00042040 sll r4,r4,0x01                       |Y offset (halfword)
00194b28: 00832021 addu r4,r4,r3                        |Pointer to AI 0xa74 + Row Offset + elevation 
00194b2c: 34038000 ori r3,r0,0x8000                     |Prepare bitmask
00194b30: 00a31807 srav r3,r3,r5                        |Bitmask for Acting Unit Tile (based on X) in Y row
00194b34: 08065390 j 0x00194e40                         >>Exit and   Returns 0x00 
00194b38: a4830000 sh r3,0x0000(r4)                     |Set acting Unit Tile's flag to 0x01 in 0x0a74 Table (reachable tiles)
                                                Unit Can move
                                                    Else : Unit can move
00194b3c: 90640182 lbu r4,0x0182(r3)                    |Acting Unit Mount Data
00194b40: 00000000 nop                                  |
00194b44: 30820080 andi r2,r4,0x0080                    |Check [Is riding]
00194b48: 14400002 bne r2,r0,0x00194b54                 #Branch if Riding a Unit
00194b4c: 3088001f andi r8,r4,0x001f                    |Get Mount ID
00194b50: 92080e2e lbu r8,0x0e2e(r16)                       |Acting Unit ID
00194b54: 92050e30 lbu r5,0x0e30(r16)                   |Acting Unit X
00194b58: 92060e32 lbu r6,0x0e32(r16)                   |Acting Unit Y
00194b5c: 92070e31 lbu r7,0x0e31(r16)                   |Acting Unit Elevation
00194b60: 0c05d2e3 jal 0x00174b8c                       |-->Set_Reachable_Tiles
00194b64: 01002021 addu r4,r8,r0                        |r4 = Moving Unit ID (Self or Mount)
                                        0x19b7 <> 0x00 - Or 0x00 and Unit can move
00194b68: 0c0076ea jal 0x0001dba8           |-->0001dba8_-_0001dcec
00194b6c: 34040001 ori r4,r0,0x0001         |Preset value = 0x1
00194b70: 284201b9 slti r2,r2,0x01b9        |Check returned value Vs 0x1b9
00194b74: 14400003 bne r2,r0,0x00194b84     #If returned Value > 0x1b8
00194b78: 00005021 addu r10,r0,r0           |Initialize Elevation counter
00194b7c: 08065390 j 0x00194e40                 >>Exit and  Return -0x01
00194b80: 2402ffff addiu r2,r0,0xffff           |
00194b84: a20019b7 sb r0,0x19b7(r16)        |Reset 0x19b7
00194b88: 02005821 addu r11,r16,r0          |AI data pointer
                                            @LOOP - through all tiles to set tile flag in 0x0a74 
00194b8c: 92020e3b lbu r2,0x0e3b(r16)           |Map Max Y
00194b90: 00000000 nop                          |
00194b94: 18400040 blez r2,0x00194c98           #If Max Y is invalid : Branch to   Next elevation iteration
00194b98: 00003821 addu r7,r0,r0                |Initialize Y counter
00194b9c: 000a6200 sll r12,r10,0x08             |Elevation Offset in Tiles Data (0 or 0x100)
00194ba0: 01606821 addu r13,r11,r0              |AI data pointer
                                                @LOOP through Y rows
00194ba4: 92040e3a lbu r4,0x0e3a(r16)               |Map Max X
00194ba8: 00000000 nop                              |
00194bac: 10800035 beq r4,r0,0x00194c84             #If Max X is invalid : Branch to   Next Y iteration
00194bb0: 00003021 addu r6,r0,r0                    |Initialize X counter
00194bb4: 25a30a74 addiu r3,r13,0x0a74              |AI Pointer to Table of reachable tiles flag
00194bb8: 00071040 sll r2,r7,0x01                   |Y counter * 2 (Halfword for each Y row)
00194bbc: 00434821 addu r9,r2,r3                    |Pointer to this Y row data (0x0a74 table)
00194bc0: 00e40018 mult r7,r4                       |
                                                    @LOOP through each tiles of the row
00194bc4: 8e0517f8 lw r5,0x17f8(r16)                    |Acting Unit's Data data pointer
00194bc8: 00000000 nop                                  |
00194bcc: 90a30094 lbu r3,0x0094(r5)                    |Acting Unit Movement 2
00194bd0: 3c048019 lui r4,0x8019                        |
00194bd4: 2484f8cc addiu r4,r4,0xf8cc                   |Tiles data pointer
00194bd8: 30630008 andi r3,r3,0x0008                    |Check [Teleport]
00194bdc: 00001012 mflo r2                              |Y*Max X
00194be0: 01821021 addu r2,r12,r2                       |Y*Max X + Elevation offset
00194be4: 00461021 addu r2,r2,r6                        |This iteration Tile ID Y*MaxX + X + Elevation offset
00194be8: 000210c0 sll r2,r2,0x03                       |Tile's ID * 8 Tile Offset in Tile's data
00194bec: 10600017 beq r3,r0,0x00194c4c                 #If Acting Unit can teleport
00194bf0: 00442021 addu r4,r2,r4                        |This iteration Tile data pointer
00194bf4: 90a20182 lbu r2,0x0182(r5)                        |Load Mount Data
00194bf8: 00000000 nop                                      |
00194bfc: 30420080 andi r2,r2,0x0080                        |Check [Is Riding]
00194c00: 14400012 bne r2,r0,0x00194c4c                     #If Unit is not Riding
00194c04: 00000000 nop                                          |
                                                        Teleport is active
00194c08: 92020e30 lbu r2,0x0e30(r16)                           |Acting Unit X coord
00194c0c: 00000000 nop                                          |
00194c10: 00464023 subu r8,r2,r6                                |Delta X (Acting Unit - This iteration tile)
00194c14: 05010002 bgez r8,0x00194c20                           #If delta X is negative
00194c18: 00000000 nop                                              |
00194c1c: 00084023 subu r8,r0,r8                                    |Make delta X positive
00194c20: 92020e32 lbu r2,0x0e32(r16)                           |Acting Unit Y
00194c24: 00000000 nop                                          |
00194c28: 00472823 subu r5,r2,r7                                |Delta Y (Acting unit - This iteration tile)
00194c2c: 04a10002 bgez r5,0x00194c38                           #If delta Y is negative
00194c30: 00000000 nop                                              |
00194c34: 00052823 subu r5,r0,r5                                    |Make delta Y positive
00194c38: 92030e38 lbu r3,0x0e38(r16)                           |Acting Unit Move
00194c3c: 01051021 addu r2,r8,r5                                |This Tile's distance to Acting unit
00194c40: 0062182a slt r3,r3,r2                                 |Check if reachable
00194c44: 1460000a bne r3,r0,0x00194c70                         #if Unit teleport and tile is in move range, branch to  Next Tile iteration 
00194c48: 00000000 nop                                          |
                                                        No Teleport - Teleport but beyond reach
00194c4c: 90820005 lbu r2,0x0005(r4)                        |Tile's Targeting data
00194c50: 00000000 nop                                      |
00194c54: 30420020 andi r2,r2,0x0020                        |check [0x20] - Reachable tile flag
00194c58: 10400005 beq r2,r0,0x00194c70                     #If Tile is set as reachable (pathfinding result)
00194c5c: 34028000 ori r2,r0,0x8000                             |Prepare bitmask
00194c60: 95230000 lhu r3,0x0000(r9)                            |This Row hallword (AI 0x0a74)
00194c64: 00c21007 srav r2,r2,r6                                |Bitmask for this Tile
00194c68: 00621825 or r3,r3,r2                                  |Enable this tile flag
00194c6c: a5230000 sh r3,0x0000(r9)                             |Store New flags (this tile enabled)
00194c70: 92040e3a lbu r4,0x0e3a(r16)                   |Map max X
00194c74: 24c60001 addiu r6,r6,0x0001                   |X counter +1
00194c78: 00c4102a slt r2,r6,r4                         |Check if next X is in map
00194c7c: 1440ffd1 bne r2,r0,0x00194bc4             Λ Loop While X counter is valid
00194c80: 00e40018 mult r7,r4                           |Y*MapX
00194c84: 92020e3b lbu r2,0x0e3b(r16)               |Map Max Y
00194c88: 24e70001 addiu r7,r7,0x0001               |Y counter +1
00194c8c: 00e2102a slt r2,r7,r2                     |Check if next Y is valid
00194c90: 1440ffc4 bne r2,r0,0x00194ba4         Λ Loop While Y counter is valid
00194c94: 00000000 nop                              |
00194c98: 254a0001 addiu r10,r10,0x0001         |Elevation counter +1
00194c9c: 29420002 slti r2,r10,0x0002           |Check limit
00194ca0: 1440ffba bne r2,r0,0x00194b8c     Λ Loop 2 times (each elevation)
00194ca4: 256b0024 addiu r11,r11,0x0024         |AI data pointer + elevation offset For 0x0a74 table
00194ca8: 00004021 addu r8,r0,r0            |Initialize unit counter
00194cac: 340900ff ori r9,r0,0x00ff         |
00194cb0: 34078000 ori r7,r0,0x8000         |Prep bitmask
00194cb4: 3c068019 lui r6,0x8019            |
00194cb8: 24c608cc addiu r6,r6,0x08cc       |Pointer to start of unit data
                                            @LOOP - Through all units
00194cbc: 90c20001 lbu r2,0x0001(r6)            |Unit ID
00194cc0: 00000000 nop                          |
00194cc4: 1049001a beq r2,r9,0x00194d30         #If Unit don't exist : branch  to next unit iteration
00194cc8: 00000000 nop                              |
00194ccc: 92020e2e lbu r2,0x0e2e(r16)           |Acting unit ID
00194cd0: 00000000 nop                          |
00194cd4: 11020016 beq r8,r2,0x00194d30         #If Unit is acting unit : branch  to next unit iteration
00194cd8: 00000000 nop                              |
00194cdc: 94c20058 lhu r2,0x0058(r6)            |Load this iteration unit Current Status 1 and 2
00194ce0: 00000000 nop                          |
00194ce4: 30420140 andi r2,r2,0x0140            |Check [Crystal] and [Treasure]
00194ce8: 14400011 bne r2,r0,0x00194d30         #If unit is not a crystal nor a treasure
00194cec: 00000000 nop                              |
00194cf0: 94c20048 lhu r2,0x0048(r6)                |Unit Y and elevatio
00194cf4: 90c50048 lbu r5,0x0048(r6)                |Unit Y Coord
00194cf8: 90c40047 lbu r4,0x0047(r6)                |Unit X Coord
00194cfc: 000213c2 srl r2,r2,0x0f                   |Shift elevation flag to 0x01
00194d00: 000218c0 sll r3,r2,0x03                   |Elevation * 8
00194d04: 00621821 addu r3,r3,r2                    |Elevation * 9
00194d08: 00031880 sll r3,r3,0x02                   |Elevation * 0x24
00194d0c: 00701821 addu r3,r3,r16                   |8019f3c4 + elevation offset
00194d10: 24630a74 addiu r3,r3,0x0a74               |Pointer to Reachable tile flag Table + elevation offset
00194d14: 00052840 sll r5,r5,0x01                   |Y*2
00194d18: 00a32821 addu r5,r5,r3                    |Pointer to Reachable tile flag Table + elevation and Y row offset
00194d1c: 00872007 srav r4,r7,r4                    |Shift 0x8000 by X coordinate
00194d20: 94a20000 lhu r2,0x0000(r5)                |Load This iteration Unit's, Y row halfword of flags
00194d24: 00042027 nor r4,r0,r4                     |All flags but the unit one
00194d28: 00441024 and r2,r2,r4                     |
00194d2c: a4a20000 sh r2,0x0000(r5)                 |Disable unit's tile reachable flag
00194d30: 25080001 addiu r8,r8,0x0001           |Unit counter + 1
00194d34: 29020015 slti r2,r8,0x0015            |check unit limit
00194d38: 1440ffe0 bne r2,r0,0x00194cbc     Λ Loop through all units
00194d3c: 24c601c0 addiu r6,r6,0x01c0           |Unit Battle stat offset
00194d40: 92030e31 lbu r3,0x0e31(r16)       |Acting Unit elevation
00194d44: 92040e32 lbu r4,0x0e32(r16)       |Active unit Y
00194d48: 92050e30 lbu r5,0x0e30(r16)       |Active unit X
00194d4c: 000310c0 sll r2,r3,0x03           |
00194d50: 00431021 addu r2,r2,r3            |
00194d54: 00021080 sll r2,r2,0x02           |Elevation * 0x24
00194d58: 00501021 addu r2,r2,r16           |
00194d5c: 24420a74 addiu r2,r2,0x0a74       |Pointer to Reachable tile flag Table + elevation offset
00194d60: 00042040 sll r4,r4,0x01           |
00194d64: 00822021 addu r4,r4,r2            |Pointer to Reachable tile flag Table + elevation and Y row offset
00194d68: 34038000 ori r3,r0,0x8000         |Prep bitmask
00194d6c: 94820000 lhu r2,0x0000(r4)        |Load Acting Unit's, Y row halfword of flags
00194d70: 00a31807 srav r3,r3,r5            |
00194d74: 00431025 or r2,r2,r3              |
00194d78: a4820000 sh r2,0x0000(r4)         |Enable acting unit's tile reachable flag
00194d7c: 8e0217f8 lw r2,0x17f8(r16)        |Load Acting Unit Data
00194d80: 3c030008 lui r3,0x0008            |
00194d84: 8c420058 lw r2,0x0058(r2)         |Load Current Statuses 1-4
00194d88: 34631000 ori r3,r3,0x1000         |0x00081000
00194d8c: 00431024 and r2,r2,r3             |Check [Confusion] and [Berserk]
00194d90: 1440002b bne r2,r0,0x00194e40     #If Acting unit is Confuse/Berserk :   Exit routine and returns 0x00 
00194d94: 00001021 addu r2,r0,r0                |r2 = 0x00

                                            Else - not confuse nor berserk
00194d98: 00004021 addu r8,r0,r0                |Initialize counter
00194d9c: 340900ff ori r9,r0,0x00ff             |
00194da0: 34078000 ori r7,r0,0x8000             |
00194da4: 3406181c ori r6,r0,0x181c             |
                                                @LOOP
00194da8: 02062021 addu r4,r16,r6                   |Pointer to AI ? (some coordinates data) 8019f3c4 + 0x181c + 0x04 Each iteration
00194dac: 90850000 lbu r5,0x0000(r4)                |Load ? X coordinates
00194db0: 00000000 nop                              |
00194db4: 10a90012 beq r5,r9,0x00194e00             #If Entry is invalid (0xff) : branch  Exit Loop
00194db8: 24c60004 addiu r6,r6,0x0004                   |0x181c offset counter + 4
00194dbc: 25080001 addiu r8,r8,0x0001                   |Existing unit counter + 1
00194dc0: 90830001 lbu r3,0x0001(r4)                    |Load Unit Elevation
00194dc4: 90840002 lbu r4,0x0002(r4)                    |Load Unit Y
00194dc8: 000310c0 sll r2,r3,0x03                       |
00194dcc: 00431021 addu r2,r2,r3                        |
00194dd0: 00021080 sll r2,r2,0x02                       |Elevation * 0x24
00194dd4: 00501021 addu r2,r2,r16                       |
00194dd8: 24420a74 addiu r2,r2,0x0a74                   |Pointer to Reachable tile flag Table + elevation offset
00194ddc: 00042040 sll r4,r4,0x01                       |
00194de0: 00822021 addu r4,r4,r2                        |Pointer to Reachable tile flag Table + elevation and Y row offset
00194de4: 00a71007 srav r2,r7,r5                        |Bitmask Tile flag
00194de8: 94830000 lhu r3,0x0000(r4)                    |Load this Tile Row flags
00194dec: 00021027 nor r2,r0,r2                         |Everything but tile flag
00194df0: 00621824 and r3,r3,r2                         |
00194df4: 29020004 slti r2,r8,0x0004                |Check limit
00194df8: 1440ffeb bne r2,r0,0x00194da8         Λ Loop 4 Times (4 coordinates ?)
00194dfc: a4830000 sh r3,0x0000(r4)                 |Disable this tile reachable flag
00194e00: 00001021 addu r2,r0,r0                | 
00194e04: 92040e31 lbu r4,0x0e31(r16)           |Acting Unit Elevation
00194e08: 92050e32 lbu r5,0x0e32(r16)           |Acting Unit Y Coord
00194e0c: 92060e30 lbu r6,0x0e30(r16)           |Acting Unit X Coord
00194e10: 000418c0 sll r3,r4,0x03               |
00194e14: 00641821 addu r3,r3,r4                |
00194e18: 00031880 sll r3,r3,0x02               |Elevation * 0x24
00194e1c: 00701821 addu r3,r3,r16               |
00194e20: 24630a74 addiu r3,r3,0x0a74           |Pointer to Reachable tile flag Table + elevation offset
00194e24: 00052840 sll r5,r5,0x01               |
00194e28: 00a32821 addu r5,r5,r3                |Pointer to Reachable tile flag Table + elevation and Y row offset
00194e2c: 34048000 ori r4,r0,0x8000             |
00194e30: 94a30000 lhu r3,0x0000(r5)            |Load Row of tiles flag
00194e34: 00c42007 srav r4,r4,r6                |
00194e38: 00641825 or r3,r3,r4                  |
00194e3c: a4a30000 sh r3,0x0000(r5)             |Enable acting unit's tile reachable flag Again ? 
00194e40: 8fbf0038 lw r31,0x0038(r29)       END
00194e44: 8fb10034 lw r17,0x0034(r29)
00194e48: 8fb00030 lw r16,0x0030(r29)
00194e4c: 27bd0040 addiu r29,r29,0x0040
00194e50: 03e00008 jr r31
00194e54: 00000000 nop

Notes

If AI 0x19b7  = 0x00 : initialize some movement data              ( 0x801a0d7b )
 - Set 0x19b9 (water movement penality)                           ( 0x801a0d7d )
 - Reset AI 0x0C24 Table (Walkable tile flag)
 - Set AI 0x0C24 Table flags (0x1 if not unselectable nor a cross section)
 - Nullify 0x0e2d (seems to be some offset for Table 0x0a74 (size is 0x48 bytes)
 - Reset AI 0x0A74 Table (reachable Tiles)
 - If Unit can't move/has moved : set Acting unit Tile flag to 1 in 0x0a74 Table and returns 0x00
 - If Unit can move : Set reachable tile flag - Byte 0x05 flag 0x20 (via heavy pathfinding routines)  
                      Go in 0x19b7 != 0x00 Section

If AI 0x19b7 != 0x00  
 - Exit if 0001dba8 returns r2 > 0x1b8
 - Else :
     - Reset 0x19b7 (this is just preventing some infinite loop due to 0001dba8 ?)
     - Enable Tile flag in AI Table 0xa74 if Tile is reachable (byte 0x05 flag 0x20) 
     Note : Unit using teleport seems to not use this table and skip the section
     - Disable Tile flag (Table 0x0a74) if there is another living unit on tile 
     - Enable acting Unit Tile's flag (0xa74)
     - Exit if acting unit has berserk or confuse
     - Else :
       - Disable Tile's flag is the tile is present in 0x181c List (4 words for 4 coordinates. Don't know which one yet)
       - Enable acting Unit Tile's flag (0xa74) (? force flag even if tile is in above list)

Return location

Battle.bin
00194070: Main_AI_action_setup