Training dummy that do random mixup and punish your whiff

ShabroutShabrout Joined: Posts: 1,183 ✭✭✭

Comments

  • xelad1xelad1 Joined: Posts: 75
    Its a shame that I can't get the PC version to work on my comp (freezes everything on launch) this frankly looks amazing.
  • RikudouRikudou SF Name: "MasterOfStrings" Joined: Posts: 281
    THAT, gentlemen, is why PC will always be the best platform for gaming. Sounds friggin awesome!!!
    I also think tournaments should be held using pc versions, because it's the only platform that supports all controllers.
  • ShabroutShabrout Joined: Posts: 1,183 ✭✭✭
    I played 3 hours yesterday at my buddy's house on PS3 and damn the timing… I can pretty much go for a smock between cr:lp: st:hp: link. I never felt this frames difference more ever ! I can just do it without plinking and have to force me to wait wait and wait. So I missed all my FADC and link the whole time.
    I hope Pc timing is standard like Xbox is.
  • ShabroutShabrout Joined: Posts: 1,183 ✭✭✭
    This little app could probably be the solution to find every single unblock able a character have in this game.
    The limitations are the timing precision of the computer. running SF and another app that monitor inputs may produce lags and IMHO it does as the same script produce different inputs sometime like missed plink, frame droped, etc. (10%)
    It's maybe a matter of computer ability and may be different for every computer. This also is a serious limitation in portability of the script.
    I mean, the app try to mimic a frame perfect timer by storing in a variable, the time for 1 frame 16,... ms. In the script a 1 frame labs should be Wait(1) but it's not accurate and often you have to find the right number with try & error for the setup to work. If this issue depends on the computer my script that works for me may need adaptation to work for you and your own comp.

    Anyway back to subject, this is a great tool to search unblock able as it can redo at will any setup perfectly thus giving you an easy way to modify a frames there and there to find the working setup.

    this is the Ibuki corner unblock able, well it's the f.throw dash cr.MP jump MK setup mainly with timing to unblock able against Ibuki.
    ; Akuma f.throw in corner Dash cr.MP jump MK
    #include common.ahk
     
     
    do_the_setup()
    {
      Global
     
      Walk(forward, 30)
     
      Throw(forward)
      Wait(70)
     
      Dash(forward)
      Dash(forward)
      Wait(12)
     
      push(DOWN)
      push(backward)
      Wait(1)
     
      push(MP)
      Wait(1)
      push(LP)
      Wait(2)
      release(LP)
      release(MP)
      release(DOWN)
      release(backward)
      Wait(12)
     
      push(forward)
      push(UP)
      Wait(5)
      release(forward)
      release(UP)
      Wait(28)
     
      push(MK)
      Wait(2)
      release(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
    

    Contact me if you need help instaling and using this app.
  • ShabroutShabrout Joined: Posts: 1,183 ✭✭✭
    The Akuma basic f.throw dash x 2 j.mk setup for testing with perfect timings. Added OS tatsu and the follow up : cr.lk st.lk OS HK.
    #include common.ahk
     
    Akuma_F_Throw_Dash2_jumpMK_OS_Tatsu()
    {
      Global
    Walk(forward, 30)
     
    Throw(forward)
    Wait(85)
     
    Dash(forward)
    Wait(5)
    Dash(forward)
    Wait(10)
     
    Jump(forward)
    Wait(25)
    push(MK)
    Wait(5)
    release(MK)
    QC_X(backward, HK)
     
    push(DOWN)
    push(backward)
    Wait(2)
    push(LK)
    push(LP)
    Wait(2)
    release(LK)
    release(LP)
    release(DOWN)
    release(backward)
    Wait(15)
     
    push(LK)
    push(HK)
    Wait(2)
    release(LK)
    release(HK)
    }
     
    do_the_setup()
    {
      Global
    Akuma_F_Throw_Dash2_jumpMK_OS_Tatsu()
     
    }
     
    ; controls for Cancel and side selection
    2joy5::
      do_the_setup()
      return
     
    2joy9::
      Cancel := true
      return
     
    LEFT:: ; input keyboard left arrow key to tell the dummy where is the forward and thus the backward, it'll be the left here
      forward := LEFT
      backward := RIGHT
      return
     
    RIGHT:: ; or right if he should be facing the right side of the screen
      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() ; instantly switch the value of LEFT and RIGHT so the dummy do the moves on the right side. Usefull when your setup involve a cross up.
    {
      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) ; hit = "LP", "MP", "HK", etc. for ex , use "EXP" or "EXK"
    {
      Global
      push(DOWN)
      Wait(2)
      push(direction)
      Wait(2)
      release(DOWN)
      Wait(2)
      if(hit = "EXP")
      {
      push(LP)
        push(MP)
      }
      else if(hit = "EXK")
    {
      push(LK)
        push(MK)
      }
      else
      {
      push(hit)
      }
      Wait(2)
      release(direction)
      if(hit = "EXP")
      {
      release(LP)
        release(MP)
      }
      else if(hit = "EXK")
    {
      release(LK)
        release(MK)
      }
      else
      {
      release(hit)
      }
      Wait(6)
    }
    Jump(direction)
    {
      Global
      if(direction = "neutral")
      {
        push(UP)
        Wait(2)
        release(UP)
        Wait(2)
      }
      else
      {
        push(direction)
        push(UP)
        Wait(6)
        release(direction)
        release(UP)
        Wait(2)
      }
    }
    Throw(direction)
    {
      Global
      push(direction)
      push(LK)
      push(LP)
      Wait(5)
      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() ; this sweep is plinked by default
    {
      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) ; works for any shoryu motion with punches or kicks : "EXP" to do an ex with punches, "EXK" for ex kicks, "LP", "MP", "HK", etc, for normals.
    {
      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)
    }
    Teleport(direction, punch) ; punch = "punch" or "kick" to do the specified teleport.
    {
      Global
      push(direction)
      Wait(4)
      release(direction)
      push(DOWN)
      Wait(2)
      push(direction)
      Wait(2)
      if(punch = "kick")
      {
        push(LK)
        push(MK)
        push(HK)
      }
      else
      {
        push(LP)
        push(MP)
        push(HP)
      }
      release(direction)
      release(DOWN)
      Wait(2)
      if(punch = "kick")
      {
        release(LK)
        release(MK)
        release(HK)
      }
      else
      {
        release(LP)
        release(MP)
        release(HP)
      }
      Wait(2)
    }
    ULTRA_2X_QC_PPP(direction) ; clean double quarter circle ultra, don't use it for kara ultra like those involving super jump cancels.
    {
      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)
    }
     
    HC_forward(punch) ; "EXP" for ex punch, "EXK" for ex kick, "LP", "MP", "HK", etc for normals
    {
      Global
      push(backward)
      push(DOWN)
      Wait(2)
      release(backward)
      Wait(2)
      push(forward)
      Wait(2)
      release(DOWN)
      Wait(2)
      release(forward)
      if(punch = "EXP")
      {
        push(LP)
        push(MP)
      }
      else if(punch = "EXK")
      {
        push(LK)
        push(MK)
      }
      else
      {
        push(punch)
      }
      Wait(2)
      if(punch = "EXP")
      {
        release(LP)
        release(MP)
      }
      else if(punch = "EXK")
      {
        release(LK)
        release(MK)
      }
      else
      {
        release(punch)
      }
      Wait(2)
    }
     
    HC_backward(punch) ; "EXP" for ex punch, "EXK" for ex kick, "LP", "MP", "HK", etc for normal
    {
      Global
      push(forward)
      push(DOWN)
      Wait(2)
      release(forward)
      Wait(2)
      push(backward)
      Wait(2)
      release(DOWN)
      Wait(2)
      release(backward)
      if(punch = "EXP")
      {
        push(LP)
        push(MP)
      }
      else if(punch = "EXK")
      {
        push(LK)
        push(MK)
      }
      else
      {
        push(punch)
      }
      Wait(2)
      if(punch = "EXP")
      {
        release(LP)
        release(MP)
      }
      Wait(2)
      if(punch = "EXK")
      {
        release(LK)
        release(MK)
      }
      else
      {
        release(punch)
      }
      Wait(2)
    }
    
  • ShabroutShabrout Joined: Posts: 1,183 ✭✭✭
    Reminder : These scripts emulate a human typing keyboard keys so to make it works all you need is to set P1 or P2 to use the keyboard and check if the keyboard mapping in the controls option in game are the same as in the common.ahk file. If not edit those keys in common.ahk file.


    Demon anti air training during a fireball war
    #include common.ahk
     
    MIN_WALK_FRAMES := 5
    MAX_WALK_FRAMES := 20
     
    Fireball_War()
    {
      Global
      Random, Guess, 0, 10
      if(Guess > 3)
      QC_X(forward, HP)
      else
      QC_X(forward, "EXP")
      Wait(20)
    }
     
    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)
        Walk(backward, 5)
     
      ; Randomly throw fireballs
        if (Guess > 8) {
            Fireball_War()
        }
        else
        {
        Jump(forward)
        Wait(15)
        push(HK)
        Wait(4)
        release(HK)
        Wait(4)
        push(UP)
        Wait(30)
        release(UP)
        Wait(30)
        Dash(backward)
        Wait(14)
        Jump(backward)
        Wait(20)
        }
     
      ; Walk backward roughly the same distance, but modify
      ; the time because Ryu's backward speed is slower
      ; than his forward speed
        howLong += 20
        Walk(backward, howLong)
      }
    }
     
     
     
    ; Set Ruy's punish if we whiff a sweep. This is a stick HK, modify to your HK button if you're not using a stick
    2joy8::
      Wait(12)
      Sweep()
      return
     
     
    ; controls for Cancel and side selection
    2joy5:: ; the L1 button for a stick
      do_the_setup()
      return
     
    2joy9:: ; the Select button for a stick
      Run := "stop"
      return
     
    LEFT:: ; keyboard left arrow
      forward := LEFT
      backward := RIGHT
      return
     
    RIGHT:: ; keyboard right arrow
      forward := RIGHT
      backward := LEFT
      return
    

    So, 2joy8 is the user's HK button if you're playing with a keyboard ( like your dummy) set this to your HK, the same button you got in the common file there :
    http://imageshack.us/f/843/inputs.png
    http://imageshack.us/photo/my-images/843/inputs.png

    2joy5 is the L1 button and initiate the setup, modify to whatever you want but don't overwrite dummy or your controls, choose an un used key.

    2joy9 is the Select button on a stick, same thing as 2joy5, modify with another keyboard key is you don't have a stick. This button will stop the setup.

    Left and Right you shouldn't modify unless you use those arrow keys in your keyboard to play but I seriously doubt u do. They tell the dummy where you're at, on his left or right so he can fight and input the QCB and QCF to the right side for example, and jump in, etc.

    Those info are updated live during the setup you can switch side without stoping the setup, stop and redo the setup without closing and re launching the script.

    This is the common.ahk file. It contains a lot of predefined special moves not included in this anti air script.
    #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
    ; THE KEYBOARD KEYS MAPPING, NOT YOUR CONTROLS BUT THESE KEYS THE DUMMY WILL USE. ANY PLAYER, P1 or P2 THAT IS SET TO THIS KEYBOARD CONTROLS WILL BE CONTROLED BY THE SCRIPT.
    LEFT    := "q"
    RIGHT  := "d"
    UP    := "z"
    DOWN    := "s"
    LP      := "i"
    MP      := "o"
    HP      := "p"
    LK      := "k"
    MK      := "l"
    HK      := "m"
     
     
    Switch_side() ; instantly switch the value of LEFT and RIGHT so the dummy do the moves on the right side. Usefull when your setup involve a cross up.
    {
      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) ; hit = "LP", "MP", "HK", etc. for ex , use "EXP" or "EXK"
    {
      Global
      push(DOWN)
      Wait(2)
      push(direction)
      Wait(2)
      release(DOWN)
      Wait(2)
      if(hit = "EXP")
      {
      push(LP)
        push(MP)
      }
      else if(hit = "EXK")
    {
      push(LK)
        push(MK)
      }
      else
      {
      push(hit)
      }
      Wait(2)
      release(direction)
      if(hit = "EXP")
      {
      release(LP)
        release(MP)
      }
      else if(hit = "EXK")
    {
      release(LK)
        release(MK)
      }
      else
      {
      release(hit)
      }
      Wait(6)
    }
    Jump(direction)
    {
      Global
      if(direction = "neutral")
      {
        push(UP)
        Wait(2)
        release(UP)
        Wait(2)
      }
      else
      {
        push(direction)
        push(UP)
        Wait(6)
        release(direction)
        release(UP)
        Wait(2)
      }
    }
    Throw(direction)
    {
      Global
      push(direction)
      push(LK)
      push(LP)
      Wait(5)
      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() ; this sweep is plinked by default
    {
      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) ; works for any shoryu motion with punches or kicks : "EXP" to do an ex with punches, "EXK" for ex kicks, "LP", "MP", "HK", etc, for normals.
    {
      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)
    }
    Teleport(direction, punch) ; punch = "punch" or "kick" to do the specified teleport.
    {
      Global
      push(direction)
      Wait(4)
      release(direction)
      push(DOWN)
      Wait(2)
      push(direction)
      Wait(2)
      if(punch = "kick")
      {
        push(LK)
        push(MK)
        push(HK)
      }
      else
      {
        push(LP)
        push(MP)
        push(HP)
      }
      release(direction)
      release(DOWN)
      Wait(2)
      if(punch = "kick")
      {
        release(LK)
        release(MK)
        release(HK)
      }
      else
      {
        release(LP)
        release(MP)
        release(HP)
      }
      Wait(2)
    }
    ULTRA_2X_QC_PPP(direction) ; clean double quarter circle ultra, don't use it for kara ultra like those involving super jump cancels.
    {
      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)
    }
     
    HC_forward(punch) ; "EXP" for ex punch, "EXK" for ex kick, "LP", "MP", "HK", etc for normals
    {
      Global
      push(backward)
      push(DOWN)
      Wait(2)
      release(backward)
      Wait(2)
      push(forward)
      Wait(2)
      release(DOWN)
      Wait(2)
      release(forward)
      if(punch = "EXP")
      {
        push(LP)
        push(MP)
      }
      else if(punch = "EXK")
      {
        push(LK)
        push(MK)
      }
      else
      {
        push(punch)
      }
      Wait(2)
      if(punch = "EXP")
      {
        release(LP)
        release(MP)
      }
      else if(punch = "EXK")
      {
        release(LK)
        release(MK)
      }
      else
      {
        release(punch)
      }
      Wait(2)
    }
     
    HC_backward(punch) ; "EXP" for ex punch, "EXK" for ex kick, "LP", "MP", "HK", etc for normal
    {
      Global
      push(forward)
      push(DOWN)
      Wait(2)
      release(forward)
      Wait(2)
      push(backward)
      Wait(2)
      release(DOWN)
      Wait(2)
      release(backward)
      if(punch = "EXP")
      {
        push(LP)
        push(MP)
      }
      else if(punch = "EXK")
      {
        push(LK)
        push(MK)
      }
      else
      {
        push(punch)
      }
      Wait(2)
      if(punch = "EXP")
      {
        release(LP)
        release(MP)
      }
      Wait(2)
      if(punch = "EXK")
      {
        release(LK)
        release(MK)
      }
      else
      {
        release(punch)
      }
      Wait(2)
    }
    


    You can use it for your own script. Just copy past the Anti air script to another auk file you created and modify the functions. Never modify common.ahk unless you know what you're doing. The only thing you may wanna change is the value of the Wait(X) in any functions. Because on your computer the processor could be slower or faster resulting in some wrong timing in the setup. If the dummy do something to fast / slow, you stop the script, edit the Wait(X) where the problem is and relaunch the script to check it.

    To debug the setup in that matter inverse the P1 and P2 so the dummy is P1 with input showed on screen. And P2 set to Human if you want to take control of P2. It doesn't matter to play this training session to be P1 or P2 anyway, the only thing is only P1 will show inputs on screen.
  • ShabroutShabrout Joined: Posts: 1,183 ✭✭✭
Sign In or Register to comment.