øAslickproductions.org/forum/index.php?PHPSESSID=5f0fck550j2m4m2fpbtkj2vkm1&topic=2313.msg26574e:/My Web Sites/Slick Productions - FFIV Message Board/slickproductions.org/forum/index95d7.htmlslickproductions.org/forum/index.php?PHPSESSID=5f0fck550j2m4m2fpbtkj2vkm1&action=profile;area=showposts;sa=topics;u=337e:/My Web Sites/Slick Productions - FFIV Message Board/slickproductions.org/forum/index95d7.html.zx±Ih^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÈà•¤ÅjOKtext/htmlISO-8859-1gzip@øÕÅjÿÿÿÿÿÿÿÿWed, 11 Mar 2020 02:31:38 GMT0ó°° ®0®P®€§²ð®±Ih^!Åj Instant ATB

Author Topic: Instant ATB  (Read 715 times)

Praetarius5018

  • Vargas
  • *
  • Posts: 88
    • View Profile
Instant ATB
« on: November 25, 2016, 02:57:37 PM »
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.
Code: [Select]
$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
Code: [Select]
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)

Code: [Select]
$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

Code: [Select]
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