Calculate Clockticks Until Unit Acts
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