Difference between revisions of "HP Absorption"

From Final Fantasy Hacktics Wiki
Jump to navigation Jump to search
 
(3 intermediate revisions by 3 users not shown)
Line 1: Line 1:
  HP Absorbtion (Seems needlessly complex)
+
  No Parameters - Returns Nothing
  00187248: 3c028019 lui r2,0x8019
+
  0018724c: 8c422d98 lw r2,0x2d98(r2) Load Defender's Stats
+
Target is not undead : Update Attacker Current Action (ACA) data (Healing Attacker matching the inflicted damage)
  00187250: 27bdffe8 addiu r29,r29,0xffe8
+
Target is undead :
  00187254: afbf0010 sw r31,0x0010(r29)
+
    - Update Target Current Action : switching HP damge and HP recovery, modify Attack type too
  00187258: 90420058 lbu r2,0x0058(r2) Load 1st set of Current Status
+
    - Update Attacker current Action : Returns the damage to the attacker
  0018725c: 00000000 nop
+
  00187260: 30420010 andi r2,r2,0x0010
+
Attacker Current Action Hit flag/ HP damage or recovery / Attack Type are updated here
  00187264: 1040001e beq r2,r0,0x001872e0 Branch if target is not undead
+
-------------------------------------------------------------------------------------------------------------------
  00187268: 00000000 nop
+
  00187248: 3c028019 lui r2,0x8019           |
  0018726c: 0c062e91 jal 0x0018ba44
