     switch cannedTextName
       when 'MOVE_MISS', 'JUMP_KICK_MISS', 'MOVE_FAIL', 'IMMUNITY'
         @addSummary(cannedText)
-        setTimeout(done, 500)
+        setTimeout(done, 500 * @speed)
       when 'PARALYZE_CONTINUE', 'FREEZE_CONTINUE', 'SLEEP_CONTINUE',\
             'SUN_END', 'RAIN_END', 'SAND_END', 'HAIL_END',\
             'SAND_CONTINUE', 'HAIL_CONTINUE'

  returnToLobby: =>
    PokeBattle.navigation.focusLobby()

  $pokemon: (player, slot) =>
    if arguments.length == 1
      pokemon = player

    scale = (if front then 1.3 else 1/1.3)
    if moveName == 'Earthquake'
      $attacker.add($defender).each (index) ->
        $(this).transition(x: -75, 62.5 * @speed, 'easeInOutCubic')
          .transition(x: 75, 125 * @speed, 'easeInOutCubic')
          .transition(x: -30, 125 * @speed, 'easeInOutCubic')
          .transition(x: 30, 125 * @speed, 'easeInOutCubic')
          .transition(x: 0, 62.5 * @speed, 'easeInOutCubic')
      setTimeout(done, 500 * @speed)
    else if 'contact' in moveData.flags
      # Simple attack animation
      # Tackling the opponent
      $attacker
        .transition(x: dx - ax, y: dy - ay, scale: scale, 250 * @speed, 'in')
        .transition(x: 0, y: 0, scale: 1, 250 * @speed, 'out')
      $defender.delay(400 * @speed)
        .transition(x: (if front then -16 else 8), 50 * @speed, 'easeOutCubic')
        .transition(x: 0, 50 * @speed, 'easeInOutCubic')
      setTimeout(done, 500 * @speed)
    else if moveData['power'] > 0
      # Non-contact attacking move
      # Projectile
      $projectile = @$projectile(player, slot, moveData)
      [transX, transY] = [(dx - ax), (dy - ay)]
      $projectile
        .transition(x: transX / 2, y: transY / 2, scale: (scale + 1) / 2, 200 * @speed, 'easeOutCubic')
        .transition(x: transX, y: transY, scale: scale, 200 * @speed, 'easeOutCubic')
        .transition(opacity: 0, 100 * @speed, -> $projectile.remove())
      $defender.delay(400 * @speed)
        .transition(x: -4, 0, 'linear').delay(50 * @speed)
        .transition(x: 4, 0, 'linear').delay(50 * @speed)
        .transition(x: 0, 0, 'linear')
      setTimeout(done, 500 * @speed)
    else if player != targetPlayer || slot != targetSlot
      # This is a non-attacking move that affects another pokemon
      # S-shaped movement
      $projectile = @$projectile(player, slot, moveData)
      [transX, transY] = [(dx - ax), (dy - ay)]
      $projectile
        .transition(x: transX * 2 / 3, y: transY / 3, 150 * @speed, 'easeInOutSine')
        .transition(x: transX / 3, y: transY * 2 / 3, 100 * @speed, 'easeInOutSine')
        .transition(x: transX, y: transY, 150 * @speed, 'easeInOutSine')
        .transition opacity: 0, 100 * @speed, 'easeInOutSine', ->
          $projectile.remove()
      setTimeout(done, 500 * @speed)
    else
      # Side-to-side movement
      $attacker = @$sprite(player, slot)
      $attacker
        .transition(x: -16, 125 * @speed, 'easeInOutSine')
        .transition(x: 16, 250 * @speed, 'easeInOutSine')
        .transition(x: 0, 125 * @speed, 'easeInOutSine')
      setTimeout(done, 500 * @speed)

  cannedText: (cannedString, args...) =>
    @parseCannedText(CannedText[cannedString], args, ->)
