Difference between revisions of "Calculate Clockticks Until Unit Acts"

From Final Fantasy Hacktics Wiki
Jump to navigation Jump to search
 
(One intermediate revision by the same user not shown)
Line 9: Line 9:
 
  00199b9c: 3c03801a lui r3,0x801a            |
 
  00199b9c: 3c03801a lui r3,0x801a            |
 
  00199ba0: 2463f3c4 addiu r3,r3,-0x0c3c      |{{f/adr|Start of AI data pointer}} {{f/std| 8019f3c4}}
 
  00199ba0: 2463f3c4 addiu r3,r3,-0x0c3c      |{{f/adr|Start of AI data pointer}} {{f/std| 8019f3c4}}
  00199ba4: 10c00010 beq r6,r0,0x00199be8    {{f/Cond|If speed is not 0x00}} / Else will returns 0x7fffffff
+
  00199ba4: 10c00010 beq r6,r0,0x00199be8    {{f/Cond|If speed is not 0x00}}  
 
  00199ba8: 00002821 addu r5,r0,r0            |{{f/std|Initialize Tick counter}}
 
  00199ba8: 00002821 addu r5,r0,r0            |{{f/std|Initialize Tick counter}}
 
  00199bac: 94820058 lhu r2,0x0058(r4)            |{{f/load|Load Unit's Current Statuses 1+2}}
 
  00199bac: 94820058 lhu r2,0x0058(r4)            |{{f/load|Load Unit's Current Statuses 1+2}}
 
  00199bb0: 00000000 nop                          |
 
  00199bb0: 00000000 nop                          |
 
  00199bb4: 30428140 andi r2,r2,0x8140            |{{f/std|Check [Crystal], [Petrify] and [Treasure]}}
 
  00199bb4: 30428140 andi r2,r2,0x8140            |{{f/std|Check [Crystal], [Petrify] and [Treasure]}}
  00199bb8: 1440000c bne r2,r0,0x00199bec        {{f/Cond|If Unit is not affected by Crystal, treasure or Petrify}} / Else ill return 0x7fffffff
+
  00199bb8: 1440000c bne r2,r0,0x00199bec        {{f/Cond|If Unit is not affected by Crystal, treasure or Petrify}}  
 
  00199bbc: 3c027fff lui r2,0x7fff                |{{f/std|<nowiki>r2 = 0x7fff0000</nowiki>}}
 
  00199bbc: 3c027fff lui r2,0x7fff                |{{f/std|<nowiki>r2 = 0x7fff0000</nowiki>}}
 
  00199bc0: 90820001 lbu r2,0x0001(r4)                |{{f/load|Load Unit's ID}}
 
  00199bc0: 90820001 lbu r2,0x0001(r4)                |{{f/load|Load Unit's ID}}
Line 27: Line 27:
 
  00199be4: 00000000 nop                                  |
 
  00199be4: 00000000 nop                                  |
 
  00199be8: 3c027fff lui r2,0x7fff            {{f/Cond|E        }} |{{f/std|<nowiki>r2 = 0x7fff0000</nowiki>}}
 
  00199be8: 3c027fff lui r2,0x7fff            {{f/Cond|E        }} |{{f/std|<nowiki>r2 = 0x7fff0000</nowiki>}}
  00199bec: 08066720 j 0x00199c80                {{f/Cond|E    }} |{{f/jump|jump to END and returns }} !!<nowiki>Xr2 = 0x7fffffff!!X</nowiki>
+
  00199bec: 08066720 j 0x00199c80                {{f/Cond|E    }} |{{f/jump|jump to END and returns }} {{f/loc|<nowiki>r2 = 0x7fffffff</nowiki>}}
 
  00199bf0: 3442ffff ori r2,r2,0xffff                    |{{f/std|<nowiki>Turns = 0x7fffffff</nowiki>}}
 
  00199bf0: 3442ffff ori r2,r2,0xffff                    |{{f/std|<nowiki>Turns = 0x7fffffff</nowiki>}}
 
   
 
   
Line 68: Line 68:
 
  00199c80: 03e00008 jr r31                  END
 
  00199c80: 03e00008 jr r31                  END
 
  00199c84: 00000000 nop
 
  00199c84: 00000000 nop
 +
 
=== Notes ===
 
=== Notes ===
 
  '''Mechanics'''
 
  '''Mechanics'''
Line 74: Line 75:
 
   
 
   
 
  '''Bugs ?'''
 
  '''Bugs ?'''
  No checks for don't act ?  
+
  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
 
  Sleep is checked as if the unit CT is not frozen
 
   
 
   
 
  '''Hard coding'''
 
  '''Hard coding'''
 
  AI checks Status ID and not [freeze CT] flag for Crystal, Treasure, Petrify and Stop
 
  AI checks Status ID and not [freeze CT] flag for Crystal, Treasure, Petrify and Stop
 +
 
===Return Locations===
 
===Return Locations===
 
  '''BATTLE.BIN'''
 
  '''BATTLE.BIN'''

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