http://www.elotrolado.net/w/images/f/f1/Super_Street_Fighter_2_X_Turbo_(Car)_001.jpg
dat cover
BTW, here is the hyper grab table:
http://img249.imageshack.us/img249/1738/tablelb.png
F7 = Speed 7 (fastest)
FA = Speed 6
FD = Speed 5
00 = Speed 4
03 = Speed 3
06 = Speed 2
09 = Speed 1 (Slowest)
09 x2
06 x3
03 x4
00 x14
FD x4
FA x3
F7 x2
So the chances for grab speeds are:
Speed 1 (0x09) = 6.25% [Slowest]
Speed 2 (0x06) = 9.375%
Speed 3 (0x03) = 12.50%
Speed 4 (0x00) = 43.75% [Default]
Speed 5 (0xFD) = 12.50%
Speed 6 (0xFA) = 9.375%
Speed 7 (0xF7) = 6.25% [Fastest]
So a lot of the randomness is actually just a normal distribution? Wasn’t this the same for wakeup throw invul?
-trolls suck-
No idea, never paid attention to that table. Most of the randomness comes from the number generator that is constantly cycling through numbers that determines which portion of the table is used.
Well the probabilites of a given grab show a normal distribution.
It is hashing the random number to get the hyper grab?
-trolls suck-
Every stage is 2B2 pixels wide. Your eyes are playing tricks on you.
Updated the script. Fixed the issue with the sprites not matching the hitbox. Apparently the emulator lua functions aren’t universal, so removing the loop which relied on emu.frameadvance to pause the script fixes the issue. Instead of using emu.registerfunction, it uses emu.registerbefore. This fixed the issue of the hitboxes being one frame ahead.
So now hitboxes should be displayed properly during their correct frame. This still doesn’t fix throw boxes not showing when they are clearly present on some moves, or at least on the startup of SRK for ken and ryu, didn’t test anything else, not sure what the issue with that is.
Either way, sprites should match hitboxes correctly now.
Removed the Axis toggle hotkey and it is now replaced with a enable/disable frameskip option.
Lua hotkey 4 will now disable or enable the frameskipping.
EDIT: Just tested, the script works fine in fba-rr. You must use the SoftFX Blitter. If you use the Basic the emulator will lag. If you use experimental the emulator will crash. Although there is no longer a reason to use FBA-rr because the hitboxes show on the correct frames now.
v1.6 is the latest.
Figured out where Block/Hit stun are located. It’s actually a combination of two memory addresses. The first address gets a value that when is decremented to zero both dummies move apart (this is when you hit someone and you are a pushed back a little). After that reaches zero another counter increments up until a specific point determined by the button pressed and when it reaches the peak you’re out of block stun.
May add this to the HUD if I have time. I actually wanna rewrite the whole thing with some new stuff I found and re-do the hitboxes myself. We’ll see if I get some time.
Do you think it will be possible to eventually fix the training mode lua with this knowledge? Or maybe just add such an option to your HUD. I have the impression that different hit and blockstun are the only issues at the moment.
What’s the current problem with it? I have no issues with it other than throws.
Hey, man: sorry for the late reply. The issue is what made it possible for skinny DSP to link cr.short into st.fierce or cr.RH - which is also possible in HDR, and not in VST. That is, in the very least, either hitstun is off by one frame or impact freeze is wrong.
The other mystery which I believe you would be able to elucidate is what the exact conditions for 4-hit MGU are. B2SPD’s hitbox images (in the wiki) show that after each hit, Dee Jay may enter some flashy animation which has a hitbox that causes a combo, or a more standard one that does not cause a combo, e.g., such as Ryu’s close/crouching Fierce, which never hit twice. Turbo and some particular piano sequences give the 4 hits, but I have always guessed you simply needed to press the button at the exact time. I am not sure, though: it might be a more complex scheme.
I’ve always been curious about what in the game’s engine allows for the reversal bugs for characters like T.Hawk and O.Dic. What kind of programming does one need to learn to dig into the system the way you guys do?
O.Dic bug? Never heard bout that. Which bug he has exactly?
If you use O.Dic’s Devil’s Reverse as a reversal, he will instead execute the last special you used.
[LIST]
[]A brain
[]MAME debugger (Launch mame with -debug switch)
MESS Debugger documentation http://www.ballyalley.com/ml/ml_tools/MESS_Debugger.txt (MESS and MAME use the same debugger, kinda old but still relevant)
[]Knowledge of assembly language, how to read it, follow it, step through it
[]Knowledge of 68000 ASM for most Capcom Arcade games http://www.cs.tcu.edu/people/professors/nute/systems/68K_Instr.pdf (Have fun)
[*]Common Sense
[/LIST]
It’s by no means a speedy process. It can take hours to just get minor progress on reversing functions, especially for newer systems. My favorite is reversing x86, probably because there are far more tools available which gives you a lot more control and I’m most familiar with x86.
It can take quite a while, but it’s very rewarding in the sense that you figured out how someone did something without them ever meaning to tell you. It’s like putting a puzzle together, one of the reasons I enjoy it as a hobby. I’m currently checking out Earthbound on the SNES since I’ve been playing through it when I found my cart last Wednesday.
If you want an example of how I usually start the process, I just found the damage function in Earthbound last night during my free time.
I started by initiating a battle and finding the enemies life. I used BSNES’s debugger (I love this emu, it’s so accurate), I then set a breakpoint when the enemies life was written to (i.e. took damage), before I set my last command to my party, I hit the tracer and attacked the enemy, the game paused when it’s life was written to and so did the tracing.
Now I have a 160MB text file of cpu instructions everywhere, however, I know that the very last one executed wrote to the enemies life because this is where the emulator paused (hit the breakpoint) so I know the decision for the game to determine if a critical hit was made is very close by, so I start at the end of the file and work my way back until I find it (it’s usually a jump statement, basically the assembly version of an IF statement in C/C++).
I usually make notes in the output so I can come back to it at a later date because I normally don’t have time for this during the week.
c281a6 jsr $698b [c2698b] A:0004 X:9ffa Y:00ff S:1fde D:1e63 DB:7e nvmxdIzc V:160 H: 334
c2698b rep #$31 A:0004 X:9ffa Y:00ff S:1fdc D:1e63 DB:7e nvmxdIzc V:160 H: 374
c2698d phd A:0004 X:9ffa Y:00ff S:1fdc D:1e63 DB:7e nvmxdIzc V:160 H: 392
c2698e pha A:0004 X:9ffa Y:00ff S:1fda D:1e63 DB:7e nvmxdIzc V:160 H: 420
c2698f tdc A:0004 X:9ffa Y:00ff S:1fd8 D:1e63 DB:7e nvmxdIzc V:160 H: 448
c26990 adc #$fff2 A:1e63 X:9ffa Y:00ff S:1fd8 D:1e63 DB:7e nvmxdIzc V:160 H: 460
c26993 tcd A:1e55 X:9ffa Y:00ff S:1fd8 D:1e63 DB:7e nvmxdIzC V:160 H: 478
c26994 pla A:1e55 X:9ffa Y:00ff S:1fd8 D:1e55 DB:7e nvmxdIzC V:160 H: 490
c26995 sta $04 [001e59] A:0004 X:9ffa Y:00ff S:1fda D:1e55 DB:7e nvmxdIzC V:160 H: 524
c26997 asl a A:0004 X:9ffa Y:00ff S:1fda D:1e55 DB:7e nvmxdIzC V:160 H: 598
c26998 adc $04 [001e59] A:0008 X:9ffa Y:00ff S:1fda D:1e55 DB:7e nvmxdIzc V:160 H: 610
c2699a asl a A:000c X:9ffa Y:00ff S:1fda D:1e55 DB:7e nvmxdIzc V:160 H: 644
c2699b asl a A:0018 X:9ffa Y:00ff S:1fda D:1e55 DB:7e nvmxdIzc V:160 H: 656
c2699c tax A:0030 X:9ffa Y:00ff S:1fda D:1e55 DB:7e nvmxdIzc V:160 H: 668
c2699d inx A:0030 X:0030 Y:00ff S:1fda D:1e55 DB:7e nvmxdIzc V:160 H: 680
c2699e inx A:0030 X:0031 Y:00ff S:1fda D:1e55 DB:7e nvmxdIzc V:160 H: 692
c2699f lda $d57b68,x [d57b9a] A:0030 X:0032 Y:00ff S:1fda D:1e55 DB:7e nvmxdIzc V:160 H: 704
c269a3 and #$00ff A:0001 X:0032 Y:00ff S:1fda D:1e55 DB:7e nvmxdIzc V:160 H: 740
c269a6 pld A:0001 X:0032 Y:00ff S:1fda D:1e55 DB:7e nvmxdIzc V:160 H: 758
c269a7 rts A:0001 X:0032 Y:00ff S:1fdc D:1e63 DB:7e nvmxdIzc V:160 H: 792
c281a9 cmp #$0001 A:0001 X:0032 Y:00ff S:1fde D:1e63 DB:7e nvmxdIzc V:160 H: 832
c281ac bne $81cd [c281cd] A:0001 X:0032 Y:00ff S:1fde D:1e63 DB:7e nvmxdIZC V:160 H: 850
c281ae ldx $a972 [7ea972] A:0001 X:0032 Y:00ff S:1fde D:1e63 DB:7e nvmxdIZC V:160 H: 862
c281b1 lda $0023,x [7ea23f] A:0001 X:a21c Y:00ff S:1fde D:1e63 DB:7e NvmxdIzC V:160 H: 896
c281b4 and #$00ff A:0000 X:a21c Y:00ff S:1fde D:1e63 DB:7e nvmxdIZC V:160 H: 936
c281b7 cmp #$0003 A:0000 X:a21c Y:00ff S:1fde D:1e63 DB:7e nvmxdIZC V:160 H: 954
c281ba beq $81c1 [c281c1] A:0000 X:a21c Y:00ff S:1fde D:1e63 DB:7e NvmxdIzc V:160 H: 972
c281bc cmp #$0004 A:0000 X:a21c Y:00ff S:1fde D:1e63 DB:7e NvmxdIzc V:160 H: 984
c281bf bne $81cd [c281cd] A:0000 X:a21c Y:00ff S:1fde D:1e63 DB:7e NvmxdIzc V:160 H:1002
c281cd lda $02 [001e65] A:0000 X:a21c Y:00ff S:1fde D:1e63 DB:7e NvmxdIzc V:160 H:1020
//63 damage in accumulator on next line
c281cf bne $81d6 [c281d6] A:003f X:a21c Y:00ff S:1fde D:1e63 DB:7e nvmxdIzc V:160 H:1054
c281d6 rep #$10 A:003f X:a21c Y:00ff S:1fde D:1e63 DB:7e nvmxdIzc V:160 H:1072
c281d8 ldx $02 [001e65] A:003f X:a21c Y:00ff S:1fde D:1e63 DB:7e nvmxdIzc V:160 H:1090
c281da lda $a972 [7ea972] A:003f X:003f Y:00ff S:1fde D:1e63 DB:7e nvmxdIzc V:160 H:1172
c281dd jsr $7eaf [c27eaf] A:a21c X:003f Y:00ff S:1fde D:1e63 DB:7e NvmxdIzc V:160 H:1206
c27eaf rep #$31 A:a21c X:003f Y:00ff S:1fdc D:1e63 DB:7e NvmxdIzc V:160 H:1246
c27eb1 phd A:a21c X:003f Y:00ff S:1fdc D:1e63 DB:7e NvmxdIzc V:160 H:1264
c27eb2 pha A:a21c X:003f Y:00ff S:1fda D:1e63 DB:7e NvmxdIzc V:160 H:1292
c27eb3 tdc A:a21c X:003f Y:00ff S:1fd8 D:1e63 DB:7e NvmxdIzc V:160 H:1320
c27eb4 adc #$ffe4 A:1e63 X:003f Y:00ff S:1fd8 D:1e63 DB:7e nvmxdIzc V:160 H:1332
c27eb7 tcd A:1e47 X:003f Y:00ff S:1fd8 D:1e63 DB:7e nvmxdIzC V:160 H:1350
c27eb8 pla A:1e47 X:003f Y:00ff S:1fd8 D:1e47 DB:7e nvmxdIzC V:160 H:1362
c27eb9 stx $04 [001e4b] A:a21c X:003f Y:00ff S:1fda D:1e47 DB:7e NvmxdIzC V:161 H: 32
c27ebb tay A:a21c X:003f Y:00ff S:1fda D:1e47 DB:7e NvmxdIzC V:161 H: 66
c27ebc sty $1a [001e61] A:a21c X:003f Y:a21c S:1fda D:1e47 DB:7e NvmxdIzC V:161 H: 78
c27ebe stz $18 [001e5f] A:a21c X:003f Y:a21c S:1fda D:1e47 DB:7e NvmxdIzC V:161 H: 112
c27ec0 lda $04 [001e4b] A:a21c X:003f Y:a21c S:1fda D:1e47 DB:7e NvmxdIzC V:161 H: 146
c27ec2 bne $7ed8 [c27ed8] A:003f X:003f Y:a21c S:1fda D:1e47 DB:7e nvmxdIzC V:161 H: 180
c27ed8 lda $000e,y [7ea22a] A:003f X:003f Y:a21c S:1fda D:1e47 DB:7e nvmxdIzC V:161 H: 198
c27edb and #$00ff A:0001 X:003f Y:a21c S:1fda D:1e47 DB:7e nvmxdIzC V:161 H: 238
c27ede cmp #$0001 A:0001 X:003f Y:a21c S:1fda D:1e47 DB:7e nvmxdIzC V:161 H: 256
c27ee1 bne $7f48 [c27f48] A:0001 X:003f Y:a21c S:1fda D:1e47 DB:7e nvmxdIZC V:161 H: 274
c27ee3 lda $0000,y [7ea21c] A:0001 X:003f Y:a21c S:1fda D:1e47 DB:7e nvmxdIZC V:161 H: 286
c27ee6 cmp #$00da A:0004 X:003f Y:a21c S:1fda D:1e47 DB:7e nvmxdIzC V:161 H: 326
c27ee9 bne $7f48 [c27f48] A:0004 X:003f Y:a21c S:1fda D:1e47 DB:7e NvmxdIzc V:161 H: 344
c27f48 ldy $1a [001e61] A:0004 X:003f Y:a21c S:1fda D:1e47 DB:7e NvmxdIzc V:161 H: 362
c27f4a lda $0013,y [7ea22f] A:0004 X:003f Y:a21c S:1fda D:1e47 DB:7e NvmxdIzc V:161 H: 396
c27f4d sta $02 [001e49] A:00c8 X:003f Y:a21c S:1fda D:1e47 DB:7e nvmxdIzc V:161 H: 436
c27f4f lda $000e,y [7ea22a] A:00c8 X:003f Y:a21c S:1fda D:1e47 DB:7e nvmxdIzc V:161 H: 470
c27f52 and #$00ff A:0001 X:003f Y:a21c S:1fda D:1e47 DB:7e nvmxdIzc V:161 H: 510
c27f55 beq $7f78 [c27f78] A:0001 X:003f Y:a21c S:1fda D:1e47 DB:7e nvmxdIzc V:161 H: 528
c27f57 lda $0000,y [7ea21c] A:0001 X:003f Y:a21c S:1fda D:1e47 DB:7e nvmxdIzc V:161 H: 580
c27f5a cmp #$005d A:0004 X:003f Y:a21c S:1fda D:1e47 DB:7e nvmxdIzc V:161 H: 620
c27f5d beq $7f7e [c27f7e] A:0004 X:003f Y:a21c S:1fda D:1e47 DB:7e NvmxdIzc V:161 H: 638
c27f5f cmp #$00c0 A:0004 X:003f Y:a21c S:1fda D:1e47 DB:7e NvmxdIzc V:161 H: 650
c27f62 beq $7f7e [c27f7e] A:0004 X:003f Y:a21c S:1fda D:1e47 DB:7e NvmxdIzc V:161 H: 668
c27f64 cmp #$00da A:0004 X:003f Y:a21c S:1fda D:1e47 DB:7e NvmxdIzc V:161 H: 680
c27f67 beq $7f7e [c27f7e] A:0004 X:003f Y:a21c S:1fda D:1e47 DB:7e NvmxdIzc V:161 H: 698
c27f69 cmp #$00db A:0004 X:003f Y:a21c S:1fda D:1e47 DB:7e NvmxdIzc V:161 H: 710
c27f6c beq $7f7e [c27f7e] A:0004 X:003f Y:a21c S:1fda D:1e47 DB:7e NvmxdIzc V:161 H: 728
c27f6e cmp #$00dd A:0004 X:003f Y:a21c S:1fda D:1e47 DB:7e NvmxdIzc V:161 H: 740
c27f71 beq $7f7e [c27f7e] A:0004 X:003f Y:a21c S:1fda D:1e47 DB:7e NvmxdIzc V:161 H: 758
c27f73 cmp #$00e5 A:0004 X:003f Y:a21c S:1fda D:1e47 DB:7e NvmxdIzc V:161 H: 770
c27f76 beq $7f7e [c27f7e] A:0004 X:003f Y:a21c S:1fda D:1e47 DB:7e NvmxdIzc V:161 H: 788
c27f78 ldx $04 [001e4b] A:0004 X:003f Y:a21c S:1fda D:1e47 DB:7e NvmxdIzc V:161 H: 800
c27f7a tya A:0004 X:003f Y:a21c S:1fda D:1e47 DB:7e nvmxdIzc V:161 H: 834
c27f7b jsr $71f0 [c271f0] A:a21c X:003f Y:a21c S:1fda D:1e47 DB:7e NvmxdIzc V:161 H: 846
c271f0 rep #$31 A:a21c X:003f Y:a21c S:1fd8 D:1e47 DB:7e NvmxdIzc V:161 H: 886
c271f2 phd A:a21c X:003f Y:a21c S:1fd8 D:1e47 DB:7e NvmxdIzc V:161 H: 904
c271f3 pha A:a21c X:003f Y:a21c S:1fd6 D:1e47 DB:7e NvmxdIzc V:161 H: 932
c271f4 tdc A:a21c X:003f Y:a21c S:1fd4 D:1e47 DB:7e NvmxdIzc V:161 H: 960
c271f5 adc #$fff0 A:1e47 X:003f Y:a21c S:1fd4 D:1e47 DB:7e nvmxdIzc V:161 H: 972
c271f8 tcd A:1e37 X:003f Y:a21c S:1fd4 D:1e47 DB:7e nvmxdIzC V:161 H: 990
c271f9 pla A:1e37 X:003f Y:a21c S:1fd4 D:1e37 DB:7e nvmxdIzC V:161 H:1002
c271fa stx $02 [001e39] A:a21c X:003f Y:a21c S:1fd6 D:1e37 DB:7e NvmxdIzC V:161 H:1036
c271fc tay A:a21c X:003f Y:a21c S:1fd6 D:1e37 DB:7e NvmxdIzC V:161 H:1070
c271fd lda $0013,y [7ea22f] A:a21c X:003f Y:a21c S:1fd6 D:1e37 DB:7e NvmxdIzC V:161 H:1082
//Enemy life is loaded into accumulator (0xc8)
c27200 sta $0e [001e45] A:00c8 X:003f Y:a21c S:1fd6 D:1e37 DB:7e nvmxdIzC V:161 H:1170
c27202 sta $04 [001e3b] A:00c8 X:003f Y:a21c S:1fd6 D:1e37 DB:7e nvmxdIzC V:161 H:1204
c27204 lda $02 [001e39] A:00c8 X:003f Y:a21c S:1fd6 D:1e37 DB:7e nvmxdIzC V:161 H:1238
c27206 cmp $04 [001e3b] A:003f X:003f Y:a21c S:1fd6 D:1e37 DB:7e nvmxdIzC V:161 H:1272
c27208 bcc $7211 [c27211] A:003f X:003f Y:a21c S:1fd6 D:1e37 DB:7e NvmxdIzc V:161 H:1306
c27211 lda $0e [001e45] A:003f X:003f Y:a21c S:1fd6 D:1e37 DB:7e NvmxdIzc V:161 H:1324
c27213 sec A:00c8 X:003f Y:a21c S:1fd6 D:1e37 DB:7e nvmxdIzc V:161 H:1358
//Subtraction occurs next line (0xC8 - 0x3F == 0x89), accumulator holds result
c27214 sbc $02 [001e39] A:00c8 X:003f Y:a21c S:1fd6 D:1e37 DB:7e nvmxdIzC V:162 H: 6
c27216 tax A:0089 X:003f Y:a21c S:1fd6 D:1e37 DB:7e nvmxdIzC V:162 H: 40
c27217 tya A:0089 X:0089 Y:a21c S:1fd6 D:1e37 DB:7e nvmxdIzC V:162 H: 52
c27218 jsr $7126 [c27126] A:a21c X:0089 Y:a21c S:1fd6 D:1e37 DB:7e NvmxdIzC V:162 H: 64
c27126 rep #$31 A:a21c X:0089 Y:a21c S:1fd4 D:1e37 DB:7e NvmxdIzC V:162 H: 104
c27128 phd A:a21c X:0089 Y:a21c S:1fd4 D:1e37 DB:7e NvmxdIzc V:162 H: 122
c27129 pha A:a21c X:0089 Y:a21c S:1fd2 D:1e37 DB:7e NvmxdIzc V:162 H: 150
c2712a tdc A:a21c X:0089 Y:a21c S:1fd0 D:1e37 DB:7e NvmxdIzc V:162 H: 178
c2712b adc #$ffee A:1e37 X:0089 Y:a21c S:1fd0 D:1e37 DB:7e nvmxdIzc V:162 H: 190
c2712e tcd A:1e25 X:0089 Y:a21c S:1fd0 D:1e37 DB:7e nvmxdIzC V:162 H: 208
c2712f pla A:1e25 X:0089 Y:a21c S:1fd0 D:1e25 DB:7e nvmxdIzC V:162 H: 220
c27130 txy A:a21c X:0089 Y:a21c S:1fd2 D:1e25 DB:7e NvmxdIzC V:162 H: 254
c27131 sty $10 [001e35] A:a21c X:0089 Y:0089 S:1fd2 D:1e25 DB:7e nvmxdIzC V:162 H: 266
c27133 tax A:a21c X:0089 Y:0089 S:1fd2 D:1e25 DB:7e nvmxdIzC V:162 H: 300
c27134 lda $0015,x [7ea231] A:a21c X:a21c Y:0089 S:1fd2 D:1e25 DB:7e NvmxdIzC V:162 H: 312
c27137 sta $0e [001e33] A:0155 X:a21c Y:0089 S:1fd2 D:1e25 DB:7e nvmxdIzC V:162 H: 352
c27139 sta $02 [001e27] A:0155 X:a21c Y:0089 S:1fd2 D:1e25 DB:7e nvmxdIzC V:162 H: 386
c2713b tya A:0155 X:a21c Y:0089 S:1fd2 D:1e25 DB:7e nvmxdIzC V:162 H: 420
c2713c cmp $02 [001e27] A:0089 X:a21c Y:0089 S:1fd2 D:1e25 DB:7e nvmxdIzC V:162 H: 432
c2713e bcc $7147 [c27147] A:0089 X:a21c Y:0089 S:1fd2 D:1e25 DB:7e NvmxdIzc V:162 H: 466
c27147 lda $000e,x [7ea22a] A:0089 X:a21c Y:0089 S:1fd2 D:1e25 DB:7e NvmxdIzc V:162 H: 484
c2714a and #$00ff A:0001 X:a21c Y:0089 S:1fd2 D:1e25 DB:7e nvmxdIzc V:162 H: 524
c2714d bne $7187 [c27187] A:0001 X:a21c Y:0089 S:1fd2 D:1e25 DB:7e nvmxdIzc V:162 H: 582
c27187 tya A:0001 X:a21c Y:0089 S:1fd2 D:1e25 DB:7e nvmxdIzc V:162 H: 600
//Store the result at the enemies life address
c27188 sta $0011,x [7ea22d] A:0089 X:a21c Y:0089 S:1fd2 D:1e25 DB:7e nvmxdIzc V:162 H: 612
//damage done to enemy was 63
//Life remaining for enemy was 137
You can see a couple of notes I made (denoted by ‘//’). I’m fairly certain the decision the game makes on whether a critical hit is made is in that area. But basically that’s roughly how I start off. The next step is to pick an instruction and start stepping through the code (executing 1 line at a time) to determine where it is, this is the tedious part, especially if the game makes a lot of jumps or loops.
One of these days I’ll stream my desktop with me reverse engineering a game of the audiences choice to search for an item of their choice. I think that would be pretty fun.
Damn pasky how much spare time do you have?
blah too much to read.
Not a lot actually. lol
That took me about 5 minutes total to find and wrote that during lunch (while moving check stubs :P)
Wow.
Does your job require assembly or is that just your hobby?
Hobby. People are passionate about what they enjoy.