Things you just don't understand about ST


O.K., everything you just wrote makes perfect sense. Good luck with medical stuff too. We’ll see about playing as well. If not, it’s all good too.

So back to business. I agree with most of your theory but not about everything. Hopefully my post will make sense here. Check this video out.

and go to 2:37. Obviously a completely different game, but hopefully my post will make sense here. Notice how the opponents gaurd bar is flashing, but as the person is getting hit by the custom combo, his guard bar is not going back to full, like it would as if he were not being hit or hitting his opponent. On the other hand, the attackers “gaurd bar” is filling up to normal.

OK, so in ST. I personally think that when you knock your opponent down, the “dizzy” bar remains at the same level throughout the fall and get up. Slightly different than the cvs2 example. My little “theory” doesn’t explain how dizzies start at the beginning of the match though. You know what i’m saying? that’s what i don’t get


Wouldn’t an accurate way to determine attack dizziness be to debug memory before and after hits (I think MAME comes with a debugger nowadays)? After you find the address for handling dizziness and set a counter there, you could directly test how much dizziness each attack averages. I’d do some tests myself but I’ve been busy lately.


theres a good amount of randomness to the dizzy system. one of the advantages of having really bad connect like mine is you see a lot of roll backs. so what happens when i hit someone, i see them dizzy, then it rolls back and when i hit them again with the same move, it doesn’t dizzy. but everything mentioned above about the med strength doing more dizzy does make since. I’m going to spend some time studying this. does anyone know if in training mode the dizzy system works the same? sometimes i feel like in training mode the dummy never gets dizzy or takes a ridiculous amount of hits to dizzy.


I did some messing around with MAME and I’m pretty sure address FF88AB is the dizzy counter for player 2 on World 940223. It gets incremented on every hit, counts down on every frame, and drops to zero on dizzy. It also will not increment when you hit someone that is dizzied or a short time after they recover, whether by mashing or being hit.

Doing some quick tests with Chun against Ken, close and far normals are 40 dizzy for light, 60 for medium, 80 for heavy. (I haven’t tested crouching yet.) Kikkoken is 90 for all strengths. This makes me think that the dizzy point is what is random, rather than what the moves themselves do.

Just tested a couple combos and I dizzied in one of them at 129, but another didn’t dizzy at 139, but then did at 151. Also, Chun’s diagonal jump fierce only does 60 dizzy, instead of 80 like the grounded ones.

LLs: 100 (I’ve gotten some crazy high dizzy numbers on this, like 211, finally dizzying with a 286)
cr. HK: 130
Jump attacks light: 40, medium: 50, heavy: 60
Neutral jump HK: 80

So, from the above, my guess of how the dizzy system works is that each move has a set amount it adds to the counter, but also a random range of values for the counter where it will dizzy. When you hit with a move, it increments the counter, then randomly decides what value will be enough to dizzy.


Interesting about the dizzies. Never knew!


Nice Job, Cauldrath!

What kind of software you used to search for the address? Some kind of cheat editor?
This approach is useful to research these mysterious ST riddles.

So how much dizzy does GMC gief’s neutral jump headbutt do?

It would be cool if we document all these dizzy value and put them into a comprehensive table, but that can be a lot of work.

Or if we can reverse engineer where the table is stored in the rom and just dump the table (like the move list hitbox table).

If we can dump the frame data table out it would be even more awesome.


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?