WDS TX: Turbo and Better Macros
I’d like to announce two new exciting and commonly requested features for the DS TX software. Turbo and time based macros! The main DS TX documentation is here and this article assumes it has previously been read. You can download the update here
Turbo
Turbo is a feature common on many third party controllers. It allows you to hold down a button and have that button be rapid pressed over and over again. This can be useful to quickly go through long dialogue or spam an attack in a fighting game. It can also be useful to avoid repetitive strain injuries.
Usually turbo is restricted to one or two buttons; I’ve never seen turbo available for combos. However, turbo is a first class citizen on the DS TX so it can be used with any remapping or key combo just by adding the TURBO
keyword.
Example:
{
"UP": [ "DOWN", "A", "B", "TURBO" ],
"B": [ "B", "TURBO" ]
}
That configuration will press B
twice a second when B
is held down and Down
+ A
+ B
twice a second when Up
is held down.
Time Based Macros
The other feature is time based macros. This is significantly less common for third party controllers but the idea is that a sequence of inputs can be writtten down/recorded to play back later. The main use case is for automating tasks in games that may be slow or tedious. The following sequence of presses will release the Pokemon under the cursor in the Pokemon Emerald box for example.
A
DOWN
DOWN
DOWN
DOWN
A
UP
A
PAUSE
A
A
However, when configuring the DS TX, more detailed information is needed. We need to specify press and release including duration. Translating the above will give the following.
{
"SELECT": [ "MACRO" ],
"MACRO": [
[["LEFT"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["UP"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 130],
[["A"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8]
]
}
Breaking that config down. The select
button is mapped to trigger the macro. Then the macro is a list of keys to press and for how long to press them for. So the first four lines are saying:
- Press
left
for 8 frames - Press nothing for 8 frames (aka release
left
) - Press
A
for 8 frames - Press nothing for 8 frames.
Later on I have a “Press nothing for 130 frames” because a long delay is needed while an animation plays.
It may seem strange to use frames as the unit of time instead of seconds, however using frames gives the best control/highest precision since any smaller amount of delay is not possible. It’s also quite likely that the code will introduce a frame or two of delay so macros that demand frame perfect input may not be possible. I don’t actually know though, I’m not equipped to test them.
The table below gives a quick reference for various durations.
Time | Frames |
---|---|
1s | 60 |
0.5s | 30 |
16.66ms | 1 |
1m | 3600 |
Example Macro
Since you’ve read this far, you deserve a full macro! This config will release an entire box of Pokemon in Pokemon Emerald (it probably works in Ruby and Sapphire too but I didn’t test it) if you start with the cursor over the top left Pokemon in the box under the move menu. Always backup your save before running a potentialy dangerous macro, I’m not responsible for your save and can’t recover it for you :)
{
"SELECT": [ "MACRO" ],
"MACRO": [
[["A"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["UP"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 130],
[["A"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["RIGHT"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["UP"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 130],
[["A"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["RIGHT"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["UP"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 130],
[["A"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["RIGHT"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["UP"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 130],
[["A"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["RIGHT"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["UP"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 130],
[["A"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["RIGHT"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["UP"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 130],
[["A"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["UP"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 130],
[["A"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["LEFT"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["UP"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 130],
[["A"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["LEFT"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["UP"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 130],
[["A"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["LEFT"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["UP"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 130],
[["A"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["LEFT"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["UP"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 130],
[["A"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["LEFT"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["UP"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 130],
[["A"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["UP"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 130],
[["A"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["RIGHT"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["UP"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 130],
[["A"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["RIGHT"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["UP"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 130],
[["A"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["RIGHT"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["UP"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 130],
[["A"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["RIGHT"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["UP"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 130],
[["A"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["RIGHT"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["UP"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 130],
[["A"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["UP"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 130],
[["A"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["LEFT"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["UP"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 130],
[["A"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["LEFT"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["UP"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 130],
[["A"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["LEFT"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["UP"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 130],
[["A"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["LEFT"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["UP"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 130],
[["A"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["LEFT"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["UP"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 130],
[["A"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["UP"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 130],
[["A"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["RIGHT"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["UP"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 130],
[["A"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["RIGHT"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["UP"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 130],
[["A"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["RIGHT"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["UP"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 130],
[["A"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["RIGHT"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["UP"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 130],
[["A"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["RIGHT"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["DOWN"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8],
[["UP"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 130],
[["A"], 8],
[["NONE"], 8],
[["A"], 8],
[["NONE"], 8]
]
}