Calculate Clockticks Until Unit Acts

From Final Fantasy Hacktics Wiki
Revision as of 08:58, 4 May 2023 by Orkney (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
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