So I was tired of waiting for the ATB bar, and thought I'd share my changes.
What this does it:
instead of directly counting down remaining ATB, status ticks, etc.
we calculate in the first pass-through how many "ticks" would be needed until the next event (action, poison tick, etc.)
and in the second pass we subtract just that many.
Disadvantage is of course that you can no longer wait for the perfect moment to use jump to avoid specific attacks.
I'll use 2 seemingly unused enemy bytes for this:
7E2596 8th enemy "command 1"; we'll use this to calculate how many ATB ticks have to pass
7E2597 8th enemy "command 2"; 0x80 = calculation mode, otherwise update ATB
this function is used for ALL increases/checks of all status timer, ATB, jump, etc.
$C2/203C 20 55 20 JSR $2055 [$C2:2055] A:0000 X:0007 Y:0002 P:envMxdizc
$C2/2055 64 08 STZ $08 [$00:0008] A:0000 X:0007 Y:0002 P:envMxdizc
$C2/2057 5A PHY A:0000 X:0007 Y:0002 P:envMxdizc
$C2/2058 A4 0C LDY $0C [$00:000C] A:0000 X:0007 Y:0002 P:envMxdizc
$C2/205A B9 E4 3E LDA $3EE4,y[$7E:3EEB] A:0000 X:0007 Y:0007 P:envMxdizc
$C2/205D F0 2C BEQ $2C [$208B] A:0001 X:0007 Y:0007 P:envMxdizc
$C2/205F C0 0A 00 CPY #$000A A:0001 X:0007 Y:0007 P:envMxdizc <- branch for ATB, status effects check first if they are actually applied
$C2/2062 F0 05 BEQ $05 [$2069] A:0001 X:0007 Y:0007 P:eNvMxdizc <- change to F011 to go directly to our edited check
$C2/2064 AD 4E 47 LDA $474E [$7E:474E] A:0001 X:0007 Y:0007 P:eNvMxdizc
$C2/2067 D0 22 BNE $22 [$208B] A:0000 X:0007 Y:0007 P:envMxdiZc
$C2/2069 BD F1 3C LDA $3CF1,x[$7E:3CF8] A:0000 X:0007 Y:0007 P:envMxdiZc
$C2/206C F0 1D BEQ $1D [$208B] A:0001 X:0007 Y:0007 P:envMxdizc
$C2/206E 30 15 BMI $15 [$2085] A:0001 X:0007 Y:0007 P:envMxdizc
$C2/2070 BD 75 3D LDA $3D75,x[$7E:3D7C] A:0001 X:0007 Y:0007 P:envMxdizc <- needed ticks on regeneration gauge
$C2/2073 F0 08 BEQ $08 [$207D] A:0001 X:0007 Y:0007 P:envMxdizc
$C2/2075 DE 75 3D DEC $3D75,x[$7E:3D7C] A:0001 X:0007 Y:0007 P:envMxdizc <- we'll place a fitting JSL/JSR here
$C2/2078 BD 75 3D LDA $3D75,x[$7E:3D7C] A:0001 X:0007 Y:0007 P:envMxdiZc <- EA/use for missing JSL byte as needed
$C2/207B D0 08 BNE $08 [$2085] A:0000 X:0007 Y:0007 P:envMxdiZc
$C2/207D BD F1 3C LDA $3CF1,x[$7E:3CF8] A:0000 X:0007 Y:0007 P:envMxdiZc
$C2/2080 09 81 ORA #$81 A:0001 X:0007 Y:0007 P:envMxdizc
$C2/2082 9D F1 3C STA $3CF1,x[$7E:3CF8] A:0081 X:0007 Y:0007 P:eNvMxdizc
$C2/2085 A5 0C LDA $0C [$00:000C] A:0081 X:0007 Y:0007 P:eNvMxdizc
$C2/2087 D0 00 BNE $00 [$2089] A:0007 X:0007 Y:0007 P:envMxdizc
$C2/2089 E6 08 INC $08 [$00:0008] A:0007 X:0007 Y:0007 P:envMxdizc
$C2/208B 7A PLY A:0007 X:0007 Y:0007 P:envMxdizc
$C2/208C E8 INX A:0007 X:0007 Y:0002 P:envMxdizc
$C2/208D E6 0C INC $0C [$00:000C] A:0007 X:0008 Y:0002 P:envMxdizc
$C2/208F 60 RTS A:0007 X:0008 Y:0002 P:envMxdizc
external routine for $C2/2075
AD 97 25 LDA $2597 [$7E:2597]
29 80 AND #$80
F0 11 BEQ $11
---read mode---
AD 96 25 LDA $2596
38 SEC
FD 75 3D SBC $3D75,x[$7E:3D7C]
90 06 BCC
BD 75 3D LDA $3D75,x[$7E:3D7C]
8D 96 25 STA $2596
80 0E BRA skip apply
---apply mode---
BD 75 3D LDA $3D75,x[$7E:3D7C]
38 SEC
ED 96 25 SBC $2596 [$7E:2596]
B0 02 BCS $02
A9 00 LDA #$00
9D 75 3D STA $3D75,x[$7E:3D7C]
---end cases---
BD 75 3D LDA $3D75,x[$7E:3D7C]
6B RTL
At the end of each character's status/ atb check loop, it checks if we have to go to the next character or if we have finished all 12 possible characters (4 heroes + 8 enemies).
We'll expand the "finished" case for a mode change (calculate ticks <-> apply difference)
$C2/204E A5 0A LDA $0A [$00:000A] A:0000 X:0079 Y:000B P:envMxdizc <- we'll place a fitting JSL/JSR here
$C2/2050 C9 0C CMP #$0C A:000C X:0079 Y:000B P:envMxdizc <- this'll disappear into the JSL/JSR
$C2/2052 D0 BE BNE $BE [$2012] A:000C X:0079 Y:000B P:envMxdiZC
$C2/2054 60 RTS A:000C X:0079 Y:000B P:envMxdiZC
external routine for $C2/204E
A5 0A LDA $0A
C9 0C CMP #$0C
D0 11 BNE $11
---update mode---
AD 97 25 LDA $2597 [$7E:2597]
49 80 EOR #$80
8D 97 25 STA $2597 [$7E:2597]
29 80 AND #$80
F0 05 BEQ $05
A9 FF LDA #$FF
8D 96 25 STA $2596 [$7E:2596]
---end---
A5 0A LDA $0A
C9 0C CMP #$0C
6B RTL