Base XA Calculation

From Final Fantasy Hacktics Wiki
Revision as of 18:41, 18 April 2022 by Orkney (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
No parameters - Returns Nothing

Sets Current Ability YA ( 0x801938d0 )
  - YA = Brave%*PA if Weapon ID = 0x00 (fists)  - Min value is 0x01
  - YA = Weapon Power (every others cases)

Sets Current Ability XA ( 0x801938ce ) based on Weapon's Item Type (Weapon data 0x05) See Notes
------------------------------------------------------------------------------------------------
00185a9c: 3c028019 lui r2,0x8019            |
00185aa0: 904238d8 lbu r2,0x38d8(r2)        |r2 = Current Ability Used Weapon ID   0x801938d8 / 801938d8 
00185aa4: 27bdffe8 addiu r29,r29,-0x0018    |
00185aa8: afbf0014 sw r31,0x0014(r29)       |
00185aac: afb00010 sw r16,0x0010(r29)       |
00185ab0: 00021840 sll r3,r2,0x01           |Weapon ID * 2
00185ab4: 00621821 addu r3,r3,r2            |Weapon ID * 3
00185ab8: 00031880 sll r3,r3,0x02           |Weapon ID * 12 (0x0c = Size of Weapons data in Weapon Table)
00185abc: 3c018006 lui r1,0x8006            |
00185ac0: 00230821 addu r1,r1,r3            |r1 = 0x80060000 + Weapon offset
00185ac4: 90242ebd lbu r4,0x2ebd(r1)        |r4 = Used Weapon Type  0x80062eb8 + 0x05 + Weapon offset
00185ac8: 3c028019 lui r2,0x8019            |
00185acc: 8c422d94 lw r2,0x2d94(r2)         |r2 = Attacker data pointer
00185ad0: 308300ff andi r3,r4,0x00ff        |r3 = Use Weapon Type (byte)
00185ad4: 90500036 lbu r16,0x0036(r2)       |r16 = Attacker's PA
00185ad8: 90460037 lbu r6,0x0037(r2)        |r6 =  Attacker's MA
00185adc: 90450024 lbu r5,0x0024(r2)        |r5 = Attacker's Brave

 --- FISTS - YA Section --- 
00185ae0: 14600014 bne r3,r0,0x00185b34     #If used Weapon ID = 0x00 (fists)
00185ae4: 00b00018 mult r5,r16              |Brave * PA
00185ae8: 00001812 mflo r3                      |r3 = Attacker Brave * PA
00185aec: 3c0251eb lui r2,0x51eb                |
00185af0: 3442851f ori r2,r2,0x851f             |r2 = 0x51eb851f (0,32 * 2^32)
00185af4: 00620018 mult r3,r2                   |Brave * PA * 0.32 * 2^32
00185af8: 3c018019 lui r1,0x8019                |
00185afc: a43038ce sh r16,0x38ce(r1)            |Store XA = PA
00185b00: 00031fc3 sra r3,r3,0x1f               |r3 = Higher bit of r3 (should be 0x00)
00185b04: 00001010 mfhi r2                      |r2 = Attacker Brave * PA * 32 / 100
00185b08: 00021143 sra r2,r2,0x05               |r2 = Attacker Brave * PA / 100
00185b0c: 00431823 subu r3,r2,r3                |r3 = Attacker Brave * PA / 100  (-0x00 or - 0x01)
00185b10: 00031400 sll r2,r3,0x10               |Brave * PA / 100 * 65536
00185b14: 3c018019 lui r1,0x8019                |
00185b18: a42338d0 sh r3,0x38d0(r1)             |Store Attacker's Brave*PA/100 in Current Ability YA  0x801938d0 / 801938d0
00185b1c: 14400058 bne r2,r0,0x00185c80         #If YA = 0x00 /Else branch to  END
00185b20: 24620001 addiu r2,r3,0x0001               |r2 = YA + 1 (minimum of 1 YA)
00185b24: 3c018019 lui r1,0x8019                    |
00185b28: a42238d0 sh r2,0x38d0(r1)                 |Store 0x01 in Ability YA (minimum value)
00185b2c: 08061720 j 0x00185c80                     >>Jump to  END
00185b30: 00000000 nop                              |

 --- All Weapons - YA Section --- 
00185b34: 3c028019 lui r2,0x8019            |
00185b38: 90423902 lbu r2,0x3902(r2)        |r2 = Current Ability WP  0x80193902 / 80193902
00185b3c: 3c018019 lui r1,0x8019            |
00185b40: a42238d0 sh r2,0x38d0(r1)         |Store WP in current Ability YA

 --- SWORD - CROSSBOW - ROD - POLEARM - XA Section --- 
00185b44: 34020003 ori r2,r0,0x0003         |r2 = 0x03 (Sword Type flag)
00185b48: 10620007 beq r3,r2,0x00185b68     #If Weapon Type is not a Sword /Else Branch to Sword XA setting
00185b4c: 3402000b ori r2,r0,0x000b             |r2 = 0x0b (Crossbow type)
00185b50: 10620005 beq r3,r2,0x00185b68         #If Used Weapon is not a crossbow /Else Branch to Crossbow XA setting
00185b54: 34020007 ori r2,r0,0x0007                 |r2 = 0x07 (Rod Type)
00185b58: 10620003 beq r3,r2,0x00185b68             #If Used Weapon is not a Rod /Else Branch to Crossbow XA setting
00185b5c: 3402000f ori r2,r0,0x000f                     |r2 = f r2 = 0x0f (Polearm type)
00185b60: 14620005 bne r3,r2,0x00185b78                 #If Weapon is a Polearm /Else Avoid the [Sword - Crossbow - Rod - Polearm] Section
00185b64: 2482ffff addiu r2,r4,-0x0001                  |r2 = Used weapon Type - 0x01
00185b68: 3c018019 lui r1,0x8019            #E  #E  #E      |
00185b6c: a43038ce sh r16,0x38ce(r1)                        |Store Attacker PA as XA  0x801938ce / 801938ce 
00185b70: 08061720 j 0x00185c80                             >>Jump to END
00185b74: 00000000 nop                                      |

 ---  KNIFE - NINJA BLADE - BOW - THROWN - XA Section --- 
00185b78: 2c420002 sltiu r2,r2,0x0002       |r2 = 0x01 if Weapon Type is Knife or Ninja blade
00185b7c: 14400005 bne r2,r0,0x00185b94     #If Used Weapon is not a Knife/Ninja Blade /Else Branch to Knives - Ninja Blade XA setting
00185b80: 3402000c ori r2,r0,0x000c             |r2 = 0x0c (Bow Type flag)
00185b84: 10620003 beq r3,r2,0x00185b94         #If Used Weapon is not a Bow /Else Branch to Bow XA setting
00185b88: 34020020 ori r2,r0,0x0020                 |r2 = 0x20 (Thrown xeapon Type)
00185b8c: 14620007 bne r3,r2,0x00185bac             #If Used Weapon is a  Thrown Weapon (Stay) /Else Avoid the [Knife - Ninja blade - Bow - Thrown] Section
00185b90: 2482fffc addiu r2,r4,-0x0004              |r2 = Used weapon Type - 0x04
00185b94: 3c028019 lui r2,0x8019            #E  #E      |
00185b98: 8c422d94 lw r2,0x2d94(r2)                     |r2 =  Attacker's Data Pointer
00185b9c: 00000000 nop                                  |
00185ba0: 90420038 lbu r2,0x0038(r2)        |Load Target's SP r2 = Attacker's speed
00185ba4: 0806171d j 0x00185c74                         >>jumps to  nearly END Will Store (PA+Sp)/2 as XA
00185ba8: 02021021 addu r2,r16,r2                       |r2 = Attackers PA + Speed

 ---  KNIGHT SWORD - KATANA - XA Section --- 
00185bac: 2c420002 sltiu r2,r2,0x0002       |r2 = 0x01 If Used Weapon Type is Knight's sword or Katana
00185bb0: 10400010 beq r2,r0,0x00185bf4     #Branch if Used Weapon is a Knight  Sword/Katana /Else go to next section
00185bb4: 00b00018 mult r5,r16                  |Attacker Brave * PA
00185bb8: 00001812 mflo r3                      |r3 = Attacker Brave * PA
00185bbc: 3c0251eb lui r2,0x51eb                |
00185bc0: 3442851f ori r2,r2,0x851f             |r2 = 0,32*2^32
00185bc4: 00620018 mult r3,r2                   |Brave * PA * 0.32 * 2^32
00185bc8: 00031fc3 sra r3,r3,0x1f               |r3 = Higher bit of r3 (should be 0x00)
00185bcc: 00001010 mfhi r2                      |r2 = Brave * PA * 0.32
00185bd0: 00021143 sra r2,r2,0x05               |r2 = Attacker Brave * PA / 100
00185bd4: 00431823 subu r3,r2,r3                |
00185bd8: 3c018019 lui r1,0x8019                |
00185bdc: a42338ce sh r3,0x38ce(r1)             |Store Current Ability XA = Brave * PA / 100  0x801938ce
00185be0: 00031400 sll r2,r3,0x10               |r2 = XA * 2^16 (clear upper register keeping the halfword only ?)
00185be4: 14400026 bne r2,r0,0x00185c80         #If XA = 0x00 /Else branch to  END
00185be8: 24620001 addiu r2,r3,0x0001               |r2 = XA + 1 (min XA of 1)
00185bec: 0806171e j 0x00185c78                     >>Jump to Store XA (near END)
00185bf0: 00000000 nop                              |

 ---  STAFF - POLE - XA Section --- 
00185bf4: 34020008 ori r2,r0,0x0008         |r2 = 0x08 (Staff type flag)
00185bf8: 10620003 beq r3,r2,0x00185c08     #If Used Weapon is not a Staff /Else Branch to Staff section
00185bfc: 34020010 ori r2,r0,0x0010             |r2 = 0x10 (Pole Type flag)
00185c00: 14620005 bne r3,r2,0x00185c18         #If Used Weapon is a Pole /Else Avoid next section
00185c04: 34020006 ori r2,r0,0x0006             |r2 = 0x06 (Axe type flag)
00185c08: 3c018019 lui r1,0x8019            #E      |
00185c0c: a42638ce sh r6,0x38ce(r1)                 |Store Attacker's MA as Ability XA  0x801938ce
00185c10: 08061720 j 0x00185c80                     >>Jump to  END
00185c14: 00000000 nop                              |

 ---  AXE - FLAIL - BAG - XA Section --- 
00185c18: 10620005 beq r3,r2,0x00185c30     #If Used Weapon is not an Axe /Else branch to Axe section
00185c1c: 34020009 ori r2,r0,0x0009             |r2 = 0x09 (Flail Type flag)
00185c20: 10620003 beq r3,r2,0x00185c30         #If Used Weapon is not a Flail /Else branch to Flail section
00185c24: 34020011 ori r2,r0,0x0011                 |r2 = 0x11 (Bag Type flag)
00185c28: 1462000b bne r3,r2,0x00185c58             #If Used Weapon is a Bag /Else Avoid next section
00185c2c: 2482fff3 addiu r2,r4,-0x000d              |r2 = Used Weapon Type - 0x0d
00185c30: 0c063ba8 jal 0x0018eea0           #E  #E      | -->Random_Process,_gives_a_number_between_0-7fff Returns r2 between 0x00 and 0x7fff
00185c34: 00000000 nop                                  |
00185c38: 02020018 mult r16,r2                          |Attacker's PA * Random
00185c3c: 00001012 mflo r2                              |r2 = PA * Random
00185c40: 04410002 bgez r2,0x00185c4c                   #If PA * Random < 0x00
00185c44: 00000000 nop                                      |
00185c48: 24427fff addiu r2,r2,0x7fff                       |Make result positive
00185c4c: 000213c3 sra r2,r2,0x0f                       |r2 = Random between 0x00 and PA  ( = PA * Random/[Max Possible Random+1] )
00185c50: 0806171e j 0x00185c78                         >>Jump to Store XA (Random between 0x01 and PA)
00185c54: 24420001 addiu r2,r2,0x0001                   |r2 = Random Between 0x01 and PA

 ---  INSTRUMENT - BOOK - CLOTH - XA Section --- 
00185c58: 2c420002 sltiu r2,r2,0x0002       |r2 = 0x01 if used weapon Type is instrument or book
00185c5c: 14400004 bne r2,r0,0x00185c70     #If Used Weapon is not an Instrument/Book /Else Branch to MA+PA
00185c60: 30c200ff andi r2,r6,0x00ff        |r2 = Attacker's MA (byte)
00185c64: 34020012 ori r2,r0,0x0012             |r2 = 0x12 (Cloth Type flag)
00185c68: 14620005 bne r3,r2,0x00185c80         #If Used Weapon is a Cloth /Else Branch to END (no XA here for Guns)
00185c6c: 30c200ff andi r2,r6,0x00ff                |r2 = Attacker's MA (byte)
00185c70: 02021021 addu r2,r16,r2           #E      |r2 = Attacker's MA + PA
00185c74: 00021043 sra r2,r2,0x01               >j  | r2 = Pre-Xa/2 (MA+PA or PA+Speed)
00185c78: 3c018019 lui r1,0x8019                >j  |
00185c7c: a42238ce sh r2,0x38ce(r1)                 |Store r2 as Ability XA  0x801938ce
00185c80: 8fbf0014 lw r31,0x0014(r29)       END
00185c84: 8fb00010 lw r16,0x0010(r29)       
00185c88: 27bd0018 addiu r29,r29,0x0018     
00185c8c: 03e00008 jr r31                   
00185c90: 00000000 nop

Notes

  XA values
  0x01 - Knife         : XA = (PA+Speed)/2
  0x02 - Ninja Blade   : XA = (PA+Speed)/2
  0x03 - Sword         : XA = PA
  0x04 - Knight Sword  : XA = (Brave*PA)/100
  0x05 - Katana        : XA = (Brave*PA)/100
  0x06 - Axe           : XA = random (from 0x01 to PA)
  0x07 - Rod           : XA = PA
  0x08 - Staff         : XA = MA
  0x09 - Flail         : XA = random (from 0x01 to PA)
  0x0a - Gun           ---  
  0x0b - Crossbow      : XA = PA
  0x0c - Bow           : XA = (PA+Speed)/2
  0x0d - Instrument    : XA = (MA + PA)/2
  0x0e - Book          : XA = (MA + PA)/2
  0x0f - Polearm       : XA = PA
  0x10 - Pole          : XA = MA
  0x11 - Bag           : XA = random (from 0x01 to PA)
  0x12 - Cloth         : XA = (MA + PA)/2
  ...
  0x20 - Thrown weapon : XA = (PA+Speed)/2

Return Locations

Battle.bin
00188648: Weapon Damage Calculation
00188cbc: 05 Dmg_(Weapon)
00188d14: 06 AbsHP_(Weapon)
00188d4c: 07 Heal_(Weapon)
0018941c: 1D Hit_(X)%