Things you just don't understand about ST

I used MAME’s cheat search and just did comparisons until it left a single address. Although, I’m starting to think there is something else determining dizzies, because when I make a cheat locking that address to a certain value, it seems to act the same as if I hadn’t done that.

You need to set a breakpoint at the dizzy value address. Find out what reads from it and step through the assembly code, that way you can find the threshold or the flag (whichever it uses) that determines when the dizzy occurs that way. Just looking at the value really won’t do anything unless you find out what is reading the value and how it is interpreted.

Yeah, because I totally want to step through the undoubted mess that is the Street Fighter 2 codebase with the added bonus of having to disassemble it from a ROM instead of having real code. I don’t even know where I could get an arcade ROM disassembler. There’s a HUGE difference between doing a few comparisons of RAM and stepping through disassembled code. Like, I’d-better-be-getting-paid-a-lot-for-this-and-get-a-few-weeks-to-do-it difference, even if someone else provided the disassembler.

Mess? If you just find out what reads the address there is no mess, why would you be disassembling a ROM? You need to debug it…That’s pretty funny that you think it’d be weeks though, it took me 30 minutes to find it.

PRO TIP…“mame.exe -debug” ;).

Interesting stuff guys. Thanks to everyone that’s responded.

Can you list your findings?

I feel like the Dreamcast training mode dizzies like real ST does after the round is past the 10 second mark, it does seem harder and I get less random dizzies than in real matches, but TODs are consistent.

Doesn’t the Yoga Book Hyper already list dizzy averages for every attack?

Nope, only damage averages.

OK, I was using MAME 0.117, which didn’t have that feature yet. The debug mode seems to be a fairly standard programming debug through disassembled code which is a little better than just pure disassembly. I’m not really familiar with MAME, though, and my old ST ROM isn’t working with the newer version of MAME, so I’m trying some other ones.

If you found it in 30 minutes, I’d be curious to know what you found. If it was just finding where that address was written to or read from, that is only step 1.

IIRC, the new version of M.A.M.E. has the ROM from SSF2X as the parent one. There is some stuff about it on the thread about hitboxes, which uses a version of MAME with recording tools (MAME-rr, if I ain’t mistaken).

Thanks, got it working. Throwing watchpoints on FF88AB, I found these two spots where it gets written to, with all reads in the same general area:

77EE2 subq.w #1, ($5c,A6)

7F134 add.w D1, ($5c,A6)

The first is where it gets decremented every frame, and the second is where the dizzy value gets added. There’s some really weird syntax where it loads D1 in the second, though. The value in A6 is FFFF884E, so this makes me think that there is a struct at that address for the state of player 2 and 5c is the offset to the dizzy value, so watching all the data in there could be useful. (Player 1 looks to be FFFF844E.) I’m a C++ programmer, so stepping through assembly isn’t really my thing and theres a lot of opcodes I don’t know following where the value gets added.

EDIT: Weird stuff. The above write was where jump in attacks get set. Grounded attacks are at 7F10C, as well as Chun’s neutral j. hk. (Perhaps the game thinks it’s a grounded normal, which would explain why it doesn’t hit overhead?) Specials and super are at 7F1BE. (Chun’s super and upkicks are 20, btw. The super tops off at a total of 64.) Chun’s cr. hk is at 7F14E and is a hard-coded 130, unlike the others which retrieve their numbers. Lightning Legs is also hard-coded at 7F17E with 100.

The specials are a bit easier to figure out what is going on, since it just adds 2 to the address in register A0 to pull out the dizzy number. Kikkoken, for example, is at 7EEBC, offset 2 to 7EEBE, which has a value of 90.

There’s another address that always get changed right before this one, register A5 - 0x5714. A5 seems to always be FF8000 when P1 hits P2, so the address written to is FF28EC.

The number that gets written there is a random number within a certain range for different attacks. It isn’t the damage, since the numbers don’t line up and jabs sometimes come up with a zero.

That number gets multiplied by 256 and gets added to FF88AC. It stays at that value until the value in FF88AA drops to zero, and then it drops to zero, too. It’s likely that this is the real dizzy value and the other number was a dizzy timer, so it seems like as long as you hit your opponent again before the dizzy timer drops to zero, it retains all the accumulated dizzy. It seems like dizzy happens at 7680, so 30 total dizzy from the smaller original number.

So, so if I were setting something up to look for this stuff, put watch points like this: (all 8-bit)
Dizzy: FF88AD
Dizzy Timer: FF88AB
Last Attack Dizzy: FF28ED

I’d like to know how the damage variance works regarding different characters, like how Zangief takes less damage than everyone else and how some characters like Vega are easier to dizzy according to the wiki. I always thought it was strange how Zangief’s mashing throws do more damage vs himself (assuming it does 4 hits) than fierce SPD’s most of the time despite the base damage values implying otherwise (30 for fierce SPD vs 18 + 3x3 for mashing throws). Since you guys are poking around the engine maybe we will get some concrete answers and numbers on the subject. It feels like Chun’s throw does more damage to Zangief than SPD’s to put it in perspective, although that could just be cuz its hax :sad:.

Awesome, I’m glad you’re on your way to unlocking the secrets of the dizzy system through debugging. If you try Zangief’s ju.u+MP/HP, does that correspond with what you’d expect from those addresses?

yeah, shout out to Cauldrath. The information you’ve posted thus far has been very interesting.

Some other questions I have are:

Does the dizzy system “counter” restart after the end of a round?

Does the dizzy system “timer” restart after blocked attacks. I.E. Does keeping your opponent in block stun a good idea if you want to dizzy them?

Dizzy, damage (health), charge, super meter level, the timer, everything resets. Every round is a fresh start.