+
  0018724c: 8c422d98 lw r2,0x2d98(r2)         |{{f/adr|<nowiki>r2 = Target data pointer</nowiki>}} {{f/adr|Load Defender's Stats}}
  00187270: 00000000 nop
+
  00187250: 27bdffe8 addiu r29,r29,-0x0018    |
  00187274: 3c048019 lui r4,0x8019
+
  00187254: afbf0010 sw r31,0x0010(r29)       |
  00187278: 8c842d90 lw r4,0x2d90(r4) Load Defender Current Action Data Pointer
+
  00187258: 90420058 lbu r2,0x0058(r2)       |{{f/load|<nowiki>r2 = Target 1st set of current status</nowiki>}} {{f/load|Load 1st set of Current Status}}
  0018727c: 00000000 nop
+
  0018725c: 00000000 nop                     |
  00187280: 90820000 lbu r2,0x0000(r4) Load Hit Flag
+
  00187260: 30420010 andi r2,r2,0x0010       |{{f/std|<nowiki>r2 = 0x10 if Target is undead</nowiki>}}
  00187284: 00000000 nop
+
  00187264: 1040001e beq r2,r0,0x001872e0     {{f/Cond|If Target is Undead}}
  00187288: 1040002d beq r2,r0,0x00187340 Branch to end if Attack missed
+
  00187268: 00000000 nop                         |
  0018728c: 00000000 nop
+
  0018726c: 0c062e91 jal 0x0018ba44               |{{f/jal|Set some data for current attack|Set some data for current attack}} Checks if Attack is valid before applying any changes to Attacker data
  00187290: 3c038019 lui r3,0x8019
+
  00187270: 00000000 nop                         |
  00187294: 8c632d8c lw r3,0x2d8c(r3) Load Attacker Current Action Data  Pointer
+
  00187274: 3c048019 lui r4,0x8019               |
  00187298: 94820004 lhu r2,0x0004(r4) Load HP Damage
+
  00187278: 8c842d90 lw r4,0x2d90(r4)             |{{f/adr|<nowiki>r4 = Target Current Action(TCA) data pointer</nowiki>}}
  0018729c: 00000000 nop
+
  0018727c: 00000000 nop                         |
  001872a0: a4620004 sh r2,0x0004(r3) Store HP Damage into Attacker
+
  00187280: 90820000 lbu r2,0x0000(r4)           |{{f/load|<nowiki>r2 = TCA hit flag</nowiki>}}
  001872a4: 34020080 ori r2,r0,0x0080
+
  00187284: 00000000 nop                         |
  001872a8: a0620025 sb r2,0x0025 (r3) Store Attack Flag as HP Damage
+
  00187288: 1040002d beq r2,r0,0x00187340         {{f/Cond|If Attack hits (not nullified by routine above)}} / Else Branch to {{f/loc|END}}
  001872ac: 3c038019 lui r3,0x801 9
+
  0018728c: 00000000 nop                             |
  001872b0: 8c632d8c lw r3,0x2d8c(r3) Load Attacker Current Action Data  Pointer
+
  00187290: 3c038019 lui r3,0x8019                   |
  001872b4: 34020001 ori r2,r0,0x0001
+
  00187294: 8c632d8c lw r3,0x2d8c(r3)                 |{{f/adr|<nowiki>r3 = Attacker Current Action (ACA) data pointer</nowiki>}}
  001872b8: a0620000 sb r2,0x0000(r3)
+
  00187298: 94820004 lhu r2,0x0004(r4)               |{{f/load|<nowiki>r2 = TCA HP damage amount</nowiki>}}
  001872bc: 3c028019 lui r2,0x8019
+
  0018729c: 00000000 nop                             |
  001872c0: 8c422d90 lw r2,0x2d90(r2) Load Target Current Action Data  Pointer
+
  001872a0: a4620004 sh r2,0x0004(r3)                 |{{f/store|Store HP Damage into ACA (Attacker will be damaged)}}
  001872c4: 00000000 nop
+
  001872a4: 34020080 ori r2,r0,0x0080                 |{{f/std|<nowiki>r2 = 0x80 (HP damage attack type)</nowiki>}}
  001872c8: 94440004 lhu r4,0x0004(r2) Load HP Damage
+
  001872a8: a0620025 sb r2,0x0025(r3)                 |{{f/store|Set ACA attack type to HP damage}}
  001872cc: 34030040 ori r3,r0,0x0040
+
  001872ac: 3c038019 lui r3,0x8019                    |
  001872d0: a4400004 sh r0,0x0004(r2) Store HP Damage Flag as 0
+
  001872b0: 8c632d8c lw r3,0x2d8c(r3)                 |{{f/adr|<nowiki>r3 = ACA data pointer</nowiki>}}
  001872d4: a0430025 sb r3,0x0025(r2) Store HP Damage Flag as HP Recovery
+
  001872b4: 34020001 ori r2,r0,0x0001                 |{{f/std|<nowiki>r2 = 0x01 </nowiki>}}
  001872d8: 08061cd0 j 0x00187340 Branch to end
+
  001872b8: a0620000 sb r2,0x0000(r3)                 |{{f/store|Set ACA hit flag to 0x01 (Attack is hited)}}
  001872dc: a4440006 sh r4,0x0006(r2) Store HP Damage as Recovery
+
  001872bc: 3c028019 lui r2,0x8019                   |
  001872e0: 0c062e91 jal 0x0018ba44
+
  001872c0: 8c422d90 lw r2,0x2d90(r2)                 |{{f/adr|<nowiki>r2 = TCA data pointer</nowiki>}}
  001872e4: 00000000 nop
+
  001872c4: 00000000 nop                             |
  001872e8: 3c048019 lui r4,0x8019
+
  001872c8: 94440004 lhu r4,0x0004(r2)               |{{f/load|<nowiki>r4 = TCA Hp damage</nowiki>}} {{f/load|Load HP Damage}}
  001872ec: 8c842d90 lw r4,0x2d90(r4) Load Current Action Data Pointer
+
  001872cc: 34030040 ori r3,r0,0x0040                 |{{f/std|<nowiki>r3 = 0x40 (Hp recovery attack type)</nowiki>}}
  001872f0: 00000000 nop
+
  001872d0: a4400004 sh r0,0x0004(r2)                 |{{f/store|Nullify TCA Hp damage}}
  001872f4: 90820000 lbu r2,0x0000(r4) Load Hit Flag
+
  001872d4: a0430025 sb r3,0x0025(r2)                 |{{f/store|Store previous HP damage in TCA HP recovery}}
  001872f8: 00000000 nop
+
  001872d8: 08061cd0 j 0x00187340                     {{f/jump|jump to END}}
  001872fc: 10400010 beq r2,r0,0x00187340 Branch if Attack missed
+
  001872dc: a4440006 sh r4,0x0006(r2)                 |{{f/store|Set TCA Attack type to HP recovery}}
  00187300: 00000000 nop
+
                                            {{f/Cond|Else (Target is not Undead)}}
  00187304: 3c038019 lui r3,0x8019
+
  001872e0: 0c062e91 jal 0x0018ba44               |{{f/jal|Set some data for current attack|Set some data for current attack}} Checks if Attack is valid before applying any changes to Attacker data
  00187308: 8c632d8c lw r3,0x2d8c(r3) Load Attacker Current Action Data Pointer
+
  001872e4: 00000000 nop                         |
  0018730c: 94820004 lhu r2,0x0004(r4) Load HP Damage
+
  001872e8: 3c048019 lui r4,0x8019               |
  00187310: 00000000 nop
+
  001872ec: 8c842d90 lw r4,0x2d90(r4)             |{{f/adr|<nowiki>r2 = TCA data pointer</nowiki>}}
  00187314: a4620006 sh r2,0x0006(r3) Store Defender HP Damage as HP Recovery for Attacker
+
  001872f0: 00000000 nop                         |
  00187318: 34020040 ori r2,r0,0x0040
+
  001872f4: 90820000 lbu r2,0x0000(r4)           |{{f/load|<nowiki>r2 = TCA hit flag</nowiki>}}
  0018731c: a0620025 sb r2,0x0025(r3) Store Attack Flag as HP Healing for Attacker
+
  001872f8: 00000000 nop                         |
  00187320: 3c038019 lui r3,0x8019
+
  001872fc: 10400010 beq r2,r0,0x00187340         {{f/Cond|If Attack hits (not nullified by routine above)}} / Else Branch to {{f/loc|END}}
  00187324: 8c632d8c lw r3,0x2d8c(r3) Load Attacker Current Action Data
+
  00187300: 00000000 nop                             |
  00187328: 34020001 ori r2,r0,0x0001
+
  00187304: 3c038019 lui r3,0x8019                   |
  0018732c: a0620000 sb r2,0x0000(r3) Store Attacker Hit Flag as Hit
+
  00187308: 8c632d8c lw r3,0x2d8c(r3)                 |{{f/adr|<nowiki>r3 = ACA Data Pointer</nowiki>}}
  00187330: 3c038019 lui r3,0x8019
+
  0018730c: 94820004 lhu r2,0x0004(r4)               |{{f/load|<nowiki>r2 = TCA HP damage</nowiki>}}
  00187334: 8c632d90 lw r3,0x2d90(r3) Load Defender Current Action Data
+
  00187310: 00000000 nop                             |
  00187338: 34020080 ori r2,r0,0x0080
+
  00187314: a4620006 sh r2,0x0006(r3)                 |{{f/store|Store TCA HP damage to ACA HP recovery}}
  0018733c: a0620025 sb r2,0x0025(r3) Store Attack Flag as HP Damage for Defender (? Does this make sense?)
+
  00187318: 34020040 ori r2,r0,0x0040                 |{{f/std|<nowiki>r2 = 0x40 (Hp recovery attack type)</nowiki>}}
  00187340: 8fbf0010 lw r31,0x0010(r29)
+
  0018731c: a0620025 sb r2,0x0025(r3)                 |{{f/store|Set ACA Attack type to HP recovery}}
  00187344: 27bd0018 addiu r29,r29,0x0018
+
  00187320: 3c038019 lui r3,0x8019                   |
  00187348: 03e00008 jr r31
+
  00187324: 8c632d8c lw r3,0x2d8c(r3)                 |{{f/adr|<nowiki>r2 = ACA data pointer</nowiki>}}
 +
  00187328: 34020001 ori r2,r0,0x0001                 |{{f/std|<nowiki>r2 = 0x01</nowiki>}}
 +
  0018732c: a0620000 sb r2,0x0000(r3)                 |{{f/store|Set ACA hit flag to Hit}}
 +
  00187330: 3c038019 lui r3,0x8019                   |
 +
  00187334: 8c632d90 lw r3,0x2d90(r3)                 |{{f/adr|<nowiki>r3 = TCA data pointer</nowiki>}}
 +
  00187338: 34020080 ori r2,r0,0x0080                 |{{f/std|<nowiki>r2 = 0x80</nowiki>}}
 +
  0018733c: a0620025 sb r2,0x0025(r3)                 |{{f/store|Set TCA attack type to HP damage}}
 +
  00187340: 8fbf0010 lw r31,0x0010(r29)       END       
 +
  00187344: 27bd0018 addiu r29,r29,0x0018          
 +
  00187348: 03e00008 jr r31                        
 
  0018734c: 00000000 nop
 
  0018734c: 00000000 nop
 +
=== Notes ===
 +
This routine call [[Set some data for current attack]] which is normally called when formula returns in preformula set up routine.
 +
It's used to nullify Action if target can't be hited (Status), and to cap HP and MP amount.
 +
It seems to be used here before any changes to Attacker Current Action data, probably because this changes would not be nullified afterward
  
 
+
=== Return locations ===
== Return Locations ==
+
'''Battle.bin'''
 
+
  00188d2c: [[06 AbsHP_(Weapon)|Formula 06 : AbsHP (Weapon)]]
*Battle.bin
+
  00189114: [[10 AbsHP_(Y)% Hit_F(MA+X)%|Formula 10 : AbsHP (Y)% Hit F(MA+X)%]]
  00188d24: [[06 AbsHP_(Weapon)]]
+
  00189cc0: [[30 AbsHP_(PA*WP)|Formula 30 : AbsHP (PA*WP)]]
  0018910c: [[10 AbsHP_(Y)% Hit_F(MA+X)%]]
+
  0018a238: [[47 AbsHP_(Y)% 100% Status|Formula 47 : AbsHP (Y)% 100% Status]]
  00189cb8: [[30 AbsHP_(PA*WP)]]
+
  0018a410: [[4D AbsHP_(Y)% Hit_(MA+X)%|Formula 4d : AbsHP (Y)% Hit (MA+X)%]]
  0018a230: [[47 AbsHP_(Y)% 100% Status]]
 
  0018a408: [[4D AbsHP_(Y)% Hit_(MA+X)%]]
 

Latest revision as of 19:40, 16 April 2022

No Parameters - Returns Nothing

Target is not undead : Update Attacker Current Action (ACA) data (Healing Attacker matching the inflicted damage)
Target is undead : 
   - Update Target Current Action : switching HP damge and HP recovery, modify Attack type too
   - Update Attacker current Action : Returns the damage to the attacker

Attacker Current Action Hit flag/ HP damage or recovery / Attack Type are updated here
-------------------------------------------------------------------------------------------------------------------
00187248: 3c028019 lui r2,0x8019            |
0018724c: 8c422d98 lw r2,0x2d98(r2)         |r2 = Target data pointer Load Defender's Stats
00187250: 27bdffe8 addiu r29,r29,-0x0018    |
00187254: afbf0010 sw r31,0x0010(r29)       |
00187258: 90420058 lbu r2,0x0058(r2)        |r2 = Target 1st set of current status Load 1st set of Current Status
0018725c: 00000000 nop                      |
00187260: 30420010 andi r2,r2,0x0010        |r2 = 0x10 if Target is undead
00187264: 1040001e beq r2,r0,0x001872e0     #If Target is Undead
00187268: 00000000 nop                          |
0018726c: 0c062e91 jal 0x0018ba44               |-->Set some data for current attack Checks if Attack is valid before applying any changes to Attacker data
00187270: 00000000 nop                          |
00187274: 3c048019 lui r4,0x8019                |
00187278: 8c842d90 lw r4,0x2d90(r4)             |r4 = Target Current Action(TCA) data pointer
0018727c: 00000000 nop                          |
00187280: 90820000 lbu r2,0x0000(r4)            |r2 = TCA hit flag
00187284: 00000000 nop                          |
00187288: 1040002d beq r2,r0,0x00187340         #If Attack hits (not nullified by routine above) / Else Branch to END
0018728c: 00000000 nop                              |
00187290: 3c038019 lui r3,0x8019                    |
00187294: 8c632d8c lw r3,0x2d8c(r3)                 |r3 = Attacker Current Action (ACA) data pointer
00187298: 94820004 lhu r2,0x0004(r4)                |r2 = TCA HP damage amount
0018729c: 00000000 nop                              |
001872a0: a4620004 sh r2,0x0004(r3)                 |Store HP Damage into ACA (Attacker will be damaged)
001872a4: 34020080 ori r2,r0,0x0080                 |r2 = 0x80 (HP damage attack type)
001872a8: a0620025 sb r2,0x0025(r3)                 |Set ACA attack type to HP damage
001872ac: 3c038019 lui r3,0x8019                    |
001872b0: 8c632d8c lw r3,0x2d8c(r3)                 |r3 = ACA data pointer
001872b4: 34020001 ori r2,r0,0x0001                 |r2 = 0x01 
001872b8: a0620000 sb r2,0x0000(r3)                 |Set ACA hit flag to 0x01 (Attack is hited)
001872bc: 3c028019 lui r2,0x8019                    |
001872c0: 8c422d90 lw r2,0x2d90(r2)                 |r2 = TCA data pointer
001872c4: 00000000 nop                              |
001872c8: 94440004 lhu r4,0x0004(r2)                |r4 = TCA Hp damage Load HP Damage
001872cc: 34030040 ori r3,r0,0x0040                 |r3 = 0x40 (Hp recovery attack type)
001872d0: a4400004 sh r0,0x0004(r2)                 |Nullify TCA Hp damage
001872d4: a0430025 sb r3,0x0025(r2)                 |Store previous HP damage in TCA HP recovery
001872d8: 08061cd0 j 0x00187340                     >>jump to END
001872dc: a4440006 sh r4,0x0006(r2)                 |Set TCA Attack type to HP recovery
                                            #Else (Target is not Undead)
001872e0: 0c062e91 jal 0x0018ba44               |-->Set some data for current attack Checks if Attack is valid before applying any changes to Attacker data
001872e4: 00000000 nop                          |
001872e8: 3c048019 lui r4,0x8019                |
001872ec: 8c842d90 lw r4,0x2d90(r4)             |r2 = TCA data pointer
001872f0: 00000000 nop                          |
001872f4: 90820000 lbu r2,0x0000(r4)            |r2 = TCA hit flag
001872f8: 00000000 nop                          |
001872fc: 10400010 beq r2,r0,0x00187340         #If Attack hits (not nullified by routine above) / Else Branch to END
00187300: 00000000 nop                              |
00187304: 3c038019 lui r3,0x8019                    |
00187308: 8c632d8c lw r3,0x2d8c(r3)                 |r3 = ACA Data Pointer
0018730c: 94820004 lhu r2,0x0004(r4)                |r2 = TCA HP damage
00187310: 00000000 nop                              |
00187314: a4620006 sh r2,0x0006(r3)                 |Store TCA HP damage to ACA HP recovery
00187318: 34020040 ori r2,r0,0x0040                 |r2 = 0x40 (Hp recovery attack type)
0018731c: a0620025 sb r2,0x0025(r3)                 |Set ACA Attack type to HP recovery
00187320: 3c038019 lui r3,0x8019                    |
00187324: 8c632d8c lw r3,0x2d8c(r3)                 |r2 = ACA data pointer
00187328: 34020001 ori r2,r0,0x0001                 |r2 = 0x01
0018732c: a0620000 sb r2,0x0000(r3)                 |Set ACA hit flag to Hit
00187330: 3c038019 lui r3,0x8019                    |
00187334: 8c632d90 lw r3,0x2d90(r3)                 |r3 = TCA data pointer
00187338: 34020080 ori r2,r0,0x0080                 |r2 = 0x80
0018733c: a0620025 sb r2,0x0025(r3)                 |Set TCA attack type to HP damage
00187340: 8fbf0010 lw r31,0x0010(r29)       END         
00187344: 27bd0018 addiu r29,r29,0x0018            
00187348: 03e00008 jr r31                          
0018734c: 00000000 nop

Notes

This routine call Set some data for current attack which is normally called when formula returns in preformula set up routine.
It's used to nullify Action if target can't be hited (Status), and to cap HP and MP amount.
It seems to be used here before any changes to Attacker Current Action data, probably because this changes would not be nullified afterward

Return locations

Battle.bin
00188d2c: Formula 06 : AbsHP (Weapon)
00189114: Formula 10 : AbsHP (Y)% Hit F(MA+X)%
00189cc0: Formula 30 : AbsHP (PA*WP)
0018a238: Formula 47 : AbsHP (Y)% 100% Status
0018a410: Formula 4d : AbsHP (Y)% Hit (MA+X)%