I duno if you already thought of doing this but I got tired of the Send syntax and I think the code is easier to read and debug with these PUSH and RELEASE functions :
push(button)
{
Global
Send {%button% down}
}
release(button)
{
Global
Send {%button% up}
}
Walk(direction, howLong)
{
Global
push(direction)
Wait(howLong)
release(direction)
Wait(2)
}
Dash(direction)
{
Global
push(direction)
Wait(2)
release(direction)
Wait(2)
push(direction)
Wait(2)
release(direction)
Wait(6)
}
It’s a good idea, but I rarely call Send in the main script anyway, and I don’t mind doing lower level calls in the common script because it’s not something I modify very often.
Alright, there’s the working version of the Ryu f.Throw Backdash j.HP/cross tatsu Setup, working both sides (you choose side with left and right keyboard arrows anytime during the session) and you launch the setup with the L1 button on your stick (4th punch)
; Ryu : cr.MK xx HP fireball xx FADC, LP Shoryu xx FADC, Ultra
#include common.ahk
MIN_WALK_FRAMES := 5
MAX_WALK_FRAMES := 20
do_the_setup()
{
Global
Random, Guess, 0, 1
Walk(forward, 50)
Throw(forward)
Wait(78)
Dash(backward)
Wait(25)
Jump(forward)
if (Guess = 1)
{
Wait(28)
push(HP)
Wait(2)
release(HP)
}
else
{
Wait(17)
Tatsu(backward, MK)
}
}
; controls for Cancel and side selection
2joy5::
do_the_setup()
return
2joy9::
Cancel := true
return
LEFT::
forward := LEFT
backward := RIGHT
return
RIGHT::
forward := RIGHT
backward := LEFT
return
and this is the common.ahk where I store the moves functions
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
SetKeyDelay 12 ; Not sure about usefullness
SendMode Input ; Not sure about usefullness
ONE_FRAME_IN_MS = 16.67
; Edit these following var with your own keyboard mapping for Street Fighter Keyboard
LEFT := "q"
RIGHT := "d"
UP := "z"
DOWN := "s"
LP := "i"
MP := "o"
HP := "p"
LK := "k"
MK := "l"
HK := "m"
Wait(frames)
{
Global
Letimer := frames * ONE_FRAME_IN_MS
Sleep, %Letimer%
}
push(button)
{
Global
Send {%button% down}
}
release(button)
{
Global
Send {%button% up}
}
Walk(direction, howLong)
{
Global
push(direction)
Wait(howLong)
release(direction)
Wait(2)
}
Dash(direction)
{
Global
push(direction)
Wait(2)
release(direction)
Wait(2)
push(direction)
Wait(2)
release(direction)
Wait(6)
}
FADC(direction)
{
Global
push(MP)
push(MK)
push(direction)
Wait(3)
release(direction)
Wait(2)
push(direction)
Wait(3)
release(direction)
release(MP)
release(MK)
}
Fireball(direction, punch)
{
Global
push(DOWN)
Wait(2)
push(direction)
Wait(2)
release(DOWN)
push(punch)
Wait(2)
release(direction)
release(punch)
Wait(6)
}
Tatsu(direction, kick)
{
Global
push(DOWN)
Wait(2)
push(direction)
Wait(2)
release(DOWN)
push(kick)
Wait(2)
release(direction)
release(kick)
Wait(6)
}
Jump(direction)
{
Global
if(direction = "neutral")
{
push(UP)
Wait(2)
release(UP)
Wait(2)
}
else
{
push(direction)
push(UP)
Wait(2)
release(direction)
release(UP)
Wait(2)
}
}
Throw(direction)
{
Global
push(direction)
push(LK)
push(LP)
Wait(2)
release(direction)
release(LK)
release(LP)
Wait(2)
}
Cr_MK_xx_Fireball(direction, punch)
{
Global
push(DOWN)
push(MK)
Wait(2)
push(direction)
Wait(2)
release(DOWN)
release(MK)
Wait(2)
push(punch)
release(direction)
Wait(4)
release(punch)
Wait(2)
}
SRK(direction, punch)
{
Global
push(direction)
Wait(4)
release(direction)
push(DOWN)
Wait(2)
push(direction)
Wait(2)
push(punch)
release(direction)
release(DOWN)
Wait(2)
release(punch)
Wait(2)
}
ULTRA_2X_QC_PPP(direction)
{
Global
push(DOWN)
Wait(2)
push(direction)
Wait(2)
release(DOWN)
Wait(2)
release(direction)
Wait(2)
push(DOWN)
Wait(2)
push(direction)
Wait(2)
release(DOWN)
Wait(2)
release(direction)
push(LP)
push(MP)
push(HP)
Wait(4)
release(LP)
release(MP)
release(HP)
Wait(6)
}
This is the Footsies training. Loop is cr:mk: or cr:mk: xx Fireball randomly, plus Ryu will punish your whiffed sweep if at range.
You can start and stop the dummy loop anytime, change the side with arrow keys anytime
; Ryu : cr.MK xx HP fireball Footsies training, try to Sweep his whiffed kicks
#include common.ahk
MIN_WALK_FRAMES := 5
MAX_WALK_FRAMES := 20
do_the_setup()
{
Global
Run := "go"
While(Run = "go")
{
; Walk forward a random amount of time
Random howLong, MIN_WALK_FRAMES, MAX_WALK_FRAMES
Walk(forward, howLong)
; Randomly do cr.mk
Guess := Mod(Round(howLong), 5)
If (Guess = 1) {
push(backward)
Wait(6)
release(backward) ; to avoid SRK instead of fireball
Cr_MK_xx_Fireball(forward, HP)
Wait(14)
}
; Walk backward roughly the same distance, but modify
; the time because Ryu's backward speed is slower
; than his forward speed
howLong += 6
Walk(backward, howLong)
; Randomly do cr.mk
Guess := Mod(Round(howLong), 4)
If (Guess = 0) {
Cr_MK()
Wait(14)
}
}
}
; Set Ruy's punish if we whiff a sweep
2joy8::
Wait(12)
Sweep()
return
; controls for start/stop and sides live switch
2joy5::
do_the_setup()
return
2joy9::
Run := "stop"
return
LEFT::
forward := LEFT
backward := RIGHT
return
RIGHT::
forward := RIGHT
backward := LEFT
return
the common.ahk file
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
SetKeyDelay 12 ; Not sure about usefullness
SendMode Input ; Not sure about usefullness
ONE_FRAME_IN_MS = 16.67
LEFT := "q"
RIGHT := "d"
UP := "z"
DOWN := "s"
LP := "i"
MP := "o"
HP := "p"
LK := "k"
MK := "l"
HK := "m"
Wait(frames)
{
Global
Letimer := frames * ONE_FRAME_IN_MS
Sleep, %Letimer%
}
push(button)
{
Global
Send {%button% down}
}
release(button)
{
Global
Send {%button% up}
}
Walk(direction, howLong)
{
Global
push(direction)
Wait(howLong)
release(direction)
Wait(2)
}
Dash(direction)
{
Global
push(direction)
Wait(2)
release(direction)
Wait(2)
push(direction)
Wait(2)
release(direction)
Wait(6)
}
FADC(direction)
{
Global
push(MP)
push(MK)
push(direction)
Wait(3)
release(direction)
Wait(2)
push(direction)
Wait(3)
release(direction)
release(MP)
release(MK)
}
Fireball(direction, punch)
{
Global
push(DOWN)
Wait(2)
push(direction)
Wait(2)
release(DOWN)
push(punch)
Wait(2)
release(direction)
release(punch)
Wait(6)
}
Tatsu(direction, kick)
{
Global
push(DOWN)
Wait(2)
push(direction)
Wait(2)
release(DOWN)
push(kick)
Wait(2)
release(direction)
release(kick)
Wait(6)
}
Jump(direction)
{
Global
if(direction = "neutral")
{
push(UP)
Wait(2)
release(UP)
Wait(2)
}
else
{
push(direction)
push(UP)
Wait(2)
release(direction)
release(UP)
Wait(2)
}
}
Throw(direction)
{
Global
push(direction)
push(LK)
push(LP)
Wait(2)
release(direction)
release(LK)
release(LP)
Wait(2)
}
Cr_MK()
{
Global
push(backward)
push(DOWN)
push(MK)
Wait(2)
release(MK)
release(backward)
release(DOWN)
}
Sweep()
{
Global
push(backward)
push(DOWN)
push(HK)
Wait(2)
release(HK)
release(backward)
release(DOWN)
}
Cr_MK_xx_Fireball(direction, punch)
{
Global
push(DOWN)
push(MK)
Wait(2)
push(direction)
Wait(2)
release(DOWN)
release(MK)
Wait(2)
push(punch)
release(direction)
Wait(4)
release(punch)
Wait(2)
}
SRK(direction, punch)
{
Global
push(direction)
Wait(4)
release(direction)
push(DOWN)
Wait(2)
push(direction)
Wait(2)
push(punch)
release(direction)
release(DOWN)
Wait(2)
release(punch)
Wait(2)
}
ULTRA_2X_QC_PPP(direction)
{
Global
push(DOWN)
Wait(2)
push(direction)
Wait(2)
release(DOWN)
Wait(2)
release(direction)
Wait(2)
push(DOWN)
Wait(2)
push(direction)
Wait(2)
release(DOWN)
Wait(2)
release(direction)
push(LP)
push(MP)
push(HP)
Wait(4)
release(LP)
release(MP)
release(HP)
Wait(6)
}
Another training dummy using AutoHotKey application, Footsies + Cross up, anti air training
The dummy will first ask you to set the side like in the other codes above so when you first start the loop by pushing the L1 button, don’t forget to push the keyboard arrow corresponding to the forward for the dummy. Then it will automatically update the side when he cross you up. And if for some reason he ends on the wrong side you can still force the sides using the arrow keys.
Select button cancels the loop, you may need to mash select a bit to register the command.
So the loop is walking back and forth trying to land a cr:mk: xx fireball / or rush to you with cr:lp: cr:lp:, cr:mp: xx fireball / or rush to you with cr:lp: cr:lp:, jump cross up :mk:
I could add a thick throw mixup but it’s already a lot of mix up for a training, I’ll put it in another file to train separately.
; Ryu : cr.MK xx HP fireball Footsies training, try to Sweep his whiffed kicks
#include common.ahk
MIN_WALK_FRAMES := 5
MAX_WALK_FRAMES := 20
; cr.jab x 2, cr.mk xx fireball
Jabs_to_ball(approach)
{
Global
Walk(forward, approach)
push(DOWN)
push(backward)
Wait(2)
push(LP)
Wait(2)
release(LP)
Wait(12)
push(LP)
Wait(2)
release(LP)
Wait(18)
push(MP)
Wait(1)
push(LP)
Wait(2)
release(backward)
release(MP)
release(LP)
Wait(2)
push(forward)
Wait(2)
release(DOWN)
Wait(2)
push(HP)
Wait(2)
release(forward)
release(HP)
}
Jabs_to_Cross_mk(approach)
{
Global
Walk(forward, approach)
push(DOWN)
push(backward)
Wait(2)
push(LP)
Wait(2)
release(LP)
Wait(12)
push(LP)
Wait(2)
release(LP)
Wait(12)
push(LP)
Wait(2)
release(LP)
Wait(22)
release(DOWN)
release(backward)
push(forward)
push(UP)
Wait(2)
release(forward)
release(UP)
Wait(28)
push(MK)
Switch_side()
Wait(12)
release(MK)
}
do_the_setup()
{
Global
Run := "go"
While(Run = "go")
{
; Walk forward a random amount of time
Random howLong, MIN_WALK_FRAMES, MAX_WALK_FRAMES
Walk(forward, howLong)
; Randomly do block string to fireball
Guess := Mod(Round(howLong), 5)
If (Guess = 1) {
push(backward)
Wait(6)
release(backward) ; to avoid SRK instead of fireball
Jabs_to_ball(30)
Wait(40)
}
; Walk backward roughly the same distance, but modify
; the time because Ryu's backward speed is slower
; than his forward speed
howLong += 6
Walk(backward, howLong)
; Randomly do cr.mk
Guess := Mod(Round(howLong), 4)
If (Guess = 0) {
Cr_MK_xx_Fireball(forward, HP)
Wait(14)
}
; Randomly do Cross UP
Guess := Mod(Round(howLong), 4)
If (Guess = 3) {
Jabs_to_Cross_mk(30)
Wait(14)
}
}
}
; Set Ruy's punish if we whiff a sweep
2joy8::
Wait(12)
Sweep()
return
; controls for Cancel and side selection
2joy5::
do_the_setup()
return
2joy9::
Run := "stop"
return
LEFT::
forward := LEFT
backward := RIGHT
return
RIGHT::
forward := RIGHT
backward := LEFT
return
common.ahk
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
SetKeyDelay 12 ; Not sure about usefullness
SendMode Input ; Not sure about usefullness
ONE_FRAME_IN_MS = 16.67
LEFT := "q"
RIGHT := "d"
UP := "z"
DOWN := "s"
LP := "i"
MP := "o"
HP := "p"
LK := "k"
MK := "l"
HK := "m"
Switch_side()
{
Global
if(forward = RIGHT)
{
forward := LEFT
backward := RIGHT
}
else
{
forward := RIGHT
backward := LEFT
}
}
Wait(frames)
{
Global
Letimer := frames * ONE_FRAME_IN_MS
Sleep, %Letimer%
}
push(button)
{
Global
Send {%button% down}
}
release(button)
{
Global
Send {%button% up}
}
Walk(direction, howLong)
{
Global
push(direction)
Wait(howLong)
release(direction)
Wait(2)
}
Dash(direction)
{
Global
push(direction)
Wait(2)
release(direction)
Wait(2)
push(direction)
Wait(2)
release(direction)
Wait(6)
}
FADC(direction)
{
Global
push(MP)
push(MK)
push(direction)
Wait(3)
release(direction)
Wait(2)
push(direction)
Wait(3)
release(direction)
release(MP)
release(MK)
}
Fireball(direction, punch)
{
Global
push(DOWN)
Wait(2)
push(direction)
Wait(2)
release(DOWN)
push(punch)
Wait(2)
release(direction)
release(punch)
Wait(6)
}
Tatsu(direction, kick)
{
Global
push(DOWN)
Wait(2)
push(direction)
Wait(2)
release(DOWN)
push(kick)
Wait(2)
release(direction)
release(kick)
Wait(6)
}
Jump(direction)
{
Global
if(direction = "neutral")
{
push(UP)
Wait(2)
release(UP)
Wait(2)
}
else
{
push(direction)
push(UP)
Wait(2)
release(direction)
release(UP)
Wait(2)
}
}
Throw(direction)
{
Global
push(direction)
push(LK)
push(LP)
Wait(2)
release(direction)
release(LK)
release(LP)
Wait(2)
}
Cr_MK()
{
Global
push(backward)
push(DOWN)
push(MK)
Wait(2)
release(MK)
release(backward)
release(DOWN)
}
Sweep()
{
Global
push(backward)
push(DOWN)
push(HK)
Wait(2)
release(HK)
release(backward)
release(DOWN)
}
Cr_MK_xx_Fireball(direction, punch)
{
Global
push(DOWN)
push(MK)
Wait(2)
push(direction)
Wait(2)
release(DOWN)
release(MK)
Wait(2)
push(punch)
release(direction)
Wait(4)
release(punch)
Wait(2)
}
SRK(direction, punch)
{
Global
push(direction)
Wait(4)
release(direction)
push(DOWN)
Wait(2)
push(direction)
Wait(2)
push(punch)
release(direction)
release(DOWN)
Wait(2)
release(punch)
Wait(2)
}
ULTRA_2X_QC_PPP(direction)
{
Global
push(DOWN)
Wait(2)
push(direction)
Wait(2)
release(DOWN)
Wait(2)
release(direction)
Wait(2)
push(DOWN)
Wait(2)
push(direction)
Wait(2)
release(DOWN)
Wait(2)
release(direction)
push(LP)
push(MP)
push(HP)
Wait(4)
release(LP)
release(MP)
release(HP)
Wait(6)
}
If I had time and was better at coding, I would probably make a “Script maker” that record inputs and create the corresponding .ahk file with timing and all.
It’s possible but would take a long time to cover all possibilities. Maybe I’ll give it a try later.
I’ve been trying to get this to work with MAME + Super Street Fighter 2 Turbo, but there has been a lack of success. Have you guys tested AutoHotkey with emulators at all?
I don’t get why it would not work as it’s only supposed to send the same info to the OS than a keyboard or stick, so as soon as your Emulator works with a keyboard and you use the same key map than your keyboard options in game, you should have no problem.
But that’s on paper, I never tried an emulator.
Hi everyone, XSPR here, I will use my time machine to go back in time and make this kind of thing, and call it TRUST
[media=youtube]Xs7a8xT-E-o[/media]
Yes, I’ve got it to work with FBA. I’ve tested the initital POC footsie script and it does work, but it needs needs some alteration because of game/emu timing etc. It’s a useful tool though, and there’s a lot of room for creativity.
TRUST was in fact the main influence of me investigating the use of macro programs with SSFIV (especially the example of punishing Guile’s sweep/mk) because no such things existed at the time.
I assume it’s normal I don’t get a clue what you’re talking about if I wasn’t a gamer the past 10 years.
Is this Trust a kind of advanced macro like it looks like ? Is this still available somewhere and worth the time if I don’t have those old SF games ?
could be more elegant, but it has possibilities. Still one would need to do a lot of experimentation to get the frames right, for example jumps look hard to me to get perfect.
Awesome work with it… the best parts of our community are made by ourselves.
(For more info on TRUST, more specific to ST, here’s how to get started: http://www.kuroppi.com/t-r-u-s-t/ )