Instructions:

  1. Paste replay file contents into the text area below
  2. Select the player or players whose moves you'd like to extract from the dropdown list
  3. Click the "Add Moves" button to convert moves
  4. To add additional moves, click the "Add More" button, and repeat steps 1-3.
  5. When done, select all, and copy and paste your clipboard contents into a plain text editor and save as a .lua file.

--Ghost Trainer v.2 by Dafe
  --[[v.2.1 - Fixed loading game settings for first round - in a pinch, use a flag
    ]]--
  --[[v.2 - Added support for grips
          - Added option to display ghost source
          - Added option to load related game settings and mods
            - Loading game settings is ineffective in the first round, but works as expected thereafter
            - dev note: imported entire header string and frame numbers for semi future-proofing
    ]]--

--Options:
  --Announce source of the move sequence at the start of the match
  announceSource = true

  --Load relevant game settings (i.e. dojo size, engage distance, turnframes, etc.)
  loadSettings = true


math.randomseed(get_world_state().frame_tick)
firstRound = true;
Uke = {}

Uke.moveSet = {
}

Uke.metaFormat = {"matchframes", "turnframes", "", "", "", "flags", "engagedistance", "damage", "sumo", "mod", "", "dojosize", "dismemberthreshold", "fracturethreshold", "engageheight", "", "", "", ""}

function split(str)
  local ret = {}
  for w in string.gmatch(str, "[%w,._]+") do
    table.insert(ret, w)
  end
  return ret
end

function rollUke()
  Uke.randIndex = math.random(1, #Uke.moveSet)
end

function initUke()
  Uke.cursor = 1
  if Uke.randIndex == nil then
    rollUke()
  end
  for i=0, 19 do
    set_joint_state(1, i, 4)
  end
  --Reference move for current round
  activeMove = Uke.moveSet[Uke.randIndex]

  --Set up next round
  rollUke()

  if loadSettings then
    local settings = split(Uke.moveSet[Uke.randIndex].meta)
    for i=1, #Uke.metaFormat do
      if Uke.metaFormat[i] ~= "" then
        run_cmd("set " .. Uke.metaFormat[i] .. " " .. settings[i])
      end
    end
    if firstRound then
      firstRound = false
      run_cmd("lm " .. settings[10])
    end
    run_cmd("clear")
  end
  if announceSource then
    run_cmd("echo Loaded ghost - " .. activeMove.replay .. " - " .. activeMove.player)
  end
end

function randomMove()
  local activeStep = activeMove.sequence[Uke.cursor]
  if activeStep then
    if activeStep.move then
      for k, v in pairs(activeStep.move) do
        set_joint_state(1, v[1], v[2])
      end
    end
    if activeStep.grip then
      set_grip_info(1, BODYPARTS.L_HAND, activeStep.grip[1])
      set_grip_info(1, BODYPARTS.R_HAND, activeStep.grip[2])
    end
    Uke.cursor = Uke.cursor + 1
  end
end

add_hook("new_game", "initUke", initUke)
add_hook("exit_freeze", "moveUke", randomMove)