SSF2T: The quest for the perfect training mode

Since I started playing ST a few months ago I wanted to have a training mode on MAME like the one available on the Sega Dreamcast port. I collected all the available training mode cheats but none of them convinced me, so I studied all them, fixed some of the glitches and finally end up taking the best of each one to write my own.

The first usable training mode cheat was made by Pasky, he explained it very well in this comment, the main problem with his cheat is that the stun meter stops working properly after the health bar is recharged and the cheat has to disable stun, so the players never get dizzy. The cheat is interesting because he hooks the game code to make it jump into his own subroutine that refills the health bar for both players. This cheat only recharges the bars after hit damage, but not after throw damage.

After that, there was a new training mode cheat made by d9x/dammit. It is way easier because it only recharges the health bar when the dummies are at a certain state (for example after being hit). We can see the value of this state at memory address FF8451 (or 0x400 more for P2). This allows the stun meters to work properly, so characters can get dizzy normally, however it still has some glitches like sometimes when the health is recharged opponent gets hit or pushed back.

In both Pasky and d9x cheats, the health bar can’t be empty (if this happens the round will end). This is one of the things that bothered me, because you can’t get an idea of how much damage you would do, for example with a 5-hit combo, as the bar is refilled very quickly after every hit or when it reaches a certain value.

Not long ago, jedpossum published a new training mode, which has the particularity that even after the health bar is empty, the game continues. However it has a few new glitches, like the player’s vertical position after a wall throw is sometimes messed up, and there’s the K.O. slowdown present when the health bar reaches zero.

So I took the ability to reach an empty health bar from jedpossum’s cheat, and the memory position to control the player state from d9x cheat and created my own training mode cheat, here is an explanation of the memory values I used:

ff8451: player state, a value of 0 means standing, a value of 2 means crouching, a value of 0xE means after a hit, a value of 0x14 means after a throw, etc..
ff8478: the real health value for PL1, range from 0 to 0x90, set to ffff when the round ends.
ff847a: a copy of the health value for PL1, range from 0 to 0x90, it’s not modified when the round ends.
ff860a: the health bar meter HUD display value, range from 0 to 0x90.
4c94,4a78,4db0,be64e,bebae: when the round ends, the game engine will take the value from here (0xffff) and change the player’s health value at ff8478 with that.
FF82F2: Slowdown value, when set to 0 there’s no slowdown.
FF84AD, FF84AE, FF84AB: stun meter, stun counter, dizzy meter

Basically what my cheat does is recharge health when both players are idle (with a “timer” so we can delay it, useful if we want to look at how much damage our last hit has done). It will also recharge health when the round is about to end, in two different ways:

1. when the player is hit or thrown, and his energy is less than 0xf
2. when the round has actually ended, preventing it to really end

If the last hit (or throw) does less damage than 0xf, the energy will be recharged before the round actually really ends. If the last hit (or throw) does more damage than 0xf the round will “end”, but we disable the K.O. slowdown and recharge the health really quick so the round continues and no noticeable slowdown happens.

Here you can see the training mode in action:

Another thing that the Dreamcast training mode has is that you can force the PL2 dummy to do a certain action, for example always crouch or jump. This is useful for practicing some combos and can be done with macros using mame-rr, but Ange Albertini suggested me to do it on a mame cheat, so I thought challenge accepted, and I also wrote a complementary cheat to control the dummy’s repetitive movement… so it’s even better than the dreamcast training mode now :)

super turbo training mode

This time I’ve decided to share my cheat file on github, instead of publishing all the cheats separately, so grab it and if you try my new training mode let me know what do you think in the comments!

Enjoy! :)

UPDATE: New download bundle with mame-rr, training mode cheat, hitbox viewer, input display and Sako training. All you need to do is put the roms ( and in the “roms” folder):

This entry was posted in SuperTurbo and tagged , , , , . Bookmark the permalink.

6 Responses to SSF2T: The quest for the perfect training mode

  1. DJKevgeez says:

    Thx bro! I have been lookin for a way to polish Touch of Deaths

  2. TrickNachos2 says:

    I’m so glad someone finally made this, but I can’t get it to work! What version of mame are you using? Newer versions of mame for some reason won’t run the apparently and the older versions (0.140) that do run crash upon loading the cheatfile for some reason.

    The error is like this:

    ssf2xj.xml(202): error parsing cheat expression “maincpu.ow@19D8=4EB9,

    and it keeps going with lines that look like the one.

    Anyone know what is going on or how I can get this to work at all?

  3. Don says:

    Just want to start off by saying this is absolutely great work, pof. Much appreciated.

    So how much more, if at all, are you going to be able to flesh out training mode? The reason I ask is because I was wondering if it’s possible to incorporate a cheat where you can program the CPU to reversal on wakeup or after an x amount of ticks so you can practice safe jumping and also option selects like T. Hawk’s DP install.

    Here are two videos from NeoRay9999 that illustrate what I had in mind. First video is safe jumping and the second is DP install off of ticks:

    Would something like this be feasible? I hope you’ll be able to expand upon it even further. As it stands, it has quickly become an invaluable tool for players of all skill levels and we have you to thank for that.

    • pof says:

      thanks for your comment, force the dummy to reversal DP/flask kick/super after a knock down and reversal throw after knock down or tick was the first things that Papasi asked me to do when he first saw my training mode cheats too. I’ve given it a few thoughts and tried different ways to possibly implement that, however i haven’t succeeded with the approaches I’ve taken (I’m a noob when it comes to m68k assembly). Maybe an easier way to do it is combining a rom cheat with some lua code in mame-rr, that way not everything has to be done in asm which is a major PITA. If some day I can come up with something useful don’t worry I’ll sure publish it :)

  4. Ernest says:

    Since I have read some people having problems using the cheats I tried to made short generic guide that might help:
    In order to install the cheats in mame you need to do two things. First, you need to create a zip file called with the xml files inside (some clients in mac require the file to be named instead). The zip file should be placed wherever your mame.exe file is in your programs folder (some clients in mac use the Application Support folder or similar).

    Second, you need to enable the cheats option in your mame client. If your mame client uses a graphical interface that option should be in the options or preferences menu. Otherwise, if you start your client by running mame.exe you need to run “mame.exe -cheat” from the command line. If you don’t want to use the command line in windows you can right click the mame.exe and create a shortcut, in the properties of that shortcut you can add -cheat to the target property and run that shortcut from now on. Also, check that you mame client is not too old or none of this will work.

Leave a Reply to TrickNachos2 Cancel reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>