Difference between revisions of "Calculate Clockticks Until Unit Acts"

From Final Fantasy Hacktics Wiki
Jump to navigation Jump to search
 
(2 intermediate revisions by the same user not shown)
Line 1: Line 1:
<font face='Courier New'>
+
BATTLE.BIN : Calculate Clockticks Until Unit Acts
  00199b98: 90860038 lbu r6,0x0038(r4) Load Unit's SP
+
------------------------------------------------------------------------------------------
  00199b9c: 3c03801a lui r3,0x801a
+
Parameters - r4 : Considered Unit data pointer (Battle stats)
  00199ba0: 2463f3c4 addiu r3,r3,0xf3c4
+
             
  00199ba4: 10c00010 beq r6,r0,0x00199be8 Branch if SP = 0
+
Returns r2 : Remaining Ticks before unit get an active turn
  00199ba8: 00002821 addu r5,r0,r0 Ticks = 0
+
              = 0x7fffffff if unit won't get a turn ever (crystal, treasure, petrified, etc...) 
  00199bac: 94820058 lhu r2,0x0058(r4) Load Unit's Current Statuses 1+2
+
-----------------------------------------------------------------------------------------
  00199bb0: 00000000 nop
+
  00199b98: 90860038 lbu r6,0x0038(r4)       |{{f/load|Load Unit's SP}}
  00199bb4: 30428140 andi r2,r2,0x8140
+
  00199b9c: 3c03801a lui r3,0x801a           |
  00199bb8: 1440000c bne r2,r0,0x00199bec Branch if Unit has Crystal/Treasure/Petrify
+
  00199ba0: 2463f3c4 addiu r3,r3,-0x0c3c      |{{f/adr|Start of AI data pointer}} {{f/std| 8019f3c4}}
  00199bbc: 3c027fff lui r2,0x7fff
+
  00199ba4: 10c00010 beq r6,r0,0x00199be8     {{f/Cond|If speed is not 0x00}}
  00199bc0: 90820001 lbu r2,0x0001(r4) Load Unit's ID
+
  00199ba8: 00002821 addu r5,r0,r0           |{{f/std|Initialize Tick counter}}
  00199bc4: 00000000 nop
+
  00199bac: 94820058 lhu r2,0x0058(r4)           |{{f/load|Load Unit's Current Statuses 1+2}}
  00199bc8: 00021100 sll r2,r2,0x04 ID * 16
+
  00199bb0: 00000000 nop                         |
  00199bcc: 00431021 addu r2,r2,r3
+
  00199bb4: 30428140 andi r2,r2,0x8140           |{{f/std|Check [Crystal], [Petrify] and [Treasure]}}
  00199bd0: 90421833 lbu r2,0x1833(r2) Load ?
+
  00199bb8: 1440000c bne r2,r0,0x00199bec         {{f/Cond|If Unit is not affected by Crystal, treasure or Petrify}}
  00199bd4: 00000000 nop
+
  00199bbc: 3c027fff lui r2,0x7fff               |{{f/std|<nowiki>r2 = 0x7fff0000</nowiki>}}
  00199bd8: 00021142 srl r2,r2,0x05 ? / 0x20
+
  00199bc0: 90820001 lbu r2,0x0001(r4)               |{{f/load|Load Unit's ID}}
  00199bdc: 30420001 andi r2,r2,0x0001 (could just AND 0x20)
+
  00199bc4: 00000000 nop                             |
  00199be0: 10400004 beq r2,r0,0x00199bf4 Branch if Unit doesn't need revived?
+
  00199bc8: 00021100 sll r2,r2,0x04                   |{{f/std|ID * 16 }}
  00199be4: 00000000 nop
+
  00199bcc: 00431021 addu r2,r2,r3                   |{{f/adr|Start of AI data pointer + Unit offset}}
  00199be8: 3c027fff lui r2,0x7fff
+
  00199bd0: 90421833 lbu r2,0x1833(r2)               |{{f/load|Load Unit's AI Targetting flags}} {{f/std|8019f3c4 + 0x182c + 0x07 + Unit offset}}
  00199bec: 08066720 j 0x00199c80 (could have just used FF)
+
  00199bd4: 00000000 nop                             |
  00199bf0: 3442ffff ori r2,r2,0xffff Turns = 0x7fffffff
+
  00199bd8: 00021142 srl r2,r2,0x05                   |{{f/std|Flag 0x20 becomes 0x01}}
  00199bf4: 9082005b lbu r2,0x005b(r4) Load Unit's Statuses 4
+
  00199bdc: 30420001 andi r2,r2,0x0001               |{{f/std|Check [Dead without reraise]}}
  00199bf8: 00000000 nop
+
  00199be0: 10400004 beq r2,r0,0x00199bf4             {{f/Cond|If Unit is dead without reraise}}
  00199bfc: 30420002 andi r2,r2,0x0002
+
  00199be4: 00000000 nop                                 |
  00199c00: 10400002 beq r2,r0,0x00199c0c Branch if Unit doesn't have Stop
+
  00199be8: 3c027fff lui r2,0x7fff           {{f/Cond|E        }} |{{f/std|<nowiki>r2 = 0x7fff0000</nowiki>}}
  00199c04: 00000000 nop
+
  00199bec: 08066720 j 0x00199c80                 {{f/Cond|E    }} |{{f/jump|jump to END and returns }} {{f/loc|<nowiki>r2 = 0x7fffffff</nowiki>}}
  00199c08: 90850063 lbu r5,0x0063(r4) Ticks = Stop CT
+
  00199bf0: 3442ffff ori r2,r2,0xffff                     |{{f/std|<nowiki>Turns = 0x7fffffff</nowiki>}}
  00199c0c: 90830039 lbu r3,0x0039(r4) Load CT
+
  00199c10: 00000000 nop
+
{{f/sec|--- Unit will eventually get an active Turn (Speed > 0, CT not frozen, alive) ---}}
  00199c14: 2c620064 sltiu r2,r3,0x0064
+
  00199bf4: 9082005b lbu r2,0x005b(r4)       |{{f/load|Load Unit's Statuses 4}}
  00199c18: 10400008 beq r2,r0,0x00199c3c Branch if CT >= 100
+
  00199bf8: 00000000 nop                     |
  00199c1c: 34020064 ori r2,r0,0x0064 r2 = 100
+
  00199bfc: 30420002 andi r2,r2,0x0002       |{{f/std|Check [Stop]}}
  00199c20: 00431023 subu r2,r2,r3 Remaining CT = 100 - CT
+
  00199c00: 10400002 beq r2,r0,0x00199c0c     {{f/Cond|If Unit has stop}}
  00199c24: 0046001a div r2,r6 Remaining CT / SP
+
  00199c04: 00000000 nop                         |
  00199c28: 00001012 mflo r2 r2 = Ticks Left
+
  00199c08: 90850063 lbu r5,0x0063(r4)           |{{f/load|Load Stop CT }} {{f/std|Remaining ticks before stops fade}}
  00199c2c: 00001810 mfhi r3 r3 = Remainder
+
  00199c0c: 90830039 lbu r3,0x0039(r4)       |{{f/load|Load Unit CT}}
  00199c30: 10600002 beq r3,r0,0x00199c3c Branch if Remainder = 0
+
  00199c10: 00000000 nop                     |
  00199c34: 00a22821 addu r5,r5,r2 Ticks += Ticks Left
+
  00199c14: 2c620064 sltiu r2,r3,0x0064       |{{f/std|Check if Unit CT is Above 100}}
  00199c38: 24a50001 addiu r5,r5,0x0001 Ticks += 1 (round ticks up)
+
  00199c18: 10400008 beq r2,r0,0x00199c3c     {{f/Cond|If Unit CT is > 100 (will get his turn right now)}}
  00199c3c: 90820058 lbu r2,0x0058(r4) Load Unit's Statuses 1
+
  00199c1c: 34020064 ori r2,r0,0x0064             |{{f/std|<nowiki>r2 = 100</nowiki>}}
  00199c40: 00000000 nop
+
  00199c20: 00431023 subu r2,r2,r3               |{{f/std|Remaining CT before active turn}}
  00199c44: 30420020 andi r2,r2,0x0020
+
  00199c24: 0046001a div r2,r6                   |{{f/std|Remaining CT / SP}}
  00199c48: 1440000d bne r2,r0,0x00199c80 Branch if Unit is Dead
+
  00199c28: 00001012 mflo r2                     |{{f/std|Remaining Ticks before turn (or close)}}
  00199c4c: 00a01021 addu r2,r5,r0 r2 = Ticks
+
  00199c2c: 00001810 mfhi r3                     |{{f/std|Remainder (0 if unit get his turns, not 0 if there's still a Tick before the turn)}}
  00199c50: 9082005c lbu r2,0x005c(r4) Load Unit's Statuses 5
+
  00199c30: 10600002 beq r3,r0,0x00199c3c         {{f/Cond|If remainder is not 0x00}}
  00199c54: 00000000 nop
+
  00199c34: 00a22821 addu r5,r5,r2               |{{f/std|Ticks before first active turn (with Stop CT or not)}}
  00199c58: 30420010 andi r2,r2,0x0010
+
  00199c38: 24a50001 addiu r5,r5,0x0001               |{{f/std|Add one ticks if needed}}
  00199c5c: 10400008 beq r2,r0,0x00199c80 Branch if Unit isn't Sleeping
+
  00199c3c: 90820058 lbu r2,0x0058(r4)       |{{f/load|Load Unit's Statuses 1}}
  00199c60: 00a01021 addu r2,r5,r0 r2 = Ticks
+
  00199c40: 00000000 nop                     |
  00199c64: 90840068 lbu r4,0x0068(r4) Load Sleep CT
+
  00199c44: 30420020 andi r2,r2,0x0020       |{{f/std|check [Dead]}}
  00199c68: 00000000 nop
+
  00199c48: 1440000d bne r2,r0,0x00199c80     {{f/Cond|If Unit is not Dead}} {{f/std|<nowiki>Else Dead with reraise - returns r2 = Ticks left</nowiki>}}
  00199c6c: 00a4102a slt r2,r5,r4
+
  00199c4c: 00a01021 addu r2,r5,r0           |{{f/std|Returns remaining Ticks before action}}
  00199c70: 10400003 beq r2,r0,0x00199c80 Branch if Ticks >= Sleep CT
+
  00199c50: 9082005c lbu r2,0x005c(r4)           |{{f/load|Load Unit's Statuses 5}}
  00199c74: 00a01021 addu r2,r5,r0 r2 = Ticks
+
  00199c54: 00000000 nop                         |
  00199c78: 00802821 addu r5,r4,r0 Ticks = Sleep CT
+
  00199c58: 30420010 andi r2,r2,0x0010           |{{f/std|check [Sleep]}}
  00199c7c: 00a01021 addu r2,r5,r0 r2 = Ticks
+
  00199c5c: 10400008 beq r2,r0,0x00199c80         {{f/Cond|If Unit is sleeping}} {{f/std|<nowiki>Else returns r2 = Ticks left</nowiki>}}
  00199c80: 03e00008 jr r31
+
  00199c60: 00a01021 addu r2,r5,r0               |{{f/std|<nowiki>r2 = Ticks</nowiki>}}
 +
  00199c64: 90840068 lbu r4,0x0068(r4)               |{{f/load|Load Sleep CT}}
 +
  00199c68: 00000000 nop                             |
 +
  00199c6c: 00a4102a slt r2,r5,r4                     |{{f/std|Check Ticks left Vs Sleep CT}} {{f/std| ? It's like sleep don't freeze CT}}
 +
  00199c70: 10400003 beq r2,r0,0x00199c80             {{f/Cond|If Ticks left > sleep CT }}
 +
  00199c74: 00a01021 addu r2,r5,r0                   |{{f/std|Returns Ticks left}}
 +
  00199c78: 00802821 addu r5,r4,r0                       |{{f/std|<nowiki>Ticks = Sleep CT</nowiki>}}
 +
  00199c7c: 00a01021 addu r2,r5,r0                       |{{f/std|<nowiki>Returns Tick left = sleep CT</nowiki>}}
 +
  00199c80: 03e00008 jr r31                   END
 
  00199c84: 00000000 nop
 
  00199c84: 00000000 nop
</font>
+
 
 +
=== Notes ===
 +
'''Mechanics'''
 +
Test Status freezing CT that will not fade
 +
Add Stop CT to the remaining Ticks
 +
 +
'''Bugs ?'''
 +
No checks for don't act ? (When looking to returns location, it seems this routine is focusing on the unit getting a turn or not, i guess the don't act check will occurs later)
 +
Sleep is checked as if the unit CT is not frozen
 +
 +
'''Hard coding'''
 +
AI checks Status ID and not [freeze CT] flag for Crystal, Treasure, Petrify and Stop
 +
 
 +
===Return Locations===
 +
'''BATTLE.BIN'''
 +
001942a4: [[Acting_Unit%27s_Data_Setup]]
 +
00194f14: [[Set_AI_ability_considerations_for_all_units_and_self]]
 +
00199918: [[Check_if_Regen/Charm/DM/Reraise/DA_Can_be_Inflicted]]
 +
0019e780: [[AI_Ability_Use_Decisions]]
 +
0019efe8: [[0019efb0_-_0019f018]]
 +
0019f114: [[See_if_ability_should_be_used_based_on_CT]]
 +
0019f230: [[Status/CT_based_decision]]

Latest revision as of 08:58, 4 May 2023

BATTLE.BIN : Calculate Clockticks Until Unit Acts
------------------------------------------------------------------------------------------
Parameters - r4 : Considered Unit data pointer (Battle stats)
             
Returns r2 : Remaining Ticks before unit get an active turn
             = 0x7fffffff if unit won't get a turn ever (crystal, treasure, petrified, etc...)  
-----------------------------------------------------------------------------------------
00199b98: 90860038 lbu r6,0x0038(r4)        |Load Unit's SP
00199b9c: 3c03801a lui r3,0x801a            |
00199ba0: 2463f3c4 addiu r3,r3,-0x0c3c      |Start of AI data pointer  8019f3c4
00199ba4: 10c00010 beq r6,r0,0x00199be8     #If speed is not 0x00 
00199ba8: 00002821 addu r5,r0,r0            |Initialize Tick counter
00199bac: 94820058 lhu r2,0x0058(r4)            |Load Unit's Current Statuses 1+2
00199bb0: 00000000 nop                          |
00199bb4: 30428140 andi r2,r2,0x8140            |Check [Crystal], [Petrify] and [Treasure]
00199bb8: 1440000c bne r2,r0,0x00199bec         #If Unit is not affected by Crystal, treasure or Petrify 
00199bbc: 3c027fff lui r2,0x7fff                |r2 = 0x7fff0000
00199bc0: 90820001 lbu r2,0x0001(r4)                |Load Unit's ID
00199bc4: 00000000 nop                              |
00199bc8: 00021100 sll r2,r2,0x04                   |ID * 16 
00199bcc: 00431021 addu r2,r2,r3                    |Start of AI data pointer + Unit offset
00199bd0: 90421833 lbu r2,0x1833(r2)                |Load Unit's AI Targetting flags 8019f3c4 + 0x182c + 0x07 + Unit offset
00199bd4: 00000000 nop                              |
00199bd8: 00021142 srl r2,r2,0x05                   |Flag 0x20 becomes 0x01
00199bdc: 30420001 andi r2,r2,0x0001                |Check [Dead without reraise]
00199be0: 10400004 beq r2,r0,0x00199bf4             #If Unit is dead without reraise
00199be4: 00000000 nop                                  |
00199be8: 3c027fff lui r2,0x7fff            #E          |r2 = 0x7fff0000
00199bec: 08066720 j 0x00199c80                 #E      |>>jump to END and returns  r2 = 0x7fffffff
00199bf0: 3442ffff ori r2,r2,0xffff                     |Turns = 0x7fffffff

--- Unit will eventually get an active Turn (Speed > 0, CT not frozen, alive) ---
00199bf4: 9082005b lbu r2,0x005b(r4)        |Load Unit's Statuses 4
00199bf8: 00000000 nop                      |
00199bfc: 30420002 andi r2,r2,0x0002        |Check [Stop]
00199c00: 10400002 beq r2,r0,0x00199c0c     #If Unit has stop
00199c04: 00000000 nop                          |
00199c08: 90850063 lbu r5,0x0063(r4)            |Load Stop CT  Remaining ticks before stops fade
00199c0c: 90830039 lbu r3,0x0039(r4)        |Load Unit CT
00199c10: 00000000 nop                      |
00199c14: 2c620064 sltiu r2,r3,0x0064       |Check if Unit CT is Above 100
00199c18: 10400008 beq r2,r0,0x00199c3c     #If Unit CT is > 100 (will get his turn right now)
00199c1c: 34020064 ori r2,r0,0x0064             |r2 = 100
00199c20: 00431023 subu r2,r2,r3                |Remaining CT before active turn
00199c24: 0046001a div r2,r6                    |Remaining CT / SP
00199c28: 00001012 mflo r2                      |Remaining Ticks before turn (or close)
00199c2c: 00001810 mfhi r3                      |Remainder (0 if unit get his turns, not 0 if there's still a Tick before the turn)
00199c30: 10600002 beq r3,r0,0x00199c3c         #If remainder is not 0x00
00199c34: 00a22821 addu r5,r5,r2                |Ticks before first active turn (with Stop CT or not)
00199c38: 24a50001 addiu r5,r5,0x0001               |Add one ticks if needed
00199c3c: 90820058 lbu r2,0x0058(r4)        |Load Unit's Statuses 1
00199c40: 00000000 nop                      |
00199c44: 30420020 andi r2,r2,0x0020        |check [Dead]
00199c48: 1440000d bne r2,r0,0x00199c80     #If Unit is not Dead Else Dead with reraise - returns r2 = Ticks left
00199c4c: 00a01021 addu r2,r5,r0            |Returns remaining Ticks before action
00199c50: 9082005c lbu r2,0x005c(r4)            |Load Unit's Statuses 5
00199c54: 00000000 nop                          |
00199c58: 30420010 andi r2,r2,0x0010            |check [Sleep]
00199c5c: 10400008 beq r2,r0,0x00199c80         #If Unit is sleeping Else returns r2 = Ticks left
00199c60: 00a01021 addu r2,r5,r0                |r2 = Ticks
00199c64: 90840068 lbu r4,0x0068(r4)                |Load Sleep CT
00199c68: 00000000 nop                              |
00199c6c: 00a4102a slt r2,r5,r4                     |Check Ticks left Vs Sleep CT  ? It's like sleep don't freeze CT
00199c70: 10400003 beq r2,r0,0x00199c80             #If Ticks left > sleep CT 
00199c74: 00a01021 addu r2,r5,r0                    |Returns Ticks left
00199c78: 00802821 addu r5,r4,r0                        |Ticks = Sleep CT
00199c7c: 00a01021 addu r2,r5,r0                        |Returns Tick left = sleep CT
00199c80: 03e00008 jr r31                   END
00199c84: 00000000 nop

Notes

Mechanics
Test Status freezing CT that will not fade
Add Stop CT to the remaining Ticks

Bugs ?
No checks for don't act ? (When looking to returns location, it seems this routine is focusing on the unit getting a turn or not, i guess the don't act check will occurs later)
Sleep is checked as if the unit CT is not frozen

Hard coding
AI checks Status ID and not [freeze CT] flag for Crystal, Treasure, Petrify and Stop

Return Locations

BATTLE.BIN
001942a4: Acting_Unit's_Data_Setup
00194f14: Set_AI_ability_considerations_for_all_units_and_self
00199918: Check_if_Regen/Charm/DM/Reraise/DA_Can_be_Inflicted
0019e780: AI_Ability_Use_Decisions
0019efe8: 0019efb0_-_0019f018
0019f114: See_if_ability_should_be_used_based_on_CT
0019f230: Status/CT_based_decision