Difference between revisions of "Calculate Clockticks Until Unit Acts"
Jump to navigation
Jump to search
(Created page with "<font face='Courier New'> 001999c8: 3c02801a lui r2,0x801a 001999cc: 90420d7b lbu r2,0x0d7b(r2) 001999d0: 27bdffc8 addiu r29,r29,0xffc8 001999d4: afb3002c sw r19,0x002c(...") |
|||
(3 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
− | < | + | 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) |{{f/load|Load Unit's SP}} | ||
+ | 00199b9c: 3c03801a lui r3,0x801a | | ||
+ | 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}} | ||
+ | 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}} | ||
+ | 00199bb0: 00000000 nop | | ||
+ | 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}} | ||
+ | 00199bbc: 3c027fff lui r2,0x7fff |{{f/std|<nowiki>r2 = 0x7fff0000</nowiki>}} | ||
+ | 00199bc0: 90820001 lbu r2,0x0001(r4) |{{f/load|Load Unit's ID}} | ||
+ | 00199bc4: 00000000 nop | | ||
+ | 00199bc8: 00021100 sll r2,r2,0x04 |{{f/std|ID * 16 }} | ||
+ | 00199bcc: 00431021 addu r2,r2,r3 |{{f/adr|Start of AI data pointer + Unit offset}} | ||
+ | 00199bd0: 90421833 lbu r2,0x1833(r2) |{{f/load|Load Unit's AI Targetting flags}} {{f/std|8019f3c4 + 0x182c + 0x07 + Unit offset}} | ||
+ | 00199bd4: 00000000 nop | | ||
+ | 00199bd8: 00021142 srl r2,r2,0x05 |{{f/std|Flag 0x20 becomes 0x01}} | ||
+ | 00199bdc: 30420001 andi r2,r2,0x0001 |{{f/std|Check [Dead without reraise]}} | ||
+ | 00199be0: 10400004 beq r2,r0,0x00199bf4 {{f/Cond|If Unit is dead without reraise}} | ||
+ | 00199be4: 00000000 nop | | ||
+ | 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 }} {{f/loc|<nowiki>r2 = 0x7fffffff</nowiki>}} | ||
+ | 00199bf0: 3442ffff ori r2,r2,0xffff |{{f/std|<nowiki>Turns = 0x7fffffff</nowiki>}} | ||
− | + | {{f/sec|--- Unit will eventually get an active Turn (Speed > 0, CT not frozen, alive) ---}} | |
− | + | 00199bf4: 9082005b lbu r2,0x005b(r4) |{{f/load|Load Unit's Statuses 4}} | |
− | + | 00199bf8: 00000000 nop | | |
− | + | 00199bfc: 30420002 andi r2,r2,0x0002 |{{f/std|Check [Stop]}} | |
− | + | 00199c00: 10400002 beq r2,r0,0x00199c0c {{f/Cond|If Unit has stop}} | |
− | + | 00199c04: 00000000 nop | | |
− | + | 00199c08: 90850063 lbu r5,0x0063(r4) |{{f/load|Load Stop CT }} {{f/std|Remaining ticks before stops fade}} | |
− | + | 00199c0c: 90830039 lbu r3,0x0039(r4) |{{f/load|Load Unit CT}} | |
− | + | 00199c10: 00000000 nop | | |
− | + | 00199c14: 2c620064 sltiu r2,r3,0x0064 |{{f/std|Check if Unit CT is Above 100}} | |
− | + | 00199c18: 10400008 beq r2,r0,0x00199c3c {{f/Cond|If Unit CT is > 100 (will get his turn right now)}} | |
− | + | 00199c1c: 34020064 ori r2,r0,0x0064 |{{f/std|<nowiki>r2 = 100</nowiki>}} | |
− | + | 00199c20: 00431023 subu r2,r2,r3 |{{f/std|Remaining CT before active turn}} | |
− | + | 00199c24: 0046001a div r2,r6 |{{f/std|Remaining CT / SP}} | |
− | + | 00199c28: 00001012 mflo r2 |{{f/std|Remaining Ticks before turn (or close)}} | |
− | + | 00199c2c: 00001810 mfhi r3 |{{f/std|Remainder (0 if unit get his turns, not 0 if there's still a Tick before the turn)}} | |
− | + | 00199c30: 10600002 beq r3,r0,0x00199c3c {{f/Cond|If remainder is not 0x00}} | |
− | + | 00199c34: 00a22821 addu r5,r5,r2 |{{f/std|Ticks before first active turn (with Stop CT or not)}} | |
− | + | 00199c38: 24a50001 addiu r5,r5,0x0001 |{{f/std|Add one ticks if needed}} | |
− | + | 00199c3c: 90820058 lbu r2,0x0058(r4) |{{f/load|Load Unit's Statuses 1}} | |
− | + | 00199c40: 00000000 nop | | |
− | + | 00199c44: 30420020 andi r2,r2,0x0020 |{{f/std|check [Dead]}} | |
− | + | 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>}} | |
− | + | 00199c4c: 00a01021 addu r2,r5,r0 |{{f/std|Returns remaining Ticks before action}} | |
− | + | 00199c50: 9082005c lbu r2,0x005c(r4) |{{f/load|Load Unit's Statuses 5}} | |
− | + | 00199c54: 00000000 nop | | |
− | + | 00199c58: 30420010 andi r2,r2,0x0010 |{{f/std|check [Sleep]}} | |
− | + | 00199c5c: 10400008 beq r2,r0,0x00199c80 {{f/Cond|If Unit is sleeping}} {{f/std|<nowiki>Else returns r2 = Ticks left</nowiki>}} | |
− | + | 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 | |
− | + | ||
− | + | === 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