PC Players: Enhancing Training Mode using macro programs

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)
}


Thick throw / Cross up / low forward fireball Loop



; 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_Thick_Throw(approach)
{
  Global
  Walk(forward, approach)
  push(DOWN)
  push(backward)
  Wait(2)
  push(LP)
  Wait(2)
  release(LP)
  Wait(14)
  release(backward)
  release(DOWN)
  Wait(2)
  Walk(forward, 10)
  Throw(forward)
}
 
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(24)
  push(MK)
  Switch_side()
  Wait(12)
  release(MK)
}
 
 
 
do_the_setup()
{
 Global
 Run := "go"
  While(Run = "go")
  {
    Random, Guess, 0, 30
   ; Walk forward a random amount of time
    Random howLong, MIN_WALK_FRAMES, MAX_WALK_FRAMES
    Walk(forward, howLong)
 
   ; Randomly do cr.mk xx fireball
    if (Guess > 15) {
        push(backward)
        Wait(8)
        release(backward)
        Cr_MK_xx_Fireball(forward, HP)
        Wait(14)
    }
    else
    {
       if(Guess < 8)
       {
        ; Randomly do block string to Thick throw
         push(backward)
         Wait(6)
         release(backward) ; to avoid SRK instead of fireball
         Jabs_Thick_Throw(30)
         Wait(80)
       }
       else
       {
        Jabs_to_Cross_mk(30)
        push(DOWN)
        push(backward)
        Wait(2)
        push(LK)
        Wait(2)
        release(LK)
        Wait(18)
        push(LK)
        Wait(2)
        release(LK)
        Wait(18)
        push(LP)
        Wait(2)
        release(LP)
        release(DOWN)
        release(backward)
        Wait(18)
        Dash(backward)
       }
    }
       
   ; 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)
  }
}
 
 
 
; 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 is the same than previous post

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.

Akuma fool damage combo jump HK Hp fireball FADC x2 Tatsu sweep, with plink HP and sweep



; Akuma jump HK cl.HP xx Fireball FADC cl.HP FADC Fireball FADC cl.HP xx LK Tatsu Sweep
#include common.ahk
 
MIN_WALK_FRAMES := 5
MAX_WALK_FRAMES := 20
 
do_the_setup()
{
  Global
 
  Jump(forward)
  Wait(28)
  push(HK)
  Wait(2)
  release(HK)
 
  Wait(20)
  push(HP)
  Wait(1)
  push(MP)
  Wait(2)
  release(MP)
  release(HP)
  Wait(4)
 
  QC_X(forward, HP)
  Wait(10)
  FADC(forward)
 
  Wait(20)
  push(HP)
  Wait(1)
  push(MP)
  Wait(2)
  release(MP)
  release(HP)
  Wait(4)
 
  QC_X(forward, HP)
  Wait(10)
  FADC(forward)
 
  Wait(16)
  push(HP)
  Wait(1)
  push(MP)
  Wait(2)
  release(MP)
  release(HP)
  Wait(4)
 
  QC_X(backward, LK)
  Wait(43)
  Sweep()
}
 
 
 
 
 
; 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


The common.ahk updated



#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)
}
QC_X(direction, hit)
{
  Global
  push(DOWN)
  Wait(2)
  push(direction)
  Wait(2)
  release(DOWN)
  Wait(2)
  push(hit)
  Wait(2)
  release(direction)
  release(hit)
  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)
  Wait(2)
  push(HK)
  Wait(1)
  push(MK)
  Wait(2)
  release(MK)
  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)
  if(punch = "EXP")
  {
    push(LP)
    push(MP)
  }
  else if(punch = "EXK")
  {
    push(LK)
    push(MK)
  }
  else
  {
    push(punch)
  }
  release(direction)
  release(DOWN)
  Wait(2)
  if(punch = "EXP")
  {
    release(LP)
    release(MP)
  }
  else if(punch = "EXK")
  {
    release(LK)
    release(MK)
  }
  else
  {
    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)
}


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 only ever trusted this for leveling up my fishing prof…

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. :slight_smile:
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 ?

If I can figure out how to simulate keyboard actions in the Java system, I could write a nice DSL (domain specific language) in Groovy for this.



Ryu ryu = new Ryu()
ryu.hadoken(version: HP)
wait(50.frames)
ryu.jump(direction: forward)
wait(10.frames)
ryu.kick(version: HK)


would become even better if you would import all frame data, which could make the script intelligent like



Ryu ryu = new Ryu()
ryu.hadoken(version: HARD).and(shoryuken(version: MEDIUM))
walk(direction:forward, time: 120.frames)
ryu.kick(version: MEDIUM, stance: CROUCH).cancel(hadoken(version: MEDIUM))


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.

something like this ?
http://www.java-tips.org/java-se-tips/java.awt/how-to-use-robot-class-in-java.html

and

http://docs.oracle.com/javase/6/docs/api/java/awt/Robot.html

yep, I’ll look into it :slight_smile:

Is there any script for footsies and random jump ins? I would love to practice reaction demons to those.

Also I’m getting an error using your footsies ahk script. Gives me an error saying that Cr_Mk() is a nonexistent function.

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/ )

XSPR