Super Turbo HUD

Sup bitches? ATB bars implented.

[media=youtube]6TLs0j9uF70[/media]




008951: BNE 00895c ($9)
00895C: LDA $1700
00895F: CMP #$00
008961: BNE 00899d ($3a)
008963: LDA $1707  // Load 7E1707 into the accumulator
008966: LSRA  // Shift the byte right 2 times
008967: LSRA
008968: AND #$f8  // And it against 0xF8
00896A: STA $06  // Store the result in 0x7E0606
00896C: LDA $1706  // Load 0x7E1706 into the accumulator
00896F: LSRA // Shift the byte right 5 times
008970: LSRA
008971: LSRA
008972: LSRA
008973: LSRA
008974: CLC  // Clear the carry flag
008975: ADC $06  // Add the value at 0x70606 to the accumulator
008977: TAX  // Copy the value of the accumulator into register X
008978: LDA $0ec300,X  //  Load 0x0EC300 + Register X into the accumulator
00897C: STA $06  // Store the result into 0x7E0606
00897E: PHX  // Push Index Register X
00897F: PLY  // Pull Index Register Y
008980: LDA $c0 // This loads 7E06C0 into the accumulator, to zero out the accumulator
008982: BNE 008994 ($10)
008984: LDA $86  // Load 7E0686 into the accumulator
008986: TAX  // Copy the accumulators value into X
008987: LDA $14ee00,X // Load 0x14EE00 + X into the accumulator
00898B: CLC  // Clear the carry flag
00898C: ADC $17ef // Add 0x17EF to the accumulator
00898F: CMP $06  //  Compare the accumulator's value against 0x7E0606, if 0x7E0606 is greater than the accumulator, don't set the carry flag
008991: BCC 008994 ($1) // Branch on carry, if this does not branch, an encounter occurs


Random encounter subroutine reversed…now to make a script that tells me exactly how many more steps until an encounter occurs :).

STEP COUNTER, BITCHES:

[media=youtube]Rrk4DOgRJwU[/media]

Alright, not to get too off topic here, so last post about FF4.

[media=youtube]hqIvFWr-mTE[/media]

I can now predict what the next monster group will be…not gonna explain it this time because I’m lazy but if anyone is interested themselves, the value for the monsters is stored at 0x7E1800. It’s rather long on how it works but kinda simple. Anyways, the end result is at 008A16: STA $1800. Basically I did everything the assembler does ahead of time so I can predict which group is next.



008963: LDA $1707
008966: LSRA
008967: LSRA
008968: AND #$f8
00896A: STA $06 ;val1
00896C: LDA $1706
00896F: LSRA
008970: LSRA
008971: LSRA
008972: LSRA
008973: LSRA
008974: CLC
008975: ADC $06
008977: TAX  ;x1
008978: LDA $0ec300,X
00897C: STA $06
00897E: PHX
00897F: PLY
008980: LDA $c0
008982: BNE 008994 ($10)
008984: LDA $86
008986: TAX
008987: LDA $14ee00,X
00898B: CLC
00898C: ADC $17ef
00898F: CMP $06
008991: BCC 008994 ($1)
008994: PHY
008995: PLX
008996: LDA $0ec542,X
00899A: JMP $8a0b
008A0B: JSR $8ad2
008AD2: STA $3d
008AD4: STZ $3e
008AD6: ASL $3d
008AD8: ROL $3e
008ADA: ASL $3d
008ADC: ROL $3e
008ADE: ASL $3d
008AE0: ROL $3e
008AE2: LDA $c0
008AE4: BNE 008b01 ($1b)
008AE6: LDA $87
008AE8: TAX
008AE9: LDA $14ee00,X
008AED: CLC
008AEE: ADC $17ee
008AF1: INC $87
008AF3: BNE 008b03 ($e)
008B03: LDX $3d
008B05: CMP #$2b
008B07: BCC 008b28 ($1f)
008B09: INX
008B0A: CMP #$56
008B0C: BCC 008b28 ($1a)
008B0E: INX
008B0F: CMP #$81
008B11: BCC 008b28 ($15)
008B13: INX
008B14: CMP #$ac
008B16: BCC 008b28 ($10)
008B18: INX
008B19: CMP #$cc
008B1B: BCC 008b28 ($b)
008B1D: INX
008B1E: CMP #$ec
008B20: BCC 008b28 ($6)
008B22: INX
008B23: CMP #$fc
008B25: BCC 008b28 ($1)
008B27: INX
008B28: STX $3d
008B2A: RTS
008A0E: STZ $3e
008A10: LDX $3d
008A12: LDA $0ec796,X
008A16: STA $1800


