Difference between revisions of "Evaluate Linear Ability Behaviors"

From Final Fantasy Hacktics Wiki
Jump to navigation Jump to search
(Created)
 
 
Line 1: Line 1:
Primarily used by [[Find Highest Target Priority in Ability Range (0019bf2c)]]
+
'''BATTLE.BIN''' :  - Evaluate_Linear_Ability_Behaviors
 
+
Set Flags and count Enabled Tiles in AI 0xbdc and AI 0xb94 (Seems to be Table of Tiles from where you can hit a unit and Table of Tiles you can hit)
This routine also contains minor routines for Water Movement, Elemental and Jump
+
------------------------------------------------------------------------------------------
 
+
Parameter : Nothing
  0019c3d4: 27bdff90 addiu r29,r29,0xff90
+
Return : Nothing
  0019c3d8: afb1004c sw r17,0x004c(r29)
+
------------------------------------------------------------------------------------------
  0019c3dc: 00008821 addu r17,r0,r0
+
  0019c3d4: 27bdff90 addiu r29,r29,-0x0070    |
  0019c3e0: afb5005c sw r21,0x005c(r29)
+
  0019c3d8: afb1004c sw r17,0x004c(r29)       |
  0019c3e4: 3c15801a lui r21,0x801a
+
  0019c3dc: 00008821 addu r17,r0,r0           |{{f/std|Initialize Y counter}}
  0019c3e8: 26b5f3c4 addiu r21,r21,0xf3c4
+
  0019c3e0: afb5005c sw r21,0x005c(r29)       |
  0019c3ec: 02a01821 addu r3,r21,r0
+
  0019c3e4: 3c15801a lui r21,0x801a           |
  0019c3f0: afbf006c sw r31,0x006c(r29)
+
  0019c3e8: 26b5f3c4 addiu r21,r21,-0x0c3c    |{{f/adr|0x8019f3c4}}
  0019c3f4: afbe0068 sw r30,0x0068(r29)
+
  0019c3ec: 02a01821 addu r3,r21,r0           |{{f/adr|Prepare dynamic pointer to AI Data (1 halfword each iteration)}}
  0019c3f8: afb70064 sw r23,0x0064(r29)
+
  0019c3f0: afbf006c sw r31,0x006c(r29)       |
  0019c3fc: afb60060 sw r22,0x0060(r29)
+
  0019c3f4: afbe0068 sw r30,0x0068(r29)       |
  0019c400: afb40058 sw r20,0x0058(r29)
+
  0019c3f8: afb70064 sw r23,0x0064(r29)       |
  0019c404: afb30054 sw r19,0x0054(r29)
+
  0019c3fc: afb60060 sw r22,0x0060(r29)       |
  0019c408: afb20050 sw r18,0x0050(r29)
+
  0019c400: afb40058 sw r20,0x0058(r29)       |
  0019c40c: afb00048 sw r16,0x0048(r29)
+
  0019c404: afb30054 sw r19,0x0054(r29)       |
 +
  0019c408: afb20050 sw r18,0x0050(r29)       |
 +
  0019c40c: afb00048 sw r16,0x0048(r29)       |
 +
                                            {{f/bloop|LOOP - AI Table 0x0bdc}}
 +
0019c410: a4600bdc sh r0,0x0bdc(r3)              |{{f/store|Initialize 0xbdc}}
 +
0019c414: a4600c00 sh r0,0x0c00(r3)              |{{f/store|Initialize 0xc00}} {{f/std|High Elevation}}
 +
0019c418: 26310001 addiu r17,r17,0x0001          |{{f/std|Counter +1}}
 +
0019c41c: 2a220012 slti r2,r17,0x0012            |
 +
0019c420: 1440fffb bne r2,r0,0x0019c410      {{f/eloop|Loop 0x12 times (whole table)}}
 +
0019c424: 24630002 addiu r3,r3,0x0002            |{{f/adr|Dynamic Pointer to AI data (+1 halfword each iteration)}}
 +
0019c428: 8ea2000c lw r2,0x000c(r21)        |{{f/load|Load considered AI Ability Behavior Flags 1-4}}
 +
0019c42c: 3c030080 lui r3,0x0080            |
 +
0019c430: 00431024 and r2,r2,r3              |
 
   
 
   
  0019c410: a4600bdc sh r0,0x0bdc(r3)
+
  {{f/sec|Set AI 0x0b94 Table - Reachable Tiles (with proximity conditions based on 0xe2d, Ability Range condition, Ability Usability conditions)}}
0019c414: a4600c00 sh r0,0x0c00(r3)
+
  0019c434: 1040000b beq r2,r0,0x0019c464     {{f/Cond|If Ability has [Longbow Attack]}} {{f/std| AI behavior 0x03 Flag 0x80}}
0019c418: 26310001 addiu r17,r17,0x0001
+
  0019c438: 26a40b94 addiu r4,r21,0x0b94           |{{f/std|0x8019f3c4 + 0xb94}}
0019c41c: 2a220012 slti r2,r17,0x0012
+
  0019c43c: 92a20e2d lbu r2,0x0e2d(r21)           |{{f/load|AI 0xe2d}}
0019c420: 1440fffb bne r2,r0,0x0019c410
+
  0019c440: 34060048 ori r6,r0,0x0048             |{{f/std|Size of Data to transfer in routine below}}
0019c424: 24630002 addiu r3,r3,0x0002
+
  0019c444: 000228c0 sll r5,r2,0x03               |
 
+
  0019c448: 00a22821 addu r5,r5,r2                 |
0019c428: 8ea2000c lw r2,0x000c(r21) Load AI Ability Behavior Flags 1-4
+
  0019c44c: 000528c0 sll r5,r5,0x03               |{{f/std|0xe2d * 0x48}}
0019c42c: 3c030080 lui r3,0x0080
+
  0019c450: 24a50a74 addiu r5,r5,0x0a74           |
0019c430: 00431024 and r2,r2,r3
+
  0019c454: 0c066ac2 jal 0x0019ab08               |{{f/jal|Transfer Halfword Values|Transfer Halfword Values}} {{f/std|Copy data from AI 0xa74 (based on 0xe2d) to AI 0xb94}}
  0019c434: 1040000b beq r2,r0,0x0019c464 Branch if not Ignore Range
+
  0019c458: 02a52821 addu r5,r21,r5               |{{f/adr|Pointer to AI 0xa74  + 0xe2d offset}}
  0019c438: 26a40b94 addiu r4,r21,0x0b94
+
  0019c45c: 080671c3 j 0x0019c70c                 {{f/jump|Jump to}} {{f/loc| AI 0x0bdc section}}
  0019c43c: 92a20e2d lbu r2,0x0e2d(r21)
+
  0019c460: 0000a021 addu r20,r0,r0               |
  0019c440: 34060048 ori r6,r0,0x0048
+
                                              '''Else : Not [Longbow Attack]'''
  0019c444: 000228c0 sll r5,r2,0x03
+
  0019c464: 0000a021 addu r20,r0,r0               |{{f/std|Initialize Unit counter}}
  0019c448: 00a22821 addu r5,r5,r2
+
  0019c468: 02b41021 addu r2,r21,r20               |{{f/adr|Dynamic pointer to AI data (1 byte per iteration/unit)}}
  0019c44c: 000528c0 sll r5,r5,0x03
+
                                                {{f/bloop|LOOP - All Units}}
  0019c450: 24a50a74 addiu r5,r5,0x0a74
+
  0019c46c: 90420c8d lbu r2,0x0c8d(r2)                 |{{f/load|This unit potential Target flag}}
  0019c454: 0c066ac2 jal 0x0019ab08 Transfer Halfword Values
+
  0019c470: 00000000 nop                               |
  0019c458: 02a52821 addu r5,r21,r5
+
  0019c474: 1040001d beq r2,r0,0x0019c4ec             {{f/Cond|If This unit is not a potential target branch to }} {{f/loc|Next Unit}}
  0019c45c: 080671c3 j 0x0019c70c Jump to <Evaluate Linear with AoE>
+
  0019c478: 02802021 addu r4,r20,r0                   |{{f/std|Send Unit ID}}
  0019c460: 0000a021 addu r20,r0,r0
+
0019c47c: 0c067ca9 jal 0x0019f2a4                    |{{f/jal|Transfer Unit Coordinates to AI|Transfer Unit Coordinates to AI}} {{f/std|Store this Unit coordinates on AI 0x0c74}}
 
+
0019c480: 26a50c74 addiu r5,r21,0x0c74              |{{f/std|Send Pointer}}
<Evaluate Linear With Range>
+
0019c484: 92a30026 lbu r3,0x0026(r21)                |{{f/load|This Ability Targeting Type (Target or Tile)}} {{f/std| 8019f3c4 + 0x26}}
  0019c464: 0000a021 addu r20,r0,r0
+
0019c488: 34020006 ori r2,r0,0x0006                  |
  0019c468: 02b41021 addu r2,r21,r20
+
0019c48c: 14620002 bne r3,r2,0x0019c498              {{f/Cond|<nowiki>If AI 0x26 = 0x06 (Target specific ?)</nowiki>}}
  0019c46c: 90420c8d lbu r2,0x0c8d(r2) Load Targetablity List
+
0019c490: 34040002 ori r4,r0,0x0002                  |{{f/std|Not Target Specific checks both Range and AoE}}
  0019c470: 00000000 nop
+
0019c494: 00002021 addu r4,r0,r0                        |{{f/std|Target specifc Ability Checks just Range}}
  0019c474: 1040001d beq r2,r0,0x0019c4ec Branch if unit is not on the list
+
0019c498: 0c06723b jal 0x0019c8ec                    |{{f/jal|Check_if_Linear_Ability_hits_anything_(0019c8ec)|Check_if_Linear_Ability_hits_anything_(0019c8ec)}} {{f/std| Enable Tile hit by Ability in AI Table 0xb4c (Tile from where you can hit someone with considered Ability ?)}}
  0019c478: 02802021 addu r4,r20,r0
+
0019c49c: 00002821 addu r5,r0,r0                    |{{f/std|<nowiki>Preset Range = 0x00 (unused with r4 values)</nowiki>}}
 
   
 
   
  0019c47c: 0c067ca9 jal 0x0019f2a4 Transfer Unit Coordinates to AI
+
  0019c4a0: 92a20e3b lbu r2,0x0e3b(r21)                |{{f/load|Load Max Y}}
  0019c480: 26a50c74 addiu r5,r21,0x0c74
+
0019c4a4: 00000000 nop                              |
  0019c484: 92a30026 lbu r3,0x0026(r21)
+
0019c4a8: 18400010 blez r2,0x0019c4ec                {{f/Cond|If Max Y is invalid }} {{f/loc|Avoid loop}}
  0019c488: 34020006 ori r2,r0,0x0006
+
0019c4ac: 00008821 addu r17,r0,r0                    |{{f/std|initialize Y counter}}
  0019c48c: 14620002 bne r3,r2,0x0019c498 Jump to Linear Ability if (0xf3ea) =/= 0x06
+
0019c4b0: 02a03021 addu r6,r21,r0                    |{{f/adr|8019f3c4}}
  0019c490: 34040002 ori r4,r0,0x0002 Linear Ability checks both Range and AoE
+
                                                    {{f/bloop|Loop - Copy from AI 0xb4c to 0xbdc (preserve previous values)}}
 +
0019c4b4: 26310001 addiu r17,r17,0x0001                  |{{f/std|Y counter + 1}}
 +
0019c4b8: 94c20bdc lhu r2,0x0bdc(r6)                    |{{f/load|This iteration AI 0xbdc Low elevation Y row}}
 +
0019c4bc: 94c40b4c lhu r4,0x0b4c(r6)                    |{{f/load|This iteration AI 0xb4c Low elevation Y row}}
 +
0019c4c0: 94c30c00 lhu r3,0x0c00(r6)                    |{{f/load|This iteration AI 0xbdc High elevation Y row}}
 +
0019c4c4: 94c50b70 lhu r5,0x0b70(r6)                    |{{f/load|This iteration AI 0xb4c High elevation Y row}}
 +
0019c4c8: 00441025 or r2,r2,r4                          |
 +
0019c4cc: 00651825 or r3,r3,r5                          |
 +
0019c4d0: a4c20bdc sh r2,0x0bdc(r6)                      |{{f/store|Enable AI 0xb4c flags in AI 0xbdc Table}}
 +
0019c4d4: a4c30c00 sh r3,0x0c00(r6)                      |{{f/store|Enable AI 0xb4c flags in AI 0xbdc Table}} {{f/std|High elevation}}
 +
0019c4d8: 92a20e3b lbu r2,0x0e3b(r21)                    |{{f/load|Load Max Y}}
 +
0019c4dc: 00000000 nop                                  |
 +
0019c4e0: 0222102a slt r2,r17,r2                        |
 +
0019c4e4: 1440fff3 bne r2,r0,0x0019c4b4              {{f/eloop|Loop while Y < Max Y}}
 +
0019c4e8: 24c60002 addiu r6,r6,0x0002                    |{{f/std|Halfword offset for Ai Table}}
 +
0019c4ec: 26940001 addiu r20,r20,0x0001              |{{f/std|Unit counter + 1}}
 +
0019c4f0: 2a820015 slti r2,r20,0x0015                |
 +
0019c4f4: 1440ffdd bne r2,r0,0x0019c46c          {{f/eloop|Loop for all units}}
 +
0019c4f8: 02b41021 addu r2,r21,r20                  |{{f/adr|Dynamic pointer to AI data (1 byte per iteration/unit)}}
 +
0019c4fc: 92a20e3b lbu r2,0x0e3b(r21)            |{{f/load|Load Max Y}}
 +
0019c500: 00000000 nop                          |
 +
0019c504: 18400021 blez r2,0x0019c58c            {{f/Cond|If Max Y is invalid : }} {{f/loc|Avoid Loop}}
 +
0019c508: 00008821 addu r17,r0,r0                |
 +
0019c50c: 02a02821 addu r5,r21,r0                |
 +
                                                {{f/bloop|LOOP - Set AI 0x0b94 flags}}
 +
0019c510: 92a30e2d lbu r3,0x0e2d(r21)                |{{f/load|AI 0x0e2d}}
 +
0019c514: 00112040 sll r4,r17,0x01                  |
 +
0019c518: 000310c0 sll r2,r3,0x03                    |
 +
0019c51c: 00431021 addu r2,r2,r3                    |
 +
0019c520: 000210c0 sll r2,r2,0x03                    |{{f/std|0xe2d offset (0x48)}}
 +
  0019c524: 02a21021 addu r2,r21,r2                    |
 +
0019c528: 00821021 addu r2,r4,r2                    |{{f/adr|Dynamic 8019f3c4 + 0xe2d offset (1 halfword per iteration)}}
 +
0019c52c: 94420a74 lhu r2,0x0a74(r2)                |{{f/load|Load this Y iteration flags in Reachable tiles table(based on 0xe2d)}} {{f/std|low elevation}}
 +
0019c530: 94a30bdc lhu r3,0x0bdc(r5)                |{{f/load|Load this Y flags }} {{f/std|low elevation}}
 +
0019c534: 00000000 nop                              |
 +
0019c538: 00431024 and r2,r2,r3                      |
 +
0019c53c: a4a20b94 sh r2,0x0b94(r5)                  |{{f/store|Store in AI 0xb94 only the flags enabled in both AI 0xa74 and 0xbdc}} {{f/std|Move condition and allow to hit a unit}}
 +
0019c540: 92a30e2d lbu r3,0x0e2d(r21)                |
 +
0019c544: 00000000 nop                              |
 +
0019c548: 000310c0 sll r2,r3,0x03                    |
 +
0019c54c: 00431021 addu r2,r2,r3                    |
 +
0019c550: 000210c0 sll r2,r2,0x03                    |{{f/std|0xe2d offset (0x48)}}
 +
0019c554: 02a21021 addu r2,r21,r2                    |
 +
0019c558: 00822021 addu r4,r4,r2                    |{{f/adr|Dynamic 8019f3c4 + 0xe2d offset (1 halfword per iteration)}}
 +
0019c55c: 94820a98 lhu r2,0x0a98(r4)                |{{f/load|Load this Y iteration flags in Reachable tiles table(based on 0xe2d)}} {{f/std|high elevation}}
 +
0019c560: 94a30c00 lhu r3,0x0c00(r5)                |{{f/load|Load this Y flags }} {{f/std|high elevation}}
 +
0019c564: 26310001 addiu r17,r17,0x0001              |
 +
0019c568: a4a00bdc sh r0,0x0bdc(r5)                  |{{f/store|Reset AI 0xbdc}}
 +
0019c56c: a4a00c00 sh r0,0x0c00(r5)                  |{{f/store|Reset AI 0xbdc}} {{f/std|high elevation}}
 +
0019c570: 00431024 and r2,r2,r3                      |
 +
0019c574: a4a20bb8 sh r2,0x0bb8(r5)                  |{{f/store|Store in AI 0xb94 only the flags enabled in both AI 0xa74 and 0xbdc}} {{f/std|high elevation}}
 +
0019c578: 92a20e3b lbu r2,0x0e3b(r21)                |{{f/load|Load Max Y}}
 +
0019c57c: 00000000 nop                              |
 +
0019c580: 0222102a slt r2,r17,r2                    |
 +
0019c584: 1440ffe2 bne r2,r0,0x0019c510          {{f/eloop|Loop while Y < Max Y}}
 +
0019c588: 24a50002 addiu r5,r5,0x0002                |
 +
0019c58c: 00008821 addu r17,r0,r0                |{{f/std|Initialize Elevation counter}}
 +
0019c590: 341e8000 ori r30,r0,0x8000            |{{f/std|Prepare bitmask}}
 +
0019c594: 02a0b821 addu r23,r21,r0              |{{f/adr|Dynamic pointer to 0x8019f3c4 (+0x24 for high elevation)}}
 +
                                                {{f/bloop|LOOP - both elevation}}
 +
0019c598: 92a20e3b lbu r2,0x0e3b(r21)                |{{f/load|Load Max Y}}
 +
0019c59c: 00000000 nop                              |
 +
0019c5a0: 1840003b blez r2,0x0019c690                {{f/Cond|If Max Y is invalid : branch to }} {{f/loc|Next elevation}}
 +
0019c5a4: 00009021 addu r18,r0,r0                    |{{f/std|Initialize Y counter}}
 +
0019c5a8: 26f60b94 addiu r22,r23,0x0b94              |{{f/adr|Dynamic pointer to AI 0x0b94 (+0x2 per Y rows)}}
 +
                                                    {{f/bloop|LOOP - All Y rows}}
 +
0019c5ac: 96d40000 lhu r20,0x0000(r22)                  |{{f/load|Load this Y row AI 0x0b94 flags}}
 +
0019c5b0: 00000000 nop                                  |
 +
0019c5b4: 12800031 beq r20,r0,0x0019c67c                {{f/Cond|If This Row has no flags : branch to }} {{f/loc|Next Y row}}
 +
0019c5b8: 00000000 nop                                  |
 +
0019c5bc: 92a30e3a lbu r3,0x0e3a(r21)                    |{{f/load|Load Max X}}
 +
0019c5c0: 00000000 nop                                  |
 +
0019c5c4: 1060002d beq r3,r0,0x0019c67c                  {{f/Cond|if Max X is invalid : branch to }} {{f/loc|Next Y row}}
 +
0019c5c8: 00008021 addu r16,r0,r0                        |
 +
0019c5cc: 02c09821 addu r19,r22,r0                      |{{f/adr|Dynamic pointer to AI 0x0b94 (+0x2 per Y rows)}}
 +
