Difference between revisions of "Calculate Tiles Hit by Ability"

From Final Fantasy Hacktics Wiki
Jump to navigation Jump to search
m (Add duplicated link)
m
 
(3 intermediate revisions by the same user not shown)
Line 1: Line 1:
  DUPLICATED here : [[Generate_Range_Routine]]
+
  '''00179518 - 00179638'''
 
+
'''Parameters''' : r4 = Ability AoE/ Range         
  Calculate Tiles Hit by Ability
+
  00179518: 27bdffb8 addiu r29,r29,0xffb8
+
This routine will spread the AoE out of the targeted tile (see [[#Notes|Notes]])
  0017951c: afb40038 sw r20,0x0038(r29)
+
  --------------------------------------------------------------------
  00179520: 0080a021 addu r20,r4,r0 r20 = AoE
+
  00179518: 27bdffb8 addiu r29,r29,-0x0048    |
  00179524: 328200ff andi r2,r20,0x00ff r2 = AoE
+
  0017951c: afb40038 sw r20,0x0038(r29)       |
  00179528: afbf0040 sw r31,0x0040(r29)
+
  00179520: 0080a021 addu r20,r4,r0           |{{f/std|<nowiki>r20 = AoE</nowiki>}}
  0017952c: afb5003c sw r21,0x003c(r29)
+
  00179524: 328200ff andi r2,r20,0x00ff       |{{f/std|<nowiki>r2 = AoE</nowiki>}}
  00179530: afb30034 sw r19,0x0034(r29)
+
  00179528: afbf0040 sw r31,0x0040(r29)       |
  00179534: afb20030 sw r18,0x0030(r29)
+
  0017952c: afb5003c sw r21,0x003c(r29)       |
  00179538: afb1002c sw r17,0x002c(r29)
+
  00179530: afb30034 sw r19,0x0034(r29)       |
  0017953c: 14400005 bne r2,r0,0x 00179554 Branch if AoE != 0
+
  00179534: afb20030 sw r18,0x0030(r29)       |
  00179540: afb00028 sw r16,0x0028(r29)
+
  00179538: afb1002c sw r17,0x002c(r29)       |
  00179544: 0c05e500 jal 0x 00179400 Null some Tile Data (192dd9)
+
  0017953c: 14400005 bne r2,r0,0x00179554    {{f/Cond|<nowiki>If AoE = 0</nowiki>}} /Else avoid nullification and exit
  00179548: 00000000 nop
+
  00179540: afb00028 sw r16,0x0028(r29)           |{{f/store|<nowiki> </nowiki>}}
  0017954c: 0805e585 j 0x 00179614
+
  00179544: 0c05e500 jal 0x00179400                |{{f/jal|Null_some_Tile_Data_(192dd9)|<nowiki>Null_some_Tile_Data_(192dd9)</nowiki>}} Set all targetable panel's 0x01 flag to 0x00 (green flag)
  00179550: 00000000 nop
+
  00179548: 00000000 nop                           |
  00179554: 34120001 ori r18,r0,0x0001 Tiles Left? = True
+
  0017954c: 0805e585 j 0x00179614                  {{f/jump|<nowiki>Jump to </nowiki>{{f/loc|<nowiki>END</nowiki>}}<nowiki></nowiki>}}
  00179558: 1040002e beq r2,r0,0x 00179614 Branch if AoE = 0
+
  00179550: 00000000 nop                           |
  0017955c: 00009821 addu r19,r0,r0 AoE Counter = 0
+
  00179554: 34120001 ori r18,r0,0x0001       {{f/Cond|<nowiki>Else (AoE <> 0)</nowiki>}} {{f/std|<nowiki>r18 = 0x01 (r18 is set to 0x00 when AoE is completely spread)</nowiki>}}
  00179560: 3c158019 lui r21,0x8019
+
  00179558: 1040002e beq r2,r0,0x00179614          {{f/Cond|<nowiki>If AoE <> 0 (redundant ?)</nowiki>}} / Else branch to {{f/loc|<nowiki>END</nowiki>}}
  00179564: 26b52dd8 addiu r21,r21,0x2dd8 r21 = ? Tile data pointer
+
  0017955c: 00009821 addu r19,r0,r0                   |{{f/std|<nowiki>r19 = 0x00 - AoE loop counter</nowiki>}}
  00179568: 1240002a beq r18,r0,0x 00179614 Branch if Tiles Left? = False
+
  00179560: 3c158019 lui r21,0x8019                   |{{f/std|<nowiki>r21 = 0x80190000</nowiki>}}
  0017956c: 00009021 addu r18,r0,r0 Tiles Left? = False
+
  00179564: 26b52dd8 addiu r21,r21,0x2dd8             |{{f/std|<nowiki>r21 = 0x801902dd8</nowiki>}} {{f/std|<nowiki>Moveable/Targetable Panel Grid</nowiki>}}
  00179570: 3c02800e lui r2,0x800e
+
  00179568: 1240002a beq r18,r0,0x00179614            {{f/bloop|<nowiki>LOOP Spread AoE</nowiki>}} {{f/Cond|<nowiki>If r18 <> 0x00</nowiki>}} / Else branch to {{f/loc|<nowiki>END</nowiki>}}
  00179574: 90424ea0 lbu r2,0x4ea0(r2) Load Map Max Y
+
  0017956c: 00009021 addu r18,r0,r0                       |{{f/std|<nowiki>r18 = 0</nowiki>}}
  00179578: 00000000 nop
+
  00179570: 3c02800e lui r2,0x800e                         |{{f/std|<nowiki>r2 =0x800e0000</nowiki>}}
  0017957c: 18400020 blez r2,0x 00179600 Branch if Y <= 0
+
  00179574: 90424ea0 lbu r2,0x4ea0(r2)                     |{{f/load|<nowiki>r2 = Max Map Y</nowiki>}}
  00179580: 00008821 addu r17,r0,r0 Y Counter = 0
+
  00179578: 00000000 nop                                   |
  00179584: 3c03800e lui r3,0x800e
+
  0017957c: 18400020 blez r2,0x00179600                    {{f/Cond|<nowiki>If Map Max Y > 0x00</nowiki>}} /Else branch to next loop 1 iteration
  00179588: 90634e9c lbu r3,0x4e9c(r3) Load Map Max X
+
  00179580: 00008821 addu r17,r0,r0                       |{{f/std|<nowiki>r17 = 0x00 (Y Counter)</nowiki>}}
  0017958c: 00000000 nop
+
  00179584: 3c03800e lui r3,0x800e                             {{f/bloop|<nowiki>LOOP through Y coord</nowiki>}} {{f/std|<nowiki>r3 = 0x800e0000</nowiki>}}
  00179590: 10600015 beq r3,r0,0x 001795e8 Branch if X = 0
+
  00179588: 90634e9c lbu r3,0x4e9c(r3)                             |{{f/load|<nowiki>r3 = Map Max X</nowiki>}}
  00179594: 00008021 addu r16,r0,r0 X Counter = 0
+
  0017958c: 00000000 nop                                           |
  00179598: 02230018 mult r17,r3 YC * Map X
+
  00179590: 10600015 beq r3,r0,0x001795e8                          {{f/Cond|<nowiki>If Map Max X <> 0x00</nowiki>}}
  0017959c: 00001012 mflo r2
+
  00179594: 00008021 addu r16,r0,r0                               |{{f/std|<nowiki>r16 = 0x00 (X Counter)</nowiki>}}
  001795a0: 00501021 addu r2,r2,r16 YC * Map X + XC
+
  00179598: 02230018 mult r17,r3                                   |{{f/std|<nowiki>Y Counter * Max X</nowiki>}}
  001795a4: 00021880 sll r3,r2,0x02 (YC * Map X + X) * 4
+
  0017959c: 00001012 mflo r2                                       {{f/bloop|<nowiki>LOOP through X coord</nowiki>}} {{f/std|<nowiki>r2 = Y counter * Max X</nowiki>}}
  001795a8: 00621821 addu r3,r3,r2 Tile ID = (YC * Map X + X) * 5
+
  001795a0: 00501021 addu r2,r2,r16                                   |{{f/std|<nowiki>r2 = Y Counter * Max X + X Counter (= Tile ID without elevation)</nowiki>}}
  001795ac: 00751821 addu r3,r3,r21
+
  001795a4: 00021880 sll r3,r2,0x02                                   |{{f/std|<nowiki>r3 = Tile ID *4</nowiki>}}
  001795b0: 90620001 lbu r2,0x0001(r3) Load Tile's Targeted Flag?
+
  001795a8: 00621821 addu r3,r3,r2                                     |{{f/std|<nowiki>r3 = Tile ID *5</nowiki>}}
  001795b4: 00000000 nop
+
  001795ac: 00751821 addu r3,r3,r21                                   |{{f/std|<nowiki>r3 = Tile ID *5 + Targetable grid offset</nowiki>}}
  001795b8: 10400005 beq r2,r0,0x 001795d0 Branch if Targeted Flag? = 0
+
  001795b0: 90620001 lbu r2,0x0001(r3)                                 |{{f/load|<nowiki>r2 = Targetable grid panel 0x01 data corresponding to tile ID</nowiki>}}
  001795bc: 02202021 addu r4,r17,r0 r4 = Y Counter
+
  001795b4: 00000000 nop                                               |
  001795c0: a0600001 sb r0,0x0001(r3) Store Tile's Targeted Flag? = 0
+
  001795b8: 10400005 beq r2,r0,0x001795d0                              {{f/Cond|<nowiki>If pannel is targeted (=0x01)</nowiki>}} /Else branch
  001795c4: 0c05e58f jal 0x 0017963c Calculate Possible AoE Tiles
+
  001795bc: 02202021 addu r4,r17,r0                                       |{{f/std|<nowiki>r4 = Y Counter (Y coord of tile matching targeted panel)</nowiki>}}
  001795c8: 02002821 addu r5,r16,r0 r5 = X Counter
+
  001795c0: a0600001 sb r0,0x0001(r3)                                     |{{f/store|<nowiki>Store 0x00 at panel 0x01 (Remove Targeting flag)</nowiki>}}
  001795cc: 02429021 addu r18,r18,r2 Tiles Left? += returned Tile's Left?
+
  001795c4: 0c05e58f jal 0x0017963c                                        |{{f/jal|Calculate_Possible_AoE_Tiles|<nowiki>Calculate_Possible_AoE_Tiles</nowiki>}} Spread AoE in surrounding tiles, return r2 = 0x01 is AoE is not ended
  001795d0: 3c03800e lui r3,0x800e
+
  001795c8: 02002821 addu r5,r16,r0                                       |{{f/std|<nowiki>r5 = X Counter (X coord of tile matching targeted panel)</nowiki>}}
  001795d4: 90634e9c lbu r3,0x4e9c(r3) Load Map Max X
+
  001795cc: 02429021 addu r18,r18,r2                                       |{{f/std|<nowiki>r18 = 0x01 if AoE need to spread again</nowiki>}}
  001795d8: 26100001 addiu r16,r16,0x0001 X Counter ++
+
  001795d0: 3c03800e lui r3,0x800e                                     |{{f/std|<nowiki>r3 = 0x800e0000</nowiki>}}
  001795dc: 0203102a slt r2,r16,r3
+
  001795d4: 90634e9c lbu r3,0x4e9c(r3)                                 |{{f/load|<nowiki>r3 = Map Max X</nowiki>}}
  001795e0: 1440ffee bne r2,r0,0x 0017959c Branch if X Counter < Max X
+
  001795d8: 26100001 addiu r16,r16,0x0001                             |{{f/std|<nowiki>r16 = X Counter + 1</nowiki>}}
  001795e4: 02230018 mult r17,r3 Y Counter * Max X
+
  001795dc: 0203102a slt r2,r16,r3                                     |{{f/std|<nowiki>r3 = 0x01 if counter < Map Max X</nowiki>}}
  001795e8: 3c02800e lui r2,0x800e
+
  001795e0: 1440ffee bne r2,r0,0x0017959c                          {{f/eloop|<nowiki>Loop while X counter < Map Max X</nowiki>}}
  001795ec: 90424ea0 lbu r2,0x4ea0(r2) Load Map Max Y
+
  001795e4: 02230018 mult r17,r3                                       |{{f/std|<nowiki>Y Counter * Max X (mflo at the beginning of the loop)</nowiki>}}
  001795f0: 26310001 addiu r17,r17,0x0001 Y Counter ++
+
  001795e8: 3c02800e lui r2,0x800e                                 |{{f/std|<nowiki>r2 = 0x800e0000</nowiki>}}
  001795f4: 0222102a slt r2,r17,r2
+
  001795ec: 90424ea0 lbu r2,0x4ea0(r2)                             |{{f/load|<nowiki>r2 = Map Max Y</nowiki>}}
  001795f8: 1440ffe2 bne r2,r0,0x 00179584 Branch if Y Counter < Max Y
+
  001795f0: 26310001 addiu r17,r17,0x0001                         |{{f/std|<nowiki>r1 = Y counter + 1</nowiki>}}
  001795fc: 00000000 nop
+
  001795f4: 0222102a slt r2,r17,r2                                 |{{f/std|<nowiki>r2 = 0x01 If Y Counter < Max Y</nowiki>}}
  00179600: 26730001 addiu r19,r19,0x0001 AoE Counter ++
+
  001795f8: 1440ffe2 bne r2,r0,0x00179584                      {{f/eloop|<nowiki>Loop while Y counter < max Y</nowiki>}}
  00179604: 328200ff andi r2,r20,0x00ff r2 = AoE
+
  001795fc: 00000000 nop                                           |{{f/std|<nowiki> </nowiki>}}
  00179608: 0262102a slt r2,r19,r2
+
  00179600: 26730001 addiu r19,r19,0x0001                 |{{f/std|<nowiki>r19 = AoE counter + 1</nowiki>}}
  0017960c: 1440ffd6 bne r2,r0,0x 00179568 Branch if AoE Counter < AoE
+
  00179604: 328200ff andi r2,r20,0x00ff                   |{{f/std|<nowiki>r2 = Base AoE</nowiki>}}
  00179610: 00000000 nop
+
  00179608: 0262102a slt r2,r19,r2                         |{{f/std|<nowiki>r2 = 0x01 While Counter < AoE value</nowiki>}}
  00179614: 8fbf0040 lw r31,0x0040(r29)
+
  0017960c: 1440ffd6 bne r2,r0,0x00179568              {{f/eloop|<nowiki>Loop until AoE is spread</nowiki>}}
  00179618: 8fb5003c lw r21,0x003c(r29)
+
  00179610: 00000000 nop                               |{{f/std|<nowiki> </nowiki>}}
  0017961c: 8fb40038 lw r20,0x0038(r29)
+
  00179614: 8fbf0040 lw r31,0x0040(r29)               |
  00179620: 8fb30034 lw r19,0x0034(r29)
+
  00179618: 8fb5003c lw r21,0x003c(r29)               |
  00179624: 8fb20030 lw r18,0x0030(r29)
+
  0017961c: 8fb40038 lw r20,0x0038(r29)               |
  00179628: 8fb1002c lw r17,0x002c(r29)
+
  00179620: 8fb30034 lw r19,0x0034(r29)               |
  0017962c: 8fb00028 lw r16,0x0028(r29)
+
  00179624: 8fb20030 lw r18,0x0030(r29)               |
  00179630: 27bd0048 addiu r29,r29,0x0048
+
  00179628: 8fb1002c lw r17,0x002c(r29)               |
  00179634: 03e00008 jr r31
+
  0017962c: 8fb00028 lw r16,0x0028(r29)               |
  00179638: 00000000 nop
+
  00179630: 27bd0048 addiu r29,r29,0x0048             |
 +
  00179634: 03e00008 jr r31                           |
 +
  00179638: 00000000 nop                               |
 +
=== Notes ===
 +
This routine will spread the AoE around the targeted tile.
 +
It will use the  targetable grid to store AoE (0x00) and targeted status (0x01)
 +
Each time the AoE spread, it will decrease the AoE value stored in the panel 0x00 by one. (via [[Calculate_Possible_AoE_Tiles]])
 +
 +
1st Loop : test each panel of the targetable grid. Each iteration of this loop increase a counter.Loop occurs while counter < Base AoE value
 +
While looping each X coord is tested for each Y coord (elevation is handled in [[Calculate_Possible_AoE_Tiles]])
 +
If the targeted flag is ON (panel 0x01 <> 0x00) AoE spreads via [[Calculate_Possible_AoE_Tiles]] and Targeted flag is turned OFF
 +
 +
Note : this is [[Calculate_Possible_AoE_Tiles]] routine which set the targeted flag ON, while there's still AoE to spread.
 +
 +
Rq : if thoses infos are not deleted before the formula execution, the AoE value could be used for decreasing damage, or allow evasion
 +
=== Return location ===
 +
00179b14: [[Set_targeting_for_weapon_attack%3F]]
 +
00179fa4: [[Set_Ability_Targeting%3F]]
 +
0017a1f0: [[Calculate_ability_range_with_map_parameters%3F]]
 +
0017a444: [[Set_panels_affected_by_ability%3F]]
 +
0017badc: [[Targeting_routine]]

Latest revision as of 12:16, 4 June 2024

00179518 - 00179638
Parameters : r4 = Ability AoE/ Range          

This routine will spread the AoE out of the targeted tile (see Notes)
--------------------------------------------------------------------
00179518: 27bdffb8 addiu r29,r29,-0x0048    |
0017951c: afb40038 sw r20,0x0038(r29)       |
00179520: 0080a021 addu r20,r4,r0           |r20 = AoE 
00179524: 328200ff andi r2,r20,0x00ff       |r2 = AoE 
00179528: afbf0040 sw r31,0x0040(r29)       |
0017952c: afb5003c sw r21,0x003c(r29)       |
00179530: afb30034 sw r19,0x0034(r29)       |
00179534: afb20030 sw r18,0x0030(r29)       |
00179538: afb1002c sw r17,0x002c(r29)       |
0017953c: 14400005 bne r2,r0,0x00179554     #If AoE = 0 /Else avoid nullification and exit
00179540: afb00028 sw r16,0x0028(r29)            | 
00179544: 0c05e500 jal 0x00179400                |-->Null_some_Tile_Data_(192dd9) Set all targetable panel's 0x01 flag to 0x00 (green flag)
00179548: 00000000 nop                           |
0017954c: 0805e585 j 0x00179614                  >>Jump to END
00179550: 00000000 nop                           |
00179554: 34120001 ori r18,r0,0x0001        #Else (AoE <> 0) r18 = 0x01 (r18 is set to 0x00 when AoE is completely spread)
00179558: 1040002e beq r2,r0,0x00179614          #If AoE <> 0 (redundant ?) / Else branch to END
0017955c: 00009821 addu r19,r0,r0                    |r19 = 0x00 - AoE loop counter
00179560: 3c158019 lui r21,0x8019                    |r21 = 0x80190000
00179564: 26b52dd8 addiu r21,r21,0x2dd8              |r21 = 0x801902dd8 Moveable/Targetable Panel Grid
00179568: 1240002a beq r18,r0,0x00179614             @LOOP Spread AoE #If r18 <> 0x00 / Else branch to END
0017956c: 00009021 addu r18,r0,r0                        |r18 = 0
00179570: 3c02800e lui r2,0x800e                         |r2 =0x800e0000
00179574: 90424ea0 lbu r2,0x4ea0(r2)                     |r2 = Max Map Y
00179578: 00000000 nop                                   |
0017957c: 18400020 blez r2,0x00179600                    #If Map Max Y > 0x00 /Else branch to next loop 1 iteration
00179580: 00008821 addu r17,r0,r0                        |r17 = 0x00 (Y Counter)
00179584: 3c03800e lui r3,0x800e                             @LOOP through Y coord r3 = 0x800e0000
00179588: 90634e9c lbu r3,0x4e9c(r3)                             |r3 = Map Max X
0017958c: 00000000 nop                                           |
00179590: 10600015 beq r3,r0,0x001795e8                          #If Map Max X <> 0x00
00179594: 00008021 addu r16,r0,r0                                |r16 = 0x00 (X Counter)
00179598: 02230018 mult r17,r3                                   |Y Counter * Max X
0017959c: 00001012 mflo r2                                       @LOOP through X coord r2 = Y counter * Max X
001795a0: 00501021 addu r2,r2,r16                                    |r2 = Y Counter * Max X + X Counter (= Tile ID without elevation)
001795a4: 00021880 sll r3,r2,0x02                                    |r3 = Tile ID *4
001795a8: 00621821 addu r3,r3,r2                                     |r3 = Tile ID *5
001795ac: 00751821 addu r3,r3,r21                                    |r3 = Tile ID *5 + Targetable grid offset
001795b0: 90620001 lbu r2,0x0001(r3)                                 |r2 = Targetable grid panel 0x01 data corresponding to tile ID
001795b4: 00000000 nop                                               |
001795b8: 10400005 beq r2,r0,0x001795d0                              #If pannel is targeted (=0x01) /Else branch
001795bc: 02202021 addu r4,r17,r0                                        |r4 = Y Counter (Y coord of tile matching targeted panel)
001795c0: a0600001 sb r0,0x0001(r3)                                      |Store 0x00 at panel 0x01 (Remove Targeting flag)
001795c4: 0c05e58f jal 0x0017963c                                        |-->Calculate_Possible_AoE_Tiles Spread AoE in surrounding tiles, return r2 = 0x01 is AoE is not ended
001795c8: 02002821 addu r5,r16,r0                                        |r5 = X Counter (X coord of tile matching targeted panel)
001795cc: 02429021 addu r18,r18,r2                                       |r18 = 0x01 if AoE need to spread again
001795d0: 3c03800e lui r3,0x800e                                     |r3 = 0x800e0000
001795d4: 90634e9c lbu r3,0x4e9c(r3)                                 |r3 = Map Max X
001795d8: 26100001 addiu r16,r16,0x0001                              |r16 = X Counter + 1
001795dc: 0203102a slt r2,r16,r3                                     |r3 = 0x01 if counter < Map Max X
001795e0: 1440ffee bne r2,r0,0x0017959c                          Λ Loop while X counter < Map Max X
001795e4: 02230018 mult r17,r3                                       |Y Counter * Max X (mflo at the beginning of the loop)
001795e8: 3c02800e lui r2,0x800e                                 |r2 = 0x800e0000
001795ec: 90424ea0 lbu r2,0x4ea0(r2)                             |r2 = Map Max Y
001795f0: 26310001 addiu r17,r17,0x0001                          |r1 = Y counter + 1
001795f4: 0222102a slt r2,r17,r2                                 |r2 = 0x01 If Y Counter < Max Y
001795f8: 1440ffe2 bne r2,r0,0x00179584                      Λ Loop while Y counter < max Y
001795fc: 00000000 nop                                           | 
00179600: 26730001 addiu r19,r19,0x0001                  |r19 = AoE counter + 1
00179604: 328200ff andi r2,r20,0x00ff                    |r2 = Base AoE
00179608: 0262102a slt r2,r19,r2                         |r2 = 0x01 While Counter < AoE value
0017960c: 1440ffd6 bne r2,r0,0x00179568              Λ Loop until AoE is spread
00179610: 00000000 nop                               | 
00179614: 8fbf0040 lw r31,0x0040(r29)                |
00179618: 8fb5003c lw r21,0x003c(r29)                |
0017961c: 8fb40038 lw r20,0x0038(r29)                |
00179620: 8fb30034 lw r19,0x0034(r29)                |
00179624: 8fb20030 lw r18,0x0030(r29)                |
00179628: 8fb1002c lw r17,0x002c(r29)                |
0017962c: 8fb00028 lw r16,0x0028(r29)                |
00179630: 27bd0048 addiu r29,r29,0x0048              |
00179634: 03e00008 jr r31                            |
00179638: 00000000 nop                               |

Notes

This routine will spread the AoE around the targeted tile.
It will use the  targetable grid to store AoE (0x00) and targeted status (0x01)
Each time the AoE spread, it will decrease the AoE value stored in the panel 0x00 by one. (via Calculate_Possible_AoE_Tiles)

1st Loop : test each panel of the targetable grid. Each iteration of this loop increase a counter.Loop occurs while counter < Base AoE value
While looping each X coord is tested for each Y coord (elevation is handled in Calculate_Possible_AoE_Tiles)
If the targeted flag is ON (panel 0x01 <> 0x00) AoE spreads via Calculate_Possible_AoE_Tiles and Targeted flag is turned OFF

Note : this is Calculate_Possible_AoE_Tiles routine which set the targeted flag ON, while there's still AoE to spread.

Rq : if thoses infos are not deleted before the formula execution, the AoE value could be used for decreasing damage, or allow evasion

Return location

00179b14: Set_targeting_for_weapon_attack?
00179fa4: Set_Ability_Targeting? 
0017a1f0: Calculate_ability_range_with_map_parameters?
0017a444: Set_panels_affected_by_ability?
0017badc: Targeting_routine