Translated the encounter group portions to lua and wallah:



local function enemygroup()
    local group = 0
    local x = 0
    local x2 = 0
    local val1 = 0
    local val2 = 0
    local val3 = 0

    val1 = bit.band(bit.rshift(memory.readbyte(0x7E1707),2), 0xF8)
    x = (bit.rshift(memory.readbyte(0x7E1706),5) + val1)  % 0x100
    val2 = bit.lshift(memory.readbyte(0x0ec542+x),3)
    x2 = memory.readbyte(0x7E0687)
    val3 = (memory.readbyte(0x14ee00+x2) + memory.readbyte(0x7E17EE)) % 0x100

    if val3 > 0xFC  then
        val2 = val2 + 7
    elseif val3 > 0xEC then
        val2 = val2 + 6
    elseif val3 > 0xCC then
        val2 = val2 + 5
    elseif val3 > 0xAC then
        val2 = val2 + 4
    elseif val3 > 0x81 then
        val2 = val2 + 3
    elseif val3 > 0x56 then
        val2 = val2 + 2
    elseif val3 > 0x2B then
        val2 = val2 + 1
    end
    group =memory.readbyte(0x0ec796+val2)

    return group

end


So anyways, like I said, last post about FF2. I’ll be posting updates on my youtube channel if you’re interested in this.

About using the HUD with mame to train : what speed should one use to have the timings be as close as possible to the arcade ? I know that with ggpo it would be 0 or 1, but when training with an emulator offline, I have no idea.

MAME is a lot more accurate than Final Burn Alpha, so the emulation on mame-rr will be a lot closer to the arcade than fba-rr. I just use the default speed settings in mame-rr.

I went to the arcade after doing some training with mame, and I noticed that it was slightly slower. The giveaway was the timing to chain two stand lk’s when doing dic’s crossup combo (I did it too quickly so only one lk would come out). Turbo 1 seems the closest (for the world/us version : arcade t2 = mame t1).

This game has been broken… omg…

Good job…

Also, I feel the love in this thread bros, ST is the greatest:rock:

Pasky, make ST to run in actual speed 0, I mean, ST basically is a patch of The New Challengers :wonder:

Dammit has already done that for the Frame data collector.

how many of u guys did know Pasky didnt make it all by himself? shame of u Pasky! well, I guess imitation is the best form of flattery, n a couple of irony pics:

http://img855.imageshack.us/img855/3837/paskytrolled1.png

http://img855.imageshack.us/img855/3837/paskytrolled1.png

LOL, You’re fucken stupid.

:arazz::rofl:

You didn’t troll anyone but yourself…:rofl:

Blame my macro trollin button then :eek:

Ok, I’m too lazy to reverse damage because it takes a lot of tracing, eventually I will. I got the subroutine breakpoint address if anyone else wants to do it (the behind a round damage), not that I can’t, I just really don’t feel like it.

Is there anything anyone wants to have figured out that remains a mystery that doesn’t involve some video a top player did that gives me nothing to work with :P.

Yes, there are more mystery to solve.

I’m working on a idiot’s safe jump guide.

One thing we all know is that the opponent will wake up faster when knockdown in the corner.

Is that a constant factor or does it varies based on the distance to the corner or maybe something else?

(Another remotely related issue is ken’s knee bash loop (and other holds) vs opponent wake up time)

Oh like how far they jump off the ground when they come out of grabs? I always found that annoying because sometimes I wanna blanka ball behind them after a head bite in the corner for mixup but sometimes they fall quick, I’ll look into that.

Yeah that’s interesting too but what I described above is the number of frames needed for the opponent to get up after a knockdown.

Outside of the corner it’s a constant number of frames. When they are bounced off the corner during the knockdown, they get up faster. Which makes the safe jump timing much more difficult because you have to adjust it on the fly.

Show me a video so I know what to look for, I never noticed this.

never? LOL u noob

I seriously didn’t notice it. :stuck_out_tongue:

I know sometimes chars just wake up differently depending on what they get hit with, I had no idea a corner knockdown was always a quicker rise. I just thought it was random throughout the stage.