The stun meter also is larger during a dizzy which is why you can’t re-dizzy with any of the ToD combos in ST. The only re-dizzy with an ST character that I’ve seen involves Zangief (j.rh, cr.jab x2, headbutt).

The only thing that I believe changes after a round is a value that slightly augments the throw damage of the person who lost the first round. It’s a built in comeback mechanic where the person who lost the opening round gets a slight (almost unnoticeable) damage boost to normal throws (and possible attacks). I have no idea where I first heard of this and I might be confusing it with another game. But I swear it was ST…:confused:

Your stun meter is always decreasing unless you are taking damage (and therefore taking on stun). The second you get knocked down, put into block stun, or simply run away from your opponent, you automatically start decreasing your stun amount. Your stun is always decreasing unless you are getting hit.

So if you’re opponent is one hit away from dizzy, and then they block your next eight attacks, and then you connect with the ninth right out of block stun, it won’t dizzy them, as their stun meter will most likely have reduced itself to zero by then. If your opponent is one attack away from being dizzied then you want to land that next attack (or throw) as quickly as possible before they reduce their stun meter to a point where one attack will not dizzy them.

Zangief’s neutral j. headbutt does 21-27 dizzy, and has a dizzy timer of 100. Keep in mind this is for the world version.
Dizzy and the dizzy timer reset to zero between rounds. The last hit’s dizzy value does not.
Zangief, Claw, and Ken all dizzy at 30.
The dizzy timer is not affected at all by blocked attacks.
The dizzy timer and dizzy meter are locked at zero for about a second after dizzy ends, so to redizzy you’ll need a combo that generates enough dizzy after that time ends. For Zangief’s j. rh, cr. jab x 2, headbutt, the j. rh and cr. jabs come out before the timer is up, so the headbutt needs to do enough dizzy by itself.
As for the throw comeback mechanic, if you look at T. Akiba’s throw damage data, he has different damages listed for when the player is behind.

When I use the built-in cheat to change it to the Japanese version, Zangief’s headbutt does 28-35 dizzy, but the numbers when the opponent is actually dizzied are inconsistent. Like, I’ll go do a headbutt and dizzy with 31, but then I’ll do one for 30, a jab for 2 more, and they still won’t be dizzied until the 3rd one. So, there is probably some truth to dizzies happening easier at the beginning of the round in the Japanese version.

EDIT: I did some more checking and there is a counter at FF8AFF that goes up by 2 every time an opponent is dizzied, and this counter is offset into a table at 7F1C6, which stores the values for when an opponent is dizzied. The first number is 30, followed by 34, followed by 14 35s. If you dizzy someone 16 times, it resets the counter to 2, so they can be dizzied with 34 again. These numbers are from the world version.

Looking into throws, I found the line where the damage is calculated and, at least for Chun and Zangief, all normal throws and SPD pull their values out on the same line of code. Chun’s strong throw damage is at 24E7C4. Both her fierce and Gief’s strong/forward throws are at 24E784. Gief’s fierce first hit is at 24E704, and later hits are at 24E764. Jab SPD is at 24E7E4, but interestingly enough, it starts out at 44 damage, but then that value is multiplied by 5, divided by 32, and then subtracted from the 44, so it drops to 38. The rest are just directly subtracted from the health value at FF8879 for player 2, so they would ignore damage scaling.

Health is also weird. There’s values at FF887B and FF8A0B that mimic the above health value over time, but aren’t immediately updated to match. FF887B looks like it is a previous health value, updated each frame to match the current health, and FF8A0B has something to do with the displayed health. If I lock FF8879 to max health, though, the displayed health drops to nothing and FF8A0B cycles constantly.

lol I dunno anything about frame data hacking mame codes whatever. But I just showed corrosion for like 45 mins going through a large portion of the cast. And its what I said. Mediums tend to do more dizzy in general through out the characters. So… if those codes are the dizzy then there must be another code that also goes with it because just by that its wrong.

You can do the same combo with hards, and with mediums all that stuff. And well yea almost every character follows a similar patter to what I described. There is a bit of randomness in the game, but in general its actaully pretty possible to know when your going to dizzy and when you wont.

Also to my knowledge sim and vega dizzy teh fastest. they are the characters that 2 hit dizzy combos work on the most as well. And I don’t think ive seen any other character get dizzy period off a 2 hit dp besides them as well… shrug

Yeah, I don’t know about quoting Yoga Book Hyper but I saw a guy basically run through stuff he knows works… and, well, it all worked. Learned quite a few cool things in the process. Especially about the usefulness of jump toward medium attacks and then how you can react if it doesn’t dizzy post hit.

Sorry if there’s any confusion with the numbers I posted for the dizzy timers. Those aren’t the numbers that actually determine when a character is dizzied, but how long they keep the amount of dizzy they’ve already accumulated. I was planning on continuing work on Big O’s question, but I could start making a list of the amount of dizzy different attacks do. Please specify a version (World, Japan, USA, etc.) and a character if you want that, though, since I don’t really feel like figuring it out for all of them.

Also, at the start of the round, Claw, Ken, and Zangief all dizzy at 30. I haven’t checked to see if the dizzies past the first one are on different tables, but they likely aren’t, so they should all dizzy at the same rate, assuming attacks do the same amount of dizzy to them.

EDIT:
A small sample for the world version: (These may not be 100% inclusive ranges, but are just the numbers I observed when doing these attacks repeatedly.)
Chun hitting Ken
cl. mp 5-10
st. mp 6-11
cl. hp 11-15
st. hp 11-15
Zangief hitting Claw
cl. mp 7-12
st. mp 6-12
cl. hp 11-17
st. hp 10-18