0019c5d0: 02141004 sllv r2,r20,r16                      |{{f/std|Tile's Bit of interest is shifted at 0x8000}}
 +
                                                        {{f/bloop|LOOP - All tiles in this Y row}}
 +
0019c5d4: 30428000 andi r2,r2,0x8000                        |
 +
0019c5d8: 10400023 beq r2,r0,0x0019c668                      {{f/Cond|If This Tile Flag is disabled : branch to }} {{f/loc|Next Tile (keep flag ON)}}
 +
0019c5dc: 00000000 nop                                      |
 +
  0019c5e0: 92a219b9 lbu r2,0x19b9(r21)                        |{{f/load|Load Water Movement Flag}}
 +
0019c5e4: 00000000 nop                                      |
 +
0019c5e8: 1040000e beq r2,r0,0x0019c624                      {{f/Cond|If Acting Unit suffer water penalty}}
 +
0019c5ec: 02430018 mult r18,r3                                  |
 +
0019c5f0: 00111a00 sll r3,r17,0x08                              |
 +
0019c5f4: 00001012 mflo r2                                      |
 +
0019c5f8: 00501021 addu r2,r2,r16                                |
 +
0019c5fc: 00431021 addu r2,r2,r3                                 |{{f/std|Tile's ID (X + Y*Max X + 0x100 if high elevation)}}
 +
0019c600: 000210c0 sll r2,r2,0x03                                |{{f/std|8 bytes per tile ID}}
 +
0019c604: 3c018019 lui r1,0x8019                                |
 +
0019c608: 00220821 addu r1,r1,r2                                |
 +
0019c60c: 9022f8cf lbu r2,-0x0731(r1)                            |{{f/load|This Tile height + depth}} {{f/adr|8018f8cc + 0x03 + Tile's offset}}
 +
0019c610: 00000000 nop                                          |
 +
0019c614: 00021142 srl r2,r2,0x05                                |{{f/std|Keep only depth}}
 +
0019c618: 28420002 slti r2,r2,0x0002                            |
 +
0019c61c: 1040000e beq r2,r0,0x0019c658                          {{f/Cond|if Depth is 2 or more : branch and}} {{f/loc|Disable this tile}}
 +
0019c620: 00000000 nop                                          |
 +
                                                              '''Else : Water is not a problem (by Ability or depth)'''
 +
0019c624: 92a20000 lbu r2,0x0000(r21)                           |{{f/load|Considered Ability Skillset ID}}
 +
0019c628: 3c018006 lui r1,0x8006                                |
 +
0019c62c: 00220821 addu r1,r1,r2                                |
 +
0019c630: 90235cb4 lbu r3,0x5cb4(r1)                            |{{f/load|Considered skillset action menu}} {{f/adr|80065cb4 + Skillset offset}}
 +
  0019c634: 34020004 ori r2,r0,0x0004                              |
 +
  0019c638: 1462000b bne r3,r2,0x0019c668                          {{f/Cond|If Action Menu is not [Elements] : branch to }} {{f/loc|Next Tile (keep flag ON)}}
 +
0019c63c: 26a40c74 addiu r4,r21,0x0c74                          |{{f/adr|Pointer to AI 0xc74}}
 +
0019c640: a2b00c74 sb r16,0x0c74(r21)                            |{{f/store|Store X at AI 0xc74}}
 +
0019c644: a2b20c76 sb r18,0x0c76(r21)                            |{{f/store|Store Y at AI 0xc76}}
 +
0019c648: 0c066dd5 jal 0x0019b754                                |{{f/jal|See_if_elemental_ability_can_be_used|See_if_elemental_ability_can_be_used}} {{f/std|Check Terrain Type Vs Ability ID (from AI 0x02)}}
 +
0019c64c: a2b10c75 sb r17,0x0c75(r21)                            |{{f/store|Store elevation at AI 0xc75}}
 +
0019c650: 14400005 bne r2,r0,0x0019c668                          {{f/Cond|If considered Ability matches terrain type}} {{f/loc|Next Tile (keep flag ON)}}
 +
0019c654: 00000000 nop                                              |
 +
                                                              '''Else : Depth > 2 or Unusable geomancy ability'''
 +
0019c658: 96630000 lhu r3,0x0000(r19)                            |{{f/load|This Y rows flags}}
 +
0019c65c: 021e1007 srav r2,r30,r16                              |{{f/std|This tile bitmask}}
 +
0019c660: 00621826 xor r3,r3,r2                                  |
 +
0019c664: a6630000 sh r3,0x0000(r19)                            |{{f/store|Disable this tile in AI 0xb94}}
 +
0019c668: 92a30e3a lbu r3,0x0e3a(r21)                        |{{f/load|Max X}}
 +
0019c66c: 26100001 addiu r16,r16,0x0001                      |{{f/std|X counter +1}}
 +
0019c670: 0203102a slt r2,r16,r3                            |
 +
0019c674: 1440ffd7 bne r2,r0,0x0019c5d4                  {{f/eloop|Loop while X < Max X}}
 +
0019c678: 02141004 sllv r2,r20,r16                          |
 +
0019c67c: 92a20e3b lbu r2,0x0e3b(r21)                    |{{f/load|Max Y}}
 +
0019c680: 26520001 addiu r18,r18,0x0001                  |{{f/std|Y counter + 1}}
 +
0019c684: 0242102a slt r2,r18,r2                        |
 +
0019c688: 1440ffc8 bne r2,r0,0x0019c5ac              {{f/eloop|loop while Y < Max Y}}
 +
0019c68c: 26d60002 addiu r22,r22,0x0002                  |{{f/std|Y offset (+ 1 halfword each iteration)}}
 +
0019c690: 26310001 addiu r17,r17,0x0001              |{{f/std|Elevation + 1}}
 +
0019c694: 2a220002 slti r2,r17,0x0002                |
 +
0019c698: 1440ffbf bne r2,r0,0x0019c598          {{f/eloop|loop 2 times}}
 +
0019c69c: 26f70024 addiu r23,r23,0x0024              |{{f/std|Elevation Offset (+0x24 for high elevation)}}
 +
0019c6a0: 8ea2000c lw r2,0x000c(r21)            |{{f/load|Load AI Behavior Flags 1 to 4}}
 +
0019c6a4: 3c030800 lui r3,0x0800                |
 +
0019c6a8: 00431024 and r2,r2,r3                  |{{f/std| Flag 0x08 of AI 0x0f is a copy of Ability 0xef0 0x03 so this should be a monster skill check}}
 +
0019c6ac: 10400016 beq r2,r0,0x0019c708          {{f/Cond|If This Ability requires monster skill}}
 +
0019c6b0: 00000000 nop                              |
 +
0019c6b4: 0c0672e5 jal 0x0019cb94                    |{{f/jal|Some_height/Map_coordinate_calculation_for_all_units|Some_height/Map_coordinate_calculation_for_all_units}} {{f/std|Enable Tile Adjacent to an Ally with monster skill in AI 0xb4c}}
 +
0019c6b8: 00008821 addu r17,r0,r0                    |
 +
0019c6bc: 92a20e3b lbu r2,0x0e3b(r21)                |{{f/load|Max Y}}
 +
0019c6c0: 00000000 nop                              |
 +
0019c6c4: 18400010 blez r2,0x0019c708                {{f/Cond|if Max Y is Invalid : }} {{f/loc|Avoid loop}}
 +
0019c6cc: 02a03021 addu r6,r21,r0                    |{{f/adr|Dynamic pointer to 0x8019f3c4 (+1 halfword each oteration)}}
 +
                                                    {{f/bloop|LOOP}}
 +
0019c6d0: 26310001 addiu r17,r17,0x0001                  |{{f/std|Y counter + 1}}
 +
0019c6d4: 94c20b94 lhu r2,0x0b94(r6)                     |{{f/load|This Y row Flags from AI 0x0b94}}
 +
  0019c6d8: 94c40b4c lhu r4,0x0b4c(r6)                    |{{f/load|This Y row Flags from AI 0x0b4c}}
 +
0019c6dc: 94c30bb8 lhu r3,0x0bb8(r6)                    |{{f/load|This Y row Flags from AI 0x0b94}} {{f/std|high elevation}}
 +
0019c6e0: 94c50b70 lhu r5,0x0b70(r6)                    |{{f/load|This Y row Flags from AI 0x0b4c}} {{f/std|high elevation}}
 +
0019c6e4: 00441024 and r2,r2,r4                         |
 +
0019c6e8: 00651824 and r3,r3,r5                          |
 +
0019c6ec: a4c20b94 sh r2,0x0b94(r6)                      |{{f/store|Keep only the flags enabled in both Table in AI 0xb94}} {{f/std|high elevation}}
 +
0019c6f0: a4c30bb8 sh r3,0x0bb8(r6)                      |{{f/store|Keep only the flags enabled in both Table in AI 0xb94}} {{f/std|high elevation}}
 +
0019c6f4: 92a20e3b lbu r2,0x0e3b(r21)                    |
 +
0019c6f8: 00000000 nop                                  |{{f/std|Max Y}}
 +
0019c6fc: 0222102a slt r2,r17,r2                        |
 +
0019c700: 1440fff3 bne r2,r0,0x0019c6d0              {{f/eloop|Loop while Y < Max Y}}
 +
0019c704: 24c60002 addiu r6,r6,0x0002                   |
 +
0019c708: 0000a021 addu r20,r0,r0            |{{f/std|Initialize Unit Counter}}
 +
0019c70c: 02b41021 addu r2,r21,r20          |{{f/adr|Prepare dynamic pointer to 0x8019f3c4 (1 byte per iteration)}}
 
   
 
   
  0019c494: 00002021 addu r4,r0,r0 Linear Ability Checks just Range
+
  {{f/sec|Set AI 0xbdc Table - Targetable Tiles to Hit a Unit}}
  0019c498: 0c06723b jal 0x0019c8ec Check if Linear Ability Hits
+
                                            {{f/bloop|LOOP - All Units}}
  0019c49c: 00002821 addu r5,r0,r0 Preset Range = 0 (Not used in 0 mode anyways)
+
0019c710: 90420c8d lbu r2,0x0c8d(r2)            |{{f/load|Load This Unit Targetable flag in AI 0x0c8d}}
 
+
0019c714: 00000000 nop                          |
  0019c4a0: 92a20e3b lbu r2,0x0e3b(r21) Load Max Y
+
0019c718: 1040001d beq r2,r0,0x0019c790          {{f/Cond|If Unit is not a potential Target : branch to}} {{f/loc|Next unit}}
  0019c4a4: 00000000 nop
+
0019c71c: 02802021 addu r4,r20,r0                |{{f/std|Send Unit ID}}
  0019c4a8: 18400010 blez r2,0x0019c4ec Branch if negative
+
0019c720: 0c067ca9 jal 0x0019f2a4                |{{f/jal|Transfer Unit Coordinates to AI|Transfer Unit Coordinates to AI}} {{f/std|Store Unit coordinates on r5}}
  0019c4ac: 00008821 addu r17,r0,r0
+
0019c724: 26a50c74 addiu r5,r21,0x0c74          |{{f/adr|Send AI 0x0c74 pointer}}
  0019c4b0: 02a03021 addu r6,r21,r0
+
0019c728: 92a30026 lbu r3,0x0026(r21)            |{{f/load|Considered Ability Targeting type}}
  0019c4b4: 26310001 addiu r17,r17,0x0001
+
0019c72c: 34020006 ori r2,r0,0x0006              |
  0019c4b8: 94c20bdc lhu r2,0x0bdc(r6)
+
0019c730: 14620002 bne r3,r2,0x0019c73c          {{f/Cond|If Targeting type is 0x06 (Target specific)}}
  0019c4bc: 94c40b4c lhu r4,0x0b4c(r6)
+
0019c734: 34040001 ori r4,r0,0x0001              |{{f/std|Spread AoE if Tile specific Targeting}}
  0019c4c0: 94c30c00 lhu r3,0x0c00(r6)
+
0019c738: 34040003 ori r4,r0,0x0003                  |{{f/std|<nowiki>Spread Nothing (use r5 = 0x00) if Target specific</nowiki>}}
  0019c4c4: 94c50b70 lhu r5,0x0b70(r6)
+
  0019c73c: 0c06723b jal 0x0019c8ec               |{{f/jal|Check_if_Linear_Ability_hits_anything_(0019c8ec)|Check_if_Linear_Ability_hits_anything_(0019c8ec)}} {{f/std|Set AI 0xb4c flags}}
  0019c4c8: 00441025 or r2,r2,r4
+
  0019c740: 00002821 addu r5,r0,r0                 |{{f/std|Send 0x00}}
  0019c4cc: 00651825 or r3,r3,r5
+
  0019c744: 92a20e3b lbu r2,0x0e3b(r21)           |{{f/load|Load Max Y}}
  0019c4d0: a4c20bdc sh r2,0x0bdc(r6)
+
  0019c748: 00000000 nop                           |
  0019c4d4: a4c30c00 sh r3,0x0c00(r6)
+
  0019c74c: 18400010 blez r2,0x0019c790            {{f/Cond|If Max Y is invalid : branch to }} {{f/loc|Next Unit}}
  0019c4d8: 92a20e3b lbu r2,0x0e3b(r21)
+
  0019c750: 00008821 addu r17,r0,r0               |{{f/std|Initialize Y counter}}
  0019c4dc: 00000000 nop
+
  0019c754: 02a03021 addu r6,r21,r0               |{{f/adr|Prepare dynamic pointer to 0x8019f3c4 (1halfword per iteration)}}
  0019c4e0: 0222102a slt r2,r17,r2
+
                                                {{f/bloop|LOOP - Y rows in AI Tables}}
  0019c4e4: 1440fff3 bne r2,r0,0x0019c4b4
+
  0019c758: 26310001 addiu r17,r17,0x0001             |{{f/std|Unit Counter + 1}}
  0019c4e8: 24c60002 addiu r6,r6,0x0002
+
  0019c75c: 94c20bdc lhu r2,0x0bdc(r6)                 |{{f/load|This Y row Flags from AI 0x0bdc}}
  0019c4ec: 26940001 addiu r20,r20,0x0001
+
  0019c760: 94c40b4c lhu r4,0x0b4c(r6)                 |{{f/load|This Y row Flags from AI 0x0b4c}}
  0019c4f0: 2a820015 slti r2,r20,0x0015
+
  0019c764: 94c30c00 lhu r3,0x0c00(r6)                 |{{f/load|This Y row Flags from AI 0x0bdc}} {{f/std|high elevation}}
  0019c4f4: 1440ffdd bne r2,r0,0x0019c46c Loop for all units
+
  0019c768: 94c50b70 lhu r5,0x0b70(r6)                 |{{f/load|This Y row Flags from AI 0x0b4c}} {{f/std|high elevation}}
  0019c4f8: 02b41021 addu r2,r21,r20
+
  0019c76c: 00441025 or r2,r2,r4                       |
 
+
  0019c770: 00651825 or r3,r3,r5                       |
  0019c4fc: 92a20e3b lbu r2,0x0e3b(r21) Load Max Y
+
  0019c774: a4c20bdc sh r2,0x0bdc(r6)                 |{{f/store|Enable AI 0xb4c flags in AI Table 0xbdc}}
  0019c500: 00000000 nop
+
  0019c778: a4c30c00 sh r3,0x0c00(r6)                 |{{f/store|Enable AI 0xb4c flags in AI Table 0xbdc}} {{f/std|high elevation}}
  0019c504: 18400021 blez r2,0x0019c58c Branch if negative
+
  0019c77c: 92a20e3b lbu r2,0x0e3b(r21)               |{{f/load|Load Max Y}}
  0019c508: 00008821 addu r17,r0,r0
+
  0019c780: 00000000 nop                               |
  0019c50c: 02a02821 addu r5,r21,r0
+
  0019c784: 0222102a slt r2,r17,r2                     |
  0019c510: 92a30e2d lbu r3,0x0e2d(r21)
+
  0019c788: 1440fff3 bne r2,r0,0x0019c758          {{f/Cond|Loop while Y < Max Y}}
  0019c514: 00112040 sll r4,r17,0x01
+
  0019c78c: 24c60002 addiu r6,r6,0x0002               |{{f/std|Offset for AI Pointer (1 halword)}}
  0019c518: 000310c0 sll r2,r3,0x03
+
  0019c790: 26940001 addiu r20,r20,0x0001         |{{f/std|Unit counter +1}}
  0019c51c: 00431021 addu r2,r2,r3
+
  0019c794: 2a820015 slti r2,r20,0x0015           |
  0019c520: 000210c0 sll r2,r2,0x03
+
  0019c798: 1440ffdd bne r2,r0,0x0019c710      {{f/Cond|Loop for all units}}
  0019c524: 02a21021 addu r2,r21,r2
+
  0019c79c: 02b41021 addu r2,r21,r20               |{{f/std|Offset for AI pointer}}
  0019c528: 00821021 addu r2,r4,r2
+
  0019c7a0: 8ea2000c lw r2,0x000c(r21)         |{{f/load|Load AI Ability Behavior Flags 1-4}}
  0019c52c: 94420a74 lhu r2,0x0a74(r2)
+
  0019c7a4: 00000000 nop                       |
  0019c530: 94a30bdc lhu r3,0x0bdc(r5)
+
  0019c7a8: 30421000 andi r2,r2,0x1000        |
  0019c534: 00000000 nop
+
0019c7ac: 10400025 beq r2,r0,0x0019c844      {{f/Cond|if considered Ability has [Check CT/Target]}}
  0019c538: 00431024 and r2,r2,r3
+
0019c7b0: 00000000 nop                          |
  0019c53c: a4a20b94 sh r2,0x0b94(r5)
+
  0019c7b4: 0000a021 addu r20,r0,r0               |{{f/std|Initialize Unit counter}}
  0019c540: 92a30e2d lbu r3,0x0e2d(r21)
+
  0019c7b8: 34080005 ori r8,r0,0x0005              |{{f/std|Targeting type to check}}
  0019c544: 00000000 nop
+
  0019c7bc: 34078000 ori r7,r0,0x8000              |{{f/std|Prepare bitmask}}
  0019c548: 000310c0 sll r2,r3,0x03
+
  0019c7c0: 3c068019 lui r6,0x8019                |
  0019c54c: 00431021 addu r2,r2,r3
+
  0019c7c4: 24c608cc addiu r6,r6,0x08cc            |{{f/adr|Prepare dynamic pointer to Unit Battle data}}
  0019c550: 000210c0 sll r2,r2,0x03
+
                                                {{f/bloop|LOOP}}
  0019c554: 02a21021 addu r2,r21,r2
+
  0019c7c8: 02b41021 addu r2,r21,r20                  |{{f/adr|AI dynamic pointer (1 byte per unit)}}
  0019c558: 00822021 addu r4,r4,r2
+
  0019c7cc: 90420c8d lbu r2,0x0c8d(r2)                |{{f/load|This Unit Potential target flag}}
  0019c55c: 94820a98 lhu r2,0x0a98(r4)
+
0019c7d0: 00000000 nop                              |
  0019c560: 94a30c00 lhu r3,0x0c00(r5)
+
  0019c7d4: 10400017 beq r2,r0,0x0019c834              {{f/Cond|Is this unit is not a potential target : branch to }} {{f/loc|Next Unit}}
  0019c564: 26310001 addiu r17,r17,0x0001
+
  0019c7d8: 00c02821 addu r5,r6,r0                    |{{f/adr|This Unit Battle pointer}}
  0019c568: a4a00bdc sh r0,0x0bdc(r5)
+
  0019c7dc: 90c20058 lbu r2,0x0058(r6)                 |{{f/load|Load Current Status 1}}
  0019c56c: a4a00c00 sh r0,0x0c00(r5)
+
  0019c7e0: 92a30026 lbu r3,0x0026(r21)               |{{f/load|Considered Ability targeting type}}
  0019c570: 00431024 and r2,r2,r3
+
  0019c7e4: 00000000 nop                               |
  0019c574: a4a20bb8 sh r2,0x0bb8(r5)
+
0019c7e8: 10680003 beq r3,r8,0x0019c7f8              {{f/Cond|If Targeting type is not 0x05}}
  0019c578: 92a20e3b lbu r2,0x0e3b(r21)
+
  0019c7ec: 30420004 andi r2,r2,0x0004                    |
  0019c57c: 00000000 nop
+
  0019c7f0: 10400010 beq r2,r0,0x0019c834                  {{f/Cond|If This Unit is not Jumping : branch to }} {{f/loc|Next Unit (keep unit flag)}}
  0019c580: 0222102a slt r2,r17,r2
+
0019c7f4: 00000000 nop                                      |
  0019c584: 1440ffe2 bne r2,r0,0x0019c510
+
                                                      '''Else : If Targeting type is 0x05 or 0x06 but unit is not Jumping'''
  0019c588: 24a50002 addiu r5,r5,0x0002
+
0019c7f8: 94a30048 lhu r3,0x0048(r5)                     |{{f/load|Unit Y + Elevation}}
 
+
  0019c7fc: 90a40048 lbu r4,0x0048(r5)                     |{{f/load|Unit Y}}
  0019c58c: 00008821 addu r17,r0,r0
+
  0019c800: 00031bc2 srl r3,r3,0x0f                        |{{f/std|Unit Elevation}}
  0019c590: 341e8000 ori r30,r0,0x8000 r30 = 0x8000
+
  0019c804: 000310c0 sll r2,r3,0x03                       |
  0019c594: 02a0b821 addu r23,r21,r0 r23 = AI Data
+
  0019c808: 00431021 addu r2,r2,r3                         |
  0019c598: 92a20e3b lbu r2,0x0e3b(r21) Load Max Y
+
  0019c80c: 00021080 sll r2,r2,0x02                        |{{f/std|Elevation * 0x24}}
  0019c59c: 00000000 nop
+
  0019c810: 00551021 addu r2,r2,r21                       |
  0019c5a0: 1840003b blez r2,0x0019c690 Branch if negative
+
0019c814: 24420bdc addiu r2,r2,0x0bdc                    |
  0019c5a4: 00009021 addu r18,r0,r0
+
0019c818: 00042040 sll r4,r4,0x01                        |{{f/std|Y * 2}}
 +
  0019c81c: 00822021 addu r4,r4,r2                         |{{f/adr|Pointer to Unit AI 0x0bdc Y row}}
 +
  0019c820: 90a20047 lbu r2,0x0047(r5)                     |{{f/load|Load Unit X}}
 +
  0019c824: 94830000 lhu r3,0x0000(r4)                     |{{f/load|Unit Y row flags in AI 0x0bdcTable}}
 +
0019c828: 00471007 srav r2,r7,r2                        |{{f/std|Unit Tile Bitmask}}
 +
  0019c82c: 00621826 xor r3,r3,r2                          |
 +
  0019c830: a4830000 sh r3,0x0000(r4)                     |{{f/store|Disable Unit Tile's Flag in AI 0x0bdc}} {{f/std|Why ? }}
 +
  0019c834: 26940001 addiu r20,r20,0x0001              |{{f/std|Unit counter + 1}}
 +
  0019c838: 2a820015 slti r2,r20,0x0015                |
 +
0019c83c: 1440ffe2 bne r2,r0,0x0019c7c8          {{f/Cond|Loop for all units}}
 +
0019c840: 24c601c0 addiu r6,r6,0x01c0                |{{f/std|Battle data offset}}
 +
0019c844: 00008821 addu r17,r0,r0            |{{f/std|Initialize Elevation counter}}
 +
  0019c848: 02a03021 addu r6,r21,r0            |{{f/adr|Prepare Dynamic pointer to AI data}}
 +
                                            {{f/bloop|LOOP}}
 +
  0019c84c: 92a20e3b lbu r2,0x0e3b(r21)           |{{f/load|Load Max Y}}
 +
  0019c850: 00000000 nop                           |
 +
  0019c854: 1840000e blez r2,0x0019c890            {{f/Cond|If Max Y is invalid : branch to }} {{f/loc|Next elevation}}
 +
0019c858: 00009021 addu r18,r0,r0                |{{f/std|Initialize Y counter}}
 +
0019c85c: 24c40bdc addiu r4,r6,0x0bdc            |{{f/adr|Dynamic pointer to AI 0x0bdc}}
 +
0019c860: 24c50c24 addiu r5,r6,0x0c24            |{{f/adr|Dynamic pointer to AI 0x0c24}}
 +
                                                {{f/bloop|LOOP}}
 +
  0019c864: 94a20000 lhu r2,0x0000(r5)                |{{f/load|This Y row AI 0xc24 flags}}
 +
  0019c868: 24a50002 addiu r5,r5,0x0002               |{{f/std|Offset for AI 0xc24 pointer}}
 +
0019c86c: 94830000 lhu r3,0x0000(r4)                |{{f/load|This Y row AI 0xbdc flags}}
 +
  0019c870: 26520001 addiu r18,r18,0x0001              |{{f/std|Y counter +1}}
 +
  0019c874: 00621824 and r3,r3,r2                      |
 +
  0019c878: a4830000 sh r3,0x0000(r4)                  |{{f/store|Keep only flags in both Table in AI 0xbdc}} {{f/std|0xc24 is Valid Tiles flags (Not unselectable nor cross section)}}
 +
  0019c87c: 92a20e3b lbu r2,0x0e3b(r21)               |{{f/load|Max Y}}
 +
  0019c880: 00000000 nop                               |
 +
  0019c884: 0242102a slt r2,r18,r2                    |
 +
  0019c888: 1440fff6 bne r2,r0,0x0019c864          {{f/eloop|Loop while Y < Max Y}}
 +
0019c88c: 24840002 addiu r4,r4,0x0002                |{{f/std|Offset for AI 0xbdc pointer}}
 +
0019c890: 26310001 addiu r17,r17,0x0001              |
 +
0019c894: 2a220002 slti r2,r17,0x0002                |
 +
0019c898: 1440ffec bne r2,r0,0x0019c84c      {{f/eloop|Loop}}
 +
0019c89c: 24c60024 addiu r6,r6,0x0024            |{{f/std|Elevation offset}}
 
   
 
   
  0019c5a8: 26f60b94 addiu r22,r23,0x0b94
+
  0019c8a0: 0c065f1a jal 0x00197c68                |{{f/jal|Final Targeting Check|Final Targeting Check}} {{f/std|Count Tiles enabled in AI 0x0bdc}}
0019c5ac: 96d40000 lhu r20,0x0000(r22) r20 = ?
+
  0019c8a4: 26a40bdc addiu r4,r21,0x0bdc           |{{f/std|Send Pointer to AI 0x0bdc}}
0019c5b0: 00000000 nop
+
  0019c8a8: 26a40b94 addiu r4,r21,0x0b94           |{{f/std|Send Pointer to AI 0x0b94}}
0019c5b4: 12800031 beq r20,r0,0x0019c67c Skip Water/Elemental Eval if false
+
  0019c8ac: 0c065f1a jal 0x00197c68               |{{f/jal|Final Targeting Check|Final Targeting Check}} {{f/std|Count Tiles enabled in AI 0x0b94}}
0019c5b8: 00000000 nop
+
  0019c8b0: a2a20cbb sb r2,0x0cbb(r21)             |{{f/store|Store Nb of Tiles enabled in AI 0x0bdc}}
0019c5bc: 92a30e3a lbu r3,0x0e3a(r21)
+
  0019c8b4: a2a20cbc sb r2,0x0cbc(r21)             |{{f/store|Store Nb of Tiles enabled in AI 0x0b94}}
0019c5c0: 00000000 nop
 
0019c5c4: 1060002d beq r3,r0,0x0019c67c
 
0019c5c8: 00008021 addu r16,r0,r0
 
0019c5cc: 02c09821 addu r19,r22,r0
 
0019c5d0: 02141004 sllv r2,r20,r16
 
0019c5d4: 30428000 andi r2,r2,0x8000
 
0019c5d8: 10400023 beq r2,r0,0x0019c668
 
0019c5dc: 00000000 nop
 
 
 
<Water Movement>
 
0019c5e0: 92a219b9 lbu r2,0x19b9(r21) Load Water Movement Flag
 
0019c5e4: 00000000 nop
 
0019c5e8: 1040000e beq r2,r0,0x0019c624 Branch if Unit can ignore Water movement penalty
 
0019c5ec: 02430018 mult r18,r3
 
0019c5f0: 00111a00 sll r3,r17,0x08
 
0019c5f4: 00001012 mflo r2
 
0019c5f8: 00501021 addu r2,r2,r16
 
0019c5fc: 00431021 addu r2,r2,r3
 
0019c600: 000210c0 sll r2,r2,0x03
 
0019c604: 3c018019 lui r1,0x8019
 
0019c608: 00220821 addu r1,r1,r2
 
0019c60c: 9022f8cf lbu r2,-0x0731(r1)
 
0019c610: 00000000 nop
 
0019c614: 00021142 srl r2,r2,0x05
 
0019c618: 28420002 slti r2,r2,0x0002
 
0019c61c: 1040000e beq r2,r0,0x0019c658
 
0019c620: 00000000 nop
 
 
 
<Elemental Evaluation>
 
0019c624: 92a20000 lbu r2,0x0000(r21)
 
0019c628: 3c018006 lui r1,0x8006
 
0019c62c: 00220821 addu r1,r1,r2
 
0019c630: 90235cb4 lbu r3,0x5cb4(r1) Load Action Menu Type
 
0019c634: 34020004 ori r2,r0,0x0004
 
0019c638: 1462000b bne r3,r2,0x0019c668 Branch if not Elemental
 
0019c63c: 26a40c74 addiu r4,r21,0x0c74
 
0019c640: a2b00c74 sb r16,0x0c74(r21)
 
0019c644: a2b20c76 sb r18,0x0c76(r21)
 
0019c648: 0c066dd5 jal 0x0019b754 Elemental Panel Check
 
0019c64c: a2b10c75 sb r17,0x0c75(r21)
 
0019c650: 14400005 bne r2,r0,0x0019c668 Branch if not the correct Panel
 
0019c654: 00000000 nop
 
0019c658: 96630000 lhu r3,0x0000(r19)
 
0019c65c: 021e1007 srav r2,r30,r16
 
0019c660: 00621826 xor r3,r3,r2
 
0019c664: a6630000 sh r3,0x0000(r19)
 
 
 
0019c668: 92a30e3a lbu r3,0x0e3a(r21)
 
0019c66c: 26100001 addiu r16,r16,0x0001
 
0019c670: 0203102a slt r2,r16,r3
 
0019c674: 1440ffd7 bne r2,r0,0x0019c5d4
 
0019c678: 02141004 sllv r2,r20,r16
 
0019c67c: 92a20e3b lbu r2,0x0e3b(r21)
 
0019c680: 26520001 addiu r18,r18,0x0001
 
0019c684: 0242102a slt r2,r18,r2
 
0019c688: 1440ffc8 bne r2,r0,0x0019c5ac
 
0019c68c: 26d60002 addiu r22,r22,0x0002
 
0019c690: 26310001 addiu r17,r17,0x0001
 
0019c694: 2a220002 slti r2,r17,0x0002
 
0019c698: 1440ffbf bne r2,r0,0x0019c598
 
0019c69c: 26f70024 addiu r23,r23,0x0024
 
0019c6a0: 8ea2000c lw r2,0x000c(r21) Load AI Behavior Flags
 
0019c6a4: 3c030800 lui r3,0x0800
 
0019c6a8: 00431024 and r2,r2,r3
 
0019c6ac: 10400016 beq r2,r0,0x0019c708 <Evaluate Linear with AoE> if no Stat flag
 
0019c6b0: 00000000 nop
 
0019c6b4: 0c0672e5 jal 0x0019cb94 Height/Map Coordinate Check
 
0019c6b8: 00008821 addu r17,r0,r0
 
0019c6bc: 92a20e3b lbu r2,0x0e3b(r21)
 
0019c6c0: 00000000 nop
 
0019c6c4: 18400010 blez r2,0x0019c708
 
0019c6c8: 00000000 nop
 
 
0019c6cc: 02a03021 addu r6,r21,r0
 
0019c6d0: 26310001 addiu r17,r17,0x0001
 
0019c6d4: 94c20b94 lhu r2,0x0b94(r6)
 
0019c6d8: 94c40b4c lhu r4,0x0b4c(r6)
 
0019c6dc: 94c30bb8 lhu r3,0x0bb8(r6)
 
0019c6e0: 94c50b70 lhu r5,0x0b70(r6)
 
0019c6e4: 00441024 and r2,r2,r4
 
0019c6e8: 00651824 and r3,r3,r5
 
0019c6ec: a4c20b94 sh r2,0x0b94(r6)
 
0019c6f0: a4c30bb8 sh r3,0x0bb8(r6)
 
0019c6f4: 92a20e3b lbu r2,0x0e3b(r21)
 
0019c6f8: 00000000 nop
 
0019c6fc: 0222102a slt r2,r17,r2
 
0019c700: 1440fff3 bne r2,r0,0x0019c6d0
 
0019c704: 24c60002 addiu r6,r6,0x0002
 
 
 
<Evaluate Linear with AoE>
 
0019c708: 0000a021 addu r20,r0,r0
 
0019c70c: 02b41021 addu r2,r21,r20 Ignore Range check branches here
 
0019c710: 90420c8d lbu r2,0x0c8d(r2)
 
0019c714: 00000000 nop
 
0019c718: 1040001d beq r2,r0,0x0019c790 Branch if unit is not on targetable unit list
 
0019c71c: 02802021 addu r4,r20,r0
 
 
<Set Linear Presets>
 
0019c720: 0c067ca9 jal 0x0019f2a4 Transfer Unit Coordinates to AI
 
0019c724: 26a50c74 addiu r5,r21,0x0c74
 
0019c728: 92a30026 lbu r3,0x0026(r21)
 
0019c72c: 34020006 ori r2,r0,0x0006
 
0019c730: 14620002 bne r3,r2,0x0019c73c Branch if 4 and 2 flags aren't set
 
0019c734: 34040001 ori r4,r0,0x0001 Set AoE Mode
 
0019c738: 34040003 ori r4,r0,0x0003 Use Preset Range
 
0019c73c: 0c06723b jal 0x0019c8ec Check if Linear Ability Hits
 
0019c740: 00002821 addu r5,r0,r0 Range = 0
 
 
0019c744: 92a20e3b lbu r2,0x0e3b(r21) Load Max Y
 
0019c748: 00000000 nop
 
0019c74c: 18400010 blez r2,0x0019c790 Branch if negative
 
0019c750: 00008821 addu r17,r0,r0
 
0019c754: 02a03021 addu r6,r21,r0
 
0019c758: 26310001 addiu r17,r17,0x0001
 
0019c75c: 94c20bdc lhu r2,0x0bdc(r6)
 
0019c760: 94c40b4c lhu r4,0x0b4c(r6)
 
0019c764: 94c30c00 lhu r3,0x0c00(r6)
 
0019c768: 94c50b70 lhu r5,0x0b70(r6)
 
0019c76c: 00441025 or r2,r2,r4
 
0019c770: 00651825 or r3,r3,r5
 
0019c774: a4c20bdc sh r2,0x0bdc(r6)
 
0019c778: a4c30c00 sh r3,0x0c00(r6)
 
0019c77c: 92a20e3b lbu r2,0x0e3b(r21) Load Max Y
 
0019c780: 00000000 nop
 
0019c784: 0222102a slt r2,r17,r2
 
0019c788: 1440fff3 bne r2,r0,0x0019c758
 
0019c78c: 24c60002 addiu r6,r6,0x0002
 
 
0019c790: 26940001 addiu r20,r20,0x0001
 
0019c794: 2a820015 slti r2,r20,0x0015
 
0019c798: 1440ffdd bne r2,r0,0x0019c710 Loop for all units
 
0019c79c: 02b41021 addu r2,r21,r20
 
 
 
0019c7a0: 8ea2000c lw r2,0x000c(r21) Load AI Ability Behavior Flags 1-4
 
0019c7a4: 00000000 nop
 
0019c7a8: 30421000 andi r2,r2,0x1000
 
0019c7ac: 10400025 beq r2,r0,0x0019c844 Skip entire loop if not Vertical Fixed (AKA Red Panels are Linear)
 
0019c7b0: 00000000 nop
 
0019c7b4: 0000a021 addu r20,r0,r0
 
0019c7b8: 34080005 ori r8,r0,0x0005
 
0019c7bc: 34078000 ori r7,r0,0x8000
 
0019c7c0: 3c068019 lui r6,0x8019
 
0019c7c4: 24c608cc addiu r6,r6,0x08cc r6 = Unit Data
 
 
0019c7c8: 02b41021 addu r2,r21,r20
 
0019c7cc: 90420c8d lbu r2,0x0c8d(r2)
 
0019c7d0: 00000000 nop
 
0019c7d4: 10400017 beq r2,r0,0x0019c834
 
0019c7d8: 00c02821 addu r5,r6,r0
 
0019c7dc: 90c20058 lbu r2,0x0058(r6) Load Current Status 1
 
0019c7e0: 92a30026 lbu r3,0x0026(r21) Load ? Flags
 
0019c7e4: 00000000 nop
 
0019c7e8: 10680003 beq r3,r8,0x0019c7f8 Branch if ? == 0x05
 
0019c7ec: 30420004 andi r2,r2,0x0004
 
0019c7f0: 10400010 beq r2,r0,0x0019c834 Skip to Loop End if Unit Jumping
 
0019c7f4: 00000000 nop
 
 
0019c7f8: 94a30048 lhu r3,0x0048(r5) r3 = Unit Y
 
0019c7fc: 90a40048 lbu r4,0x0048(r5) r4 = Unit Y
 
0019c800: 00031bc2 srl r3,r3,0x0f
 
0019c804: 000310c0 sll r2,r3,0x03
 
0019c808: 00431021 addu r2,r2,r3
 
0019c80c: 00021080 sll r2,r2,0x02
 
0019c810: 00551021 addu r2,r2,r21
 
0019c814: 24420bdc addiu r2,r2,0x0bdc
 
0019c818: 00042040 sll r4,r4,0x01
 
0019c81c: 00822021 addu r4,r4,r2
 
0019c820: 90a20047 lbu r2,0x0047(r5) Load Unit X
 
0019c824: 94830000 lhu r3,0x0000(r4)
 
0019c828: 00471007 srav r2,r7,r2
 
0019c82c: 00621826 xor r3,r3,r2
 
0019c830: a4830000 sh r3,0x0000(r4)
 
0019c834: 26940001 addiu r20,r20,0x0001
 
0019c838: 2a820015 slti r2,r20,0x0015
 
0019c83c: 1440ffe2 bne r2,r0,0x0019c7c8 Loop for all units
 
0019c840: 24c601c0 addiu r6,r6,0x01c0
 
 
 
0019c844: 00008821 addu r17,r0,r0
 
0019c848: 02a03021 addu r6,r21,r0
 
0019c84c: 92a20e3b lbu r2,0x0e3b(r21) Load Max Y
 
0019c850: 00000000 nop
 
0019c854: 1840000e blez r2,0x0019c890 Branch if negative
 
0019c858: 00009021 addu r18,r0,r0
 
0019c85c: 24c40bdc addiu r4,r6,0x0bdc
 
0019c860: 24c50c24 addiu r5,r6,0x0c24
 
0019c864: 94a20000 lhu r2,0x0000(r5)
 
0019c868: 24a50002 addiu r5,r5,0x0002
 
0019c86c: 94830000 lhu r3,0x0000(r4)
 
0019c870: 26520001 addiu r18,r18,0x0001
 
0019c874: 00621824 and r3,r3,r2
 
0019c878: a4830000 sh r3,0x0000(r4)
 
0019c87c: 92a20e3b lbu r2,0x0e3b(r21)
 
0019c880: 00000000 nop
 
0019c884: 0242102a slt r2,r18,r2
 
0019c888: 1440fff6 bne r2,r0,0x0019c864
 
0019c88c: 24840002 addiu r4,r4,0x0002
 
0019c890: 26310001 addiu r17,r17,0x0001
 
0019c894: 2a220002 slti r2,r17,0x0002
 
0019c898: 1440ffec bne r2,r0,0x0019c84c
 
0019c89c: 24c60024 addiu r6,r6,0x0024
 
 
 
0019c8a0: 0c065f1a jal 0x00197c68 Final Targeting Check
 
  0019c8a4: 26a40bdc addiu r4,r21,0x0bdc
 
  0019c8a8: 26a40b94 addiu r4,r21,0x0b94
 
  0019c8ac: 0c065f1a jal 0x00197c68 Final Targeting Check
 
  0019c8b0: a2a20cbb sb r2,0x0cbb(r21)
 
  0019c8b4: a2a20cbc sb r2,0x0cbc(r21)
 
 
  0019c8b8: 8fbf006c lw r31,0x006c(r29)
 
  0019c8b8: 8fbf006c lw r31,0x006c(r29)
 
  0019c8bc: 8fbe0068 lw r30,0x0068(r29)
 
  0019c8bc: 8fbe0068 lw r30,0x0068(r29)
Line 356: Line 353:
 
  0019c8e4: 03e00008 jr r31
 
  0019c8e4: 03e00008 jr r31
 
  0019c8e8: 00000000 nop
 
  0019c8e8: 00000000 nop
 +
===Return locations===
 +
'''BATTLE.BIN'''
 +
  001977b8: [[Store_ability/skillset_data,_set_AI_settings_for_ability%3F]]
 +
  001977e0: [[Store_ability/skillset_data,_set_AI_settings_for_ability%3F]]
 +
  0019bfc0: [[Find_Highest_Target_Priority_in_Ability_Range_(0019bf2c)]]

Latest revision as of 19:42, 12 May 2024

BATTLE.BIN :  - Evaluate_Linear_Ability_Behaviors
Set Flags and count Enabled Tiles in AI 0xbdc and AI 0xb94 (Seems to be Table of Tiles from where you can hit a unit and Table of Tiles you can hit)
------------------------------------------------------------------------------------------
Parameter : Nothing
Return : Nothing
------------------------------------------------------------------------------------------
0019c3d4: 27bdff90 addiu r29,r29,-0x0070     |
0019c3d8: afb1004c sw r17,0x004c(r29)        |
0019c3dc: 00008821 addu r17,r0,r0            |Initialize Y counter
0019c3e0: afb5005c sw r21,0x005c(r29)        |
0019c3e4: 3c15801a lui r21,0x801a            |
0019c3e8: 26b5f3c4 addiu r21,r21,-0x0c3c     |0x8019f3c4
0019c3ec: 02a01821 addu r3,r21,r0            |Prepare dynamic pointer to AI Data (1 halfword each iteration)
0019c3f0: afbf006c sw r31,0x006c(r29)        |
0019c3f4: afbe0068 sw r30,0x0068(r29)        |
0019c3f8: afb70064 sw r23,0x0064(r29)        |
0019c3fc: afb60060 sw r22,0x0060(r29)        |
0019c400: afb40058 sw r20,0x0058(r29)        |
0019c404: afb30054 sw r19,0x0054(r29)        |
0019c408: afb20050 sw r18,0x0050(r29)        |
0019c40c: afb00048 sw r16,0x0048(r29)        |
                                            @LOOP - AI Table 0x0bdc
0019c410: a4600bdc sh r0,0x0bdc(r3)              |Initialize 0xbdc
0019c414: a4600c00 sh r0,0x0c00(r3)              |Initialize 0xc00 High Elevation
0019c418: 26310001 addiu r17,r17,0x0001          |Counter +1
0019c41c: 2a220012 slti r2,r17,0x0012            |
0019c420: 1440fffb bne r2,r0,0x0019c410      Λ Loop 0x12 times (whole table)
0019c424: 24630002 addiu r3,r3,0x0002            |Dynamic Pointer to AI data (+1 halfword each iteration)
0019c428: 8ea2000c lw r2,0x000c(r21)         |Load considered AI Ability Behavior Flags 1-4
0019c42c: 3c030080 lui r3,0x0080             |
0019c430: 00431024 and r2,r2,r3              |

Set AI 0x0b94 Table - Reachable Tiles (with proximity conditions based on 0xe2d, Ability Range condition, Ability Usability conditions)
0019c434: 1040000b beq r2,r0,0x0019c464      #If Ability has [Longbow Attack]  AI behavior 0x03 Flag 0x80
0019c438: 26a40b94 addiu r4,r21,0x0b94           |0x8019f3c4 + 0xb94
0019c43c: 92a20e2d lbu r2,0x0e2d(r21)            |AI 0xe2d
0019c440: 34060048 ori r6,r0,0x0048              |Size of Data to transfer in routine below
0019c444: 000228c0 sll r5,r2,0x03                |
0019c448: 00a22821 addu r5,r5,r2                 |
0019c44c: 000528c0 sll r5,r5,0x03                |0xe2d * 0x48
0019c450: 24a50a74 addiu r5,r5,0x0a74            |
0019c454: 0c066ac2 jal 0x0019ab08                |-->Transfer Halfword Values Copy data from AI 0xa74 (based on 0xe2d) to AI 0xb94
0019c458: 02a52821 addu r5,r21,r5                |Pointer to AI 0xa74  + 0xe2d offset
0019c45c: 080671c3 j 0x0019c70c                  >>Jump to  AI 0x0bdc section
0019c460: 0000a021 addu r20,r0,r0                |
                                             Else : Not [Longbow Attack]
0019c464: 0000a021 addu r20,r0,r0                |Initialize Unit counter
0019c468: 02b41021 addu r2,r21,r20               |Dynamic pointer to AI data (1 byte per iteration/unit)
                                                @LOOP - All Units
0019c46c: 90420c8d lbu r2,0x0c8d(r2)                 |This unit potential Target flag
0019c470: 00000000 nop                               |
0019c474: 1040001d beq r2,r0,0x0019c4ec              #If This unit is not a potential target branch to  Next Unit
0019c478: 02802021 addu r4,r20,r0                    |Send Unit ID
0019c47c: 0c067ca9 jal 0x0019f2a4                    |-->Transfer Unit Coordinates to AI Store this Unit coordinates on AI 0x0c74
0019c480: 26a50c74 addiu r5,r21,0x0c74               |Send Pointer
0019c484: 92a30026 lbu r3,0x0026(r21)                |This Ability Targeting Type (Target or Tile)  8019f3c4 + 0x26
0019c488: 34020006 ori r2,r0,0x0006                  |
0019c48c: 14620002 bne r3,r2,0x0019c498              #If AI 0x26 = 0x06 (Target specific ?)
0019c490: 34040002 ori r4,r0,0x0002                  |Not Target Specific checks both Range and AoE
0019c494: 00002021 addu r4,r0,r0                         |Target specifc Ability Checks just Range
0019c498: 0c06723b jal 0x0019c8ec                    |-->Check_if_Linear_Ability_hits_anything_(0019c8ec)  Enable Tile hit by Ability in AI Table 0xb4c (Tile from where you can hit someone with considered Ability ?)
0019c49c: 00002821 addu r5,r0,r0                     |Preset Range = 0x00 (unused with r4 values)

0019c4a0: 92a20e3b lbu r2,0x0e3b(r21)                |Load Max Y
0019c4a4: 00000000 nop                               |
0019c4a8: 18400010 blez r2,0x0019c4ec                #If Max Y is invalid  Avoid loop
0019c4ac: 00008821 addu r17,r0,r0                    |initialize Y counter
0019c4b0: 02a03021 addu r6,r21,r0                    |8019f3c4
                                                    @Loop - Copy from AI 0xb4c to 0xbdc (preserve previous values)
0019c4b4: 26310001 addiu r17,r17,0x0001                  |Y counter + 1
0019c4b8: 94c20bdc lhu r2,0x0bdc(r6)                     |This iteration AI 0xbdc Low elevation Y row
0019c4bc: 94c40b4c lhu r4,0x0b4c(r6)                     |This iteration AI 0xb4c Low elevation Y row
0019c4c0: 94c30c00 lhu r3,0x0c00(r6)                     |This iteration AI 0xbdc High elevation Y row
0019c4c4: 94c50b70 lhu r5,0x0b70(r6)                     |This iteration AI 0xb4c High elevation Y row
0019c4c8: 00441025 or r2,r2,r4                           |
0019c4cc: 00651825 or r3,r3,r5                           |
0019c4d0: a4c20bdc sh r2,0x0bdc(r6)                      |Enable AI 0xb4c flags in AI 0xbdc Table
0019c4d4: a4c30c00 sh r3,0x0c00(r6)                      |Enable AI 0xb4c flags in AI 0xbdc Table High elevation
0019c4d8: 92a20e3b lbu r2,0x0e3b(r21)                    |Load Max Y
0019c4dc: 00000000 nop                                   |
0019c4e0: 0222102a slt r2,r17,r2                         |
0019c4e4: 1440fff3 bne r2,r0,0x0019c4b4              Λ Loop while Y < Max Y
0019c4e8: 24c60002 addiu r6,r6,0x0002                    |Halfword offset for Ai Table
0019c4ec: 26940001 addiu r20,r20,0x0001              |Unit counter + 1
0019c4f0: 2a820015 slti r2,r20,0x0015                |
0019c4f4: 1440ffdd bne r2,r0,0x0019c46c          Λ Loop for all units
0019c4f8: 02b41021 addu r2,r21,r20                   |Dynamic pointer to AI data (1 byte per iteration/unit)
0019c4fc: 92a20e3b lbu r2,0x0e3b(r21)            |Load Max Y
0019c500: 00000000 nop                           |
0019c504: 18400021 blez r2,0x0019c58c            #If Max Y is invalid :  Avoid Loop
0019c508: 00008821 addu r17,r0,r0                |
0019c50c: 02a02821 addu r5,r21,r0                |
                                                @LOOP - Set AI 0x0b94 flags
0019c510: 92a30e2d lbu r3,0x0e2d(r21)                |AI 0x0e2d
0019c514: 00112040 sll r4,r17,0x01                   |
0019c518: 000310c0 sll r2,r3,0x03                    |
0019c51c: 00431021 addu r2,r2,r3                     |
0019c520: 000210c0 sll r2,r2,0x03                    |0xe2d offset (0x48)
0019c524: 02a21021 addu r2,r21,r2                    |
0019c528: 00821021 addu r2,r4,r2                     |Dynamic 8019f3c4 + 0xe2d offset (1 halfword per iteration)
0019c52c: 94420a74 lhu r2,0x0a74(r2)                 |Load this Y iteration flags in Reachable tiles table(based on 0xe2d) low elevation
0019c530: 94a30bdc lhu r3,0x0bdc(r5)                 |Load this Y flags  low elevation
0019c534: 00000000 nop                               |
0019c538: 00431024 and r2,r2,r3                      |
0019c53c: a4a20b94 sh r2,0x0b94(r5)                  |Store in AI 0xb94 only the flags enabled in both AI 0xa74 and 0xbdc Move condition and allow to hit a unit
0019c540: 92a30e2d lbu r3,0x0e2d(r21)                |
0019c544: 00000000 nop                               |
0019c548: 000310c0 sll r2,r3,0x03                    |
0019c54c: 00431021 addu r2,r2,r3                     |
0019c550: 000210c0 sll r2,r2,0x03                    |0xe2d offset (0x48)
0019c554: 02a21021 addu r2,r21,r2                    |
0019c558: 00822021 addu r4,r4,r2                     |Dynamic 8019f3c4 + 0xe2d offset (1 halfword per iteration)
0019c55c: 94820a98 lhu r2,0x0a98(r4)                 |Load this Y iteration flags in Reachable tiles table(based on 0xe2d) high elevation
0019c560: 94a30c00 lhu r3,0x0c00(r5)                 |Load this Y flags  high elevation
0019c564: 26310001 addiu r17,r17,0x0001              |
0019c568: a4a00bdc sh r0,0x0bdc(r5)                  |Reset AI 0xbdc
0019c56c: a4a00c00 sh r0,0x0c00(r5)                  |Reset AI 0xbdc high elevation
0019c570: 00431024 and r2,r2,r3                      |
0019c574: a4a20bb8 sh r2,0x0bb8(r5)                  |Store in AI 0xb94 only the flags enabled in both AI 0xa74 and 0xbdc high elevation
0019c578: 92a20e3b lbu r2,0x0e3b(r21)                |Load Max Y
0019c57c: 00000000 nop                               |
0019c580: 0222102a slt r2,r17,r2                     |
0019c584: 1440ffe2 bne r2,r0,0x0019c510          Λ Loop while Y < Max Y
0019c588: 24a50002 addiu r5,r5,0x0002                |
0019c58c: 00008821 addu r17,r0,r0                |Initialize Elevation counter
0019c590: 341e8000 ori r30,r0,0x8000             |Prepare bitmask
0019c594: 02a0b821 addu r23,r21,r0               |Dynamic pointer to 0x8019f3c4 (+0x24 for high elevation)
                                                @LOOP - both elevation
0019c598: 92a20e3b lbu r2,0x0e3b(r21)                |Load Max Y
0019c59c: 00000000 nop                               |
0019c5a0: 1840003b blez r2,0x0019c690                #If Max Y is invalid : branch to  Next elevation
0019c5a4: 00009021 addu r18,r0,r0                    |Initialize Y counter
0019c5a8: 26f60b94 addiu r22,r23,0x0b94              |Dynamic pointer to AI 0x0b94 (+0x2 per Y rows)
                                                    @LOOP - All Y rows
0019c5ac: 96d40000 lhu r20,0x0000(r22)                   |Load this Y row AI 0x0b94 flags
0019c5b0: 00000000 nop                                   |
0019c5b4: 12800031 beq r20,r0,0x0019c67c                 #If This Row has no flags : branch to  Next Y row
0019c5b8: 00000000 nop                                   |
0019c5bc: 92a30e3a lbu r3,0x0e3a(r21)                    |Load Max X
0019c5c0: 00000000 nop                                   |
0019c5c4: 1060002d beq r3,r0,0x0019c67c                  #if Max X is invalid : branch to  Next Y row
0019c5c8: 00008021 addu r16,r0,r0                        |
0019c5cc: 02c09821 addu r19,r22,r0                       |Dynamic pointer to AI 0x0b94 (+0x2 per Y rows)
0019c5d0: 02141004 sllv r2,r20,r16                       |Tile's Bit of interest is shifted at 0x8000
                                                        @LOOP - All tiles in this Y row
0019c5d4: 30428000 andi r2,r2,0x8000                         |
0019c5d8: 10400023 beq r2,r0,0x0019c668                      #If This Tile Flag is disabled : branch to  Next Tile (keep flag ON)
0019c5dc: 00000000 nop                                       |
0019c5e0: 92a219b9 lbu r2,0x19b9(r21)                        |Load Water Movement Flag
0019c5e4: 00000000 nop                                       |
0019c5e8: 1040000e beq r2,r0,0x0019c624                      #If Acting Unit suffer water penalty
0019c5ec: 02430018 mult r18,r3                                   |
0019c5f0: 00111a00 sll r3,r17,0x08                               |
0019c5f4: 00001012 mflo r2                                       |
0019c5f8: 00501021 addu r2,r2,r16                                |
0019c5fc: 00431021 addu r2,r2,r3                                 |Tile's ID (X + Y*Max X + 0x100 if high elevation)
0019c600: 000210c0 sll r2,r2,0x03                                |8 bytes per tile ID
0019c604: 3c018019 lui r1,0x8019                                 |
0019c608: 00220821 addu r1,r1,r2                                 |
0019c60c: 9022f8cf lbu r2,-0x0731(r1)                            |This Tile height + depth 8018f8cc + 0x03 + Tile's offset
0019c610: 00000000 nop                                           |
0019c614: 00021142 srl r2,r2,0x05                                |Keep only depth
0019c618: 28420002 slti r2,r2,0x0002                             |
0019c61c: 1040000e beq r2,r0,0x0019c658                          #if Depth is 2 or more : branch and Disable this tile
0019c620: 00000000 nop                                           |
                                                             Else : Water is not a problem (by Ability or depth)
0019c624: 92a20000 lbu r2,0x0000(r21)                            |Considered Ability Skillset ID
0019c628: 3c018006 lui r1,0x8006                                 |
0019c62c: 00220821 addu r1,r1,r2                                 |
0019c630: 90235cb4 lbu r3,0x5cb4(r1)                             |Considered skillset action menu 80065cb4 + Skillset offset
0019c634: 34020004 ori r2,r0,0x0004                              |
0019c638: 1462000b bne r3,r2,0x0019c668                          #If Action Menu is not [Elements] : branch to  Next Tile (keep flag ON)
0019c63c: 26a40c74 addiu r4,r21,0x0c74                           |Pointer to AI 0xc74
0019c640: a2b00c74 sb r16,0x0c74(r21)                            |Store X at AI 0xc74
0019c644: a2b20c76 sb r18,0x0c76(r21)                            |Store Y at AI 0xc76
0019c648: 0c066dd5 jal 0x0019b754                                |-->See_if_elemental_ability_can_be_used Check Terrain Type Vs Ability ID (from AI 0x02)
0019c64c: a2b10c75 sb r17,0x0c75(r21)                            |Store elevation at AI 0xc75
0019c650: 14400005 bne r2,r0,0x0019c668                          #If considered Ability matches terrain type Next Tile (keep flag ON)
0019c654: 00000000 nop                                               |
                                                             Else : Depth > 2 or Unusable geomancy ability
0019c658: 96630000 lhu r3,0x0000(r19)                            |This Y rows flags
0019c65c: 021e1007 srav r2,r30,r16                               |This tile bitmask
0019c660: 00621826 xor r3,r3,r2                                  |
0019c664: a6630000 sh r3,0x0000(r19)                             |Disable this tile in AI 0xb94
0019c668: 92a30e3a lbu r3,0x0e3a(r21)                        |Max X
0019c66c: 26100001 addiu r16,r16,0x0001                      |X counter +1
0019c670: 0203102a slt r2,r16,r3                             |
0019c674: 1440ffd7 bne r2,r0,0x0019c5d4                  Λ Loop while X < Max X
0019c678: 02141004 sllv r2,r20,r16                           |
0019c67c: 92a20e3b lbu r2,0x0e3b(r21)                    |Max Y
0019c680: 26520001 addiu r18,r18,0x0001                  |Y counter + 1
0019c684: 0242102a slt r2,r18,r2                         |
0019c688: 1440ffc8 bne r2,r0,0x0019c5ac              Λ loop while Y < Max Y
0019c68c: 26d60002 addiu r22,r22,0x0002                  |Y offset (+ 1 halfword each iteration)
0019c690: 26310001 addiu r17,r17,0x0001              |Elevation + 1
0019c694: 2a220002 slti r2,r17,0x0002                |
0019c698: 1440ffbf bne r2,r0,0x0019c598          Λ loop 2 times
0019c69c: 26f70024 addiu r23,r23,0x0024              |Elevation Offset (+0x24 for high elevation)
0019c6a0: 8ea2000c lw r2,0x000c(r21)             |Load AI Behavior Flags 1 to 4
0019c6a4: 3c030800 lui r3,0x0800                 |
0019c6a8: 00431024 and r2,r2,r3                  | Flag 0x08 of AI 0x0f is a copy of Ability 0xef0 0x03 so this should be a monster skill check
0019c6ac: 10400016 beq r2,r0,0x0019c708          #If This Ability requires monster skill
0019c6b0: 00000000 nop                               |
0019c6b4: 0c0672e5 jal 0x0019cb94                    |-->Some_height/Map_coordinate_calculation_for_all_units Enable Tile Adjacent to an Ally with monster skill in AI 0xb4c
0019c6b8: 00008821 addu r17,r0,r0                    |
0019c6bc: 92a20e3b lbu r2,0x0e3b(r21)                |Max Y
0019c6c0: 00000000 nop                               |
0019c6c4: 18400010 blez r2,0x0019c708                #if Max Y is Invalid :  Avoid loop
0019c6cc: 02a03021 addu r6,r21,r0                    |Dynamic pointer to 0x8019f3c4 (+1 halfword each oteration)
                                                    @LOOP
0019c6d0: 26310001 addiu r17,r17,0x0001                  |Y counter + 1
0019c6d4: 94c20b94 lhu r2,0x0b94(r6)                     |This Y row Flags from AI 0x0b94
0019c6d8: 94c40b4c lhu r4,0x0b4c(r6)                     |This Y row Flags from AI 0x0b4c
0019c6dc: 94c30bb8 lhu r3,0x0bb8(r6)                     |This Y row Flags from AI 0x0b94 high elevation
0019c6e0: 94c50b70 lhu r5,0x0b70(r6)                     |This Y row Flags from AI 0x0b4c high elevation
0019c6e4: 00441024 and r2,r2,r4                          |
0019c6e8: 00651824 and r3,r3,r5                          |
0019c6ec: a4c20b94 sh r2,0x0b94(r6)                      |Keep only the flags enabled in both Table in AI 0xb94 high elevation
0019c6f0: a4c30bb8 sh r3,0x0bb8(r6)                      |Keep only the flags enabled in both Table in AI 0xb94 high elevation
0019c6f4: 92a20e3b lbu r2,0x0e3b(r21)                    |
0019c6f8: 00000000 nop                                   |Max Y
0019c6fc: 0222102a slt r2,r17,r2                         |
0019c700: 1440fff3 bne r2,r0,0x0019c6d0              Λ Loop while Y < Max Y
0019c704: 24c60002 addiu r6,r6,0x0002                    |
0019c708: 0000a021 addu r20,r0,r0            |Initialize Unit Counter
0019c70c: 02b41021 addu r2,r21,r20           |Prepare dynamic pointer to 0x8019f3c4 (1 byte per iteration)

Set AI 0xbdc Table - Targetable Tiles to Hit a Unit
                                            @LOOP - All Units
0019c710: 90420c8d lbu r2,0x0c8d(r2)             |Load This Unit Targetable flag in AI 0x0c8d
0019c714: 00000000 nop                           |
0019c718: 1040001d beq r2,r0,0x0019c790          #If Unit is not a potential Target : branch to Next unit
0019c71c: 02802021 addu r4,r20,r0                |Send Unit ID
0019c720: 0c067ca9 jal 0x0019f2a4                |-->Transfer Unit Coordinates to AI Store Unit coordinates on r5
0019c724: 26a50c74 addiu r5,r21,0x0c74           |Send AI 0x0c74 pointer
0019c728: 92a30026 lbu r3,0x0026(r21)            |Considered Ability Targeting type
0019c72c: 34020006 ori r2,r0,0x0006              |
0019c730: 14620002 bne r3,r2,0x0019c73c          #If Targeting type is 0x06 (Target specific)
0019c734: 34040001 ori r4,r0,0x0001              |Spread AoE if Tile specific Targeting
0019c738: 34040003 ori r4,r0,0x0003                  |Spread Nothing (use r5 = 0x00) if Target specific
0019c73c: 0c06723b jal 0x0019c8ec                |-->Check_if_Linear_Ability_hits_anything_(0019c8ec) Set AI 0xb4c flags
0019c740: 00002821 addu r5,r0,r0                 |Send 0x00
0019c744: 92a20e3b lbu r2,0x0e3b(r21)            |Load Max Y
0019c748: 00000000 nop                           |
0019c74c: 18400010 blez r2,0x0019c790            #If Max Y is invalid : branch to  Next Unit
0019c750: 00008821 addu r17,r0,r0                |Initialize Y counter
0019c754: 02a03021 addu r6,r21,r0                |Prepare dynamic pointer to 0x8019f3c4 (1halfword per iteration)
                                                @LOOP - Y rows in AI Tables
0019c758: 26310001 addiu r17,r17,0x0001              |Unit Counter + 1
0019c75c: 94c20bdc lhu r2,0x0bdc(r6)                 |This Y row Flags from AI 0x0bdc
0019c760: 94c40b4c lhu r4,0x0b4c(r6)                 |This Y row Flags from AI 0x0b4c
0019c764: 94c30c00 lhu r3,0x0c00(r6)                 |This Y row Flags from AI 0x0bdc high elevation
0019c768: 94c50b70 lhu r5,0x0b70(r6)                 |This Y row Flags from AI 0x0b4c high elevation
0019c76c: 00441025 or r2,r2,r4                       |
0019c770: 00651825 or r3,r3,r5                       |
0019c774: a4c20bdc sh r2,0x0bdc(r6)                  |Enable AI 0xb4c flags in AI Table 0xbdc
0019c778: a4c30c00 sh r3,0x0c00(r6)                  |Enable AI 0xb4c flags in AI Table 0xbdc high elevation
0019c77c: 92a20e3b lbu r2,0x0e3b(r21)                |Load Max Y
0019c780: 00000000 nop                               |
0019c784: 0222102a slt r2,r17,r2                     |
0019c788: 1440fff3 bne r2,r0,0x0019c758          #Loop while Y < Max Y
0019c78c: 24c60002 addiu r6,r6,0x0002                |Offset for AI Pointer (1 halword)
0019c790: 26940001 addiu r20,r20,0x0001          |Unit counter +1
0019c794: 2a820015 slti r2,r20,0x0015            |
0019c798: 1440ffdd bne r2,r0,0x0019c710      #Loop for all units
0019c79c: 02b41021 addu r2,r21,r20               |Offset for AI pointer
0019c7a0: 8ea2000c lw r2,0x000c(r21)         |Load AI Ability Behavior Flags 1-4
0019c7a4: 00000000 nop                       |
0019c7a8: 30421000 andi r2,r2,0x1000         |
0019c7ac: 10400025 beq r2,r0,0x0019c844      #if considered Ability has [Check CT/Target]
0019c7b0: 00000000 nop                           |
0019c7b4: 0000a021 addu r20,r0,r0                |Initialize Unit counter
0019c7b8: 34080005 ori r8,r0,0x0005              |Targeting type to check
0019c7bc: 34078000 ori r7,r0,0x8000              |Prepare bitmask
0019c7c0: 3c068019 lui r6,0x8019                 |
0019c7c4: 24c608cc addiu r6,r6,0x08cc            |Prepare dynamic pointer to Unit Battle data
                                                @LOOP
0019c7c8: 02b41021 addu r2,r21,r20                   |AI dynamic pointer (1 byte per unit)
0019c7cc: 90420c8d lbu r2,0x0c8d(r2)                 |This Unit Potential target flag
0019c7d0: 00000000 nop                               |
0019c7d4: 10400017 beq r2,r0,0x0019c834              #Is this unit is not a potential target : branch to  Next Unit
0019c7d8: 00c02821 addu r5,r6,r0                     |This Unit Battle pointer
0019c7dc: 90c20058 lbu r2,0x0058(r6)                 |Load Current Status 1
0019c7e0: 92a30026 lbu r3,0x0026(r21)                |Considered Ability targeting type
0019c7e4: 00000000 nop                               |
0019c7e8: 10680003 beq r3,r8,0x0019c7f8              #If Targeting type is not 0x05
0019c7ec: 30420004 andi r2,r2,0x0004                     |
0019c7f0: 10400010 beq r2,r0,0x0019c834                  #If This Unit is not Jumping : branch to  Next Unit (keep unit flag)
0019c7f4: 00000000 nop                                       |
                                                     Else : If Targeting type is 0x05 or 0x06 but unit is not Jumping
0019c7f8: 94a30048 lhu r3,0x0048(r5)                     |Unit Y + Elevation
0019c7fc: 90a40048 lbu r4,0x0048(r5)                     |Unit Y
0019c800: 00031bc2 srl r3,r3,0x0f                        |Unit Elevation
0019c804: 000310c0 sll r2,r3,0x03                        |
0019c808: 00431021 addu r2,r2,r3                         |
0019c80c: 00021080 sll r2,r2,0x02                        |Elevation * 0x24
0019c810: 00551021 addu r2,r2,r21                        |
0019c814: 24420bdc addiu r2,r2,0x0bdc                    |
0019c818: 00042040 sll r4,r4,0x01                        |Y * 2
0019c81c: 00822021 addu r4,r4,r2                         |Pointer to Unit AI 0x0bdc Y row
0019c820: 90a20047 lbu r2,0x0047(r5)                     |Load Unit X
0019c824: 94830000 lhu r3,0x0000(r4)                     |Unit Y row flags in AI 0x0bdcTable
0019c828: 00471007 srav r2,r7,r2                         |Unit Tile Bitmask
0019c82c: 00621826 xor r3,r3,r2                          |
0019c830: a4830000 sh r3,0x0000(r4)                      |Disable Unit Tile's Flag in AI 0x0bdc Why ? 
0019c834: 26940001 addiu r20,r20,0x0001              |Unit counter + 1
0019c838: 2a820015 slti r2,r20,0x0015                |
0019c83c: 1440ffe2 bne r2,r0,0x0019c7c8          #Loop for all units
0019c840: 24c601c0 addiu r6,r6,0x01c0                |Battle data offset
0019c844: 00008821 addu r17,r0,r0            |Initialize Elevation counter
0019c848: 02a03021 addu r6,r21,r0            |Prepare Dynamic pointer to AI data
                                            @LOOP
0019c84c: 92a20e3b lbu r2,0x0e3b(r21)            |Load Max Y
0019c850: 00000000 nop                           |
0019c854: 1840000e blez r2,0x0019c890            #If Max Y is invalid : branch to  Next elevation
0019c858: 00009021 addu r18,r0,r0                |Initialize Y counter
0019c85c: 24c40bdc addiu r4,r6,0x0bdc            |Dynamic pointer to AI 0x0bdc
0019c860: 24c50c24 addiu r5,r6,0x0c24            |Dynamic pointer to AI 0x0c24
                                                @LOOP
0019c864: 94a20000 lhu r2,0x0000(r5)                 |This Y row AI 0xc24 flags
0019c868: 24a50002 addiu r5,r5,0x0002                |Offset for AI 0xc24 pointer
0019c86c: 94830000 lhu r3,0x0000(r4)                 |This Y row AI 0xbdc flags
0019c870: 26520001 addiu r18,r18,0x0001              |Y counter +1
0019c874: 00621824 and r3,r3,r2                      |
0019c878: a4830000 sh r3,0x0000(r4)                  |Keep only flags in both Table in AI 0xbdc 0xc24 is Valid Tiles flags (Not unselectable nor cross section)
0019c87c: 92a20e3b lbu r2,0x0e3b(r21)                |Max Y
0019c880: 00000000 nop                               |
0019c884: 0242102a slt r2,r18,r2                     |
0019c888: 1440fff6 bne r2,r0,0x0019c864          Λ Loop while Y < Max Y
0019c88c: 24840002 addiu r4,r4,0x0002                |Offset for AI 0xbdc pointer
0019c890: 26310001 addiu r17,r17,0x0001              |
0019c894: 2a220002 slti r2,r17,0x0002                |
0019c898: 1440ffec bne r2,r0,0x0019c84c      Λ Loop
0019c89c: 24c60024 addiu r6,r6,0x0024            |Elevation offset

0019c8a0: 0c065f1a jal 0x00197c68                |-->Final Targeting Check Count Tiles enabled in AI 0x0bdc
0019c8a4: 26a40bdc addiu r4,r21,0x0bdc           |Send Pointer to AI 0x0bdc
0019c8a8: 26a40b94 addiu r4,r21,0x0b94           |Send Pointer to AI 0x0b94
0019c8ac: 0c065f1a jal 0x00197c68                |-->Final Targeting Check Count Tiles enabled in AI 0x0b94
0019c8b0: a2a20cbb sb r2,0x0cbb(r21)             |Store Nb of Tiles enabled in AI 0x0bdc
0019c8b4: a2a20cbc sb r2,0x0cbc(r21)             |Store Nb of Tiles enabled in AI 0x0b94
0019c8b8: 8fbf006c lw r31,0x006c(r29)
0019c8bc: 8fbe0068 lw r30,0x0068(r29)
0019c8c0: 8fb70064 lw r23,0x0064(r29)
0019c8c4: 8fb60060 lw r22,0x0060(r29)
0019c8c8: 8fb5005c lw r21,0x005c(r29)
0019c8cc: 8fb40058 lw r20,0x0058(r29)
0019c8d0: 8fb30054 lw r19,0x0054(r29)
0019c8d4: 8fb20050 lw r18,0x0050(r29)
0019c8d8: 8fb1004c lw r17,0x004c(r29)
0019c8dc: 8fb00048 lw r16,0x0048(r29)
0019c8e0: 27bd0070 addiu r29,r29,0x0070
0019c8e4: 03e00008 jr r31
0019c8e8: 00000000 nop

Return locations

BATTLE.BIN
 001977b8: Store_ability/skillset_data,_set_AI_settings_for_ability?
 001977e0: Store_ability/skillset_data,_set_AI_settings_for_ability?
 0019bfc0: Find_Highest_Target_Priority_in_Ability_Range_(0019bf